sasstability

SAS: How can I test the stability of a value among time


I have this database:

data temp;
input ID monitoring_date score ;
  datalines;
 1 10/11/2006   0      
 1 10/12/2006   0      
 1 15/01/2007   1      
 1 20/01/2007   1
 1 20/04/2007   1

 2 10/08/2008   0        
 2 11/09/2008   0        
 2 17/10/2008   1        
 2 12/11/2008   0 

 3 10/12/2008   0 
 3 10/08/2008   0        
 3 11/09/2008   0        
 3 17/10/2009   1        
 3 12/12/2009   1    
 3 05/01/2010   0  

 4 10/12/2006   0 
 4 10/08/2006   0        
 4 11/09/2006   0        
 4 17/10/2007   0        
 4 12/12/2007   0    
 4 09/04/2008   1  
 4 05/08/2008   1

 5 10/12/2013   0 
 5 03/09/2013   0        
 5 11/09/2013   0        
 5 19/10/2014   0        
 5 10/12/2014   1    
 5 14/01/2015   1  

 6 10/12/2017   0 
 6 10/08/2018   0        
 6 11/09/2018   0        
 6 17/10/2018   1        
 6 12/12/2018   1    
 6 09/04/2019   1  
 6 25/07/2019   0
 6 05/08/2019   1
 6 15/09/2019   0
 ;

I would like to create a new database with a new column where I note, for each ID, the date of the first progression of the score from 0 to 1 and if this progression is stable at least 3 months until at the end of monitoring else date_progresion = . :

data want;
input ID   date_progression;
  datalines;
 1            15/01/2007
 2            .
 3            .
 4            09/04/2008
 5            .
 6            .
 ;

I really have no idea to code this and I would like to get the wanted data to generate a cox model where the progression (Yes/No) is my event. I am really stuck !

Thank you in advance for your help!


Solution

  • A DOW loop can process the ID groups, tracking for a single active run of 1s. A run has a start date and duration.

    Example:

    data want;
      do _n_ = 1 by 1 until (last.id);
        set have;
        by id;
    
        select;
          when (pscore = 0 and score = 1) do; state = 1; start = date; dur = 1; end;
          when (pscore = 1 and score = 1) do; state = 2;               dur + 1; end;
          when (pscore = 1 and score = 0) do; state = 3; start = .;    dur = .; end;
          when (pscore = 0 and score = 0) do; state = 4;                        end;
          otherwise;
        end;
    
        pscore = score;
      end;
    
      if state = 2 and dur >= 3 then progression_date = start;
    
      keep ID progression_date;
      format progression_date yymmdd10.;
    run;