BookmarkSubscribeRSS Feed
desireatem
Pyrite | Level 9

Hello, I am trying to compute S using the data with variable N and time. See example below. My code below does not work:

N       time           S

1         2           2     S[1]=time

1          5          5-2         = time[i+1]-time

1          7          7-5         = time[i+1]-time

2          5            5    S[1]=time

2         7            7-5    = time[i+1]-time

2          8           8-7    = time[i+1]-time

2        10          10-8    = time[i+1]-time

3         1            1

3         7          7-1

3         9          9-7

3        9           9-9

proc iml;

use simulate1_&u;

read all  var{N time } into DM;

close;

time = DM[,2]; N = DM[,1];

n = nrow(DM);

   

TT=J(nrow(time),1,1);

do i = 1 to n;

if i=1 then S=time;                    

else if 1 < i < =n  then S=time[i+1]-time;

end;

create kaplann_&u var{time N S };

append;

quit;

4 REPLIES 4
Rick_SAS
SAS Super FREQ

There are several ways to do this.  If the N variable is unsorted, you could use the UNIQUE-LOC technique. I assume the data are sorted by N, in which case it is more efficient to use the UNIQUEBY technique.

There is no need to loop over the observations to compute time-time[i-1]. Instead you can use the DIF function.

data a;
input N time @@;
datalines;
1 2 1 5 1 7 2 5 2 7 2 8 2 10 3 1 3 7 3 9 3 9
;

proc iml;
use A;
read all var{N time};  /* assume data sorted by N */
close;

nobs = nrow(time);
S = J(nobs,1,.);
b = uniqueby(N, 1);   /* b = beginning of i_th category */
b = b // (nrow(N)+1); /* trick: append (n+1) to end of b */

do i = 1 to nrow(b)-1;      
   idx = b:(b[i+1]-1);    /* Find observations in i_th level */
   S[idx] = dif(time[idx]);  /* DIF of time steps */
   S[idx[1]] = time[idx[1]]; /* replace missing with 1st time */
end;

print S;

desireatem
Pyrite | Level 9

My data is simulated data, so it not fixed. That was just an example. I think I can fix your code to work with my simulation.

Rick_SAS
SAS Super FREQ

If you read the articles, they describe how to handle other cases, such as unsorted data.

desireatem
Pyrite | Level 9

I tried to modify your code to to both sum and diffrence but it does not work:

proc iml;

use simulate1_&u;

read all  var{TIME OLF SURVIVAL1} into DM;

close;

SURVIVAL1 = DM[,3]; OLF = DM[,2]; TIME = DM[,1];

n = nrow(DM);

   

segment = J(nrow(DM),1,1); *print segment;

SS=J(nrow(time),1,1);

nobs = nrow(time);

Survival1  = J(nobs,1,.);

a = uniqueby(time , 1);   /* a = beginning of i_th category */

a = a // (nrow(time )+1); /* trick: append (n+1) to end of a */

do i = 1 to nrow(a)-1;      

   idx = a:(a[i+1]-1);    /* Find observations in i_th level */

   SS[idx] = sum(survival1[idx]);  /* sum of time steps */

   SS[idx[1]] = survival1[idx[1]]; /* replace missing with 1st survival1 */

TT=J(nrow(survival1),1,1);

nobs = nrow(survival1);

Survival1  = J(nobs,1,.);

b = uniqueby(Survival1 , 1);   /* b = beginning of i_th category */

b = b // (nrow(Survival1 )+1); /* trick: append (n+1) to end of b */

do i = 1 to nrow(b)-1;      

   idx = b:(b[i+1]-1);    /* Find observations in i_th level */

   TT[idx] = dif(time[idx]);  /* DIF of time steps */

   TT[idx[1]] = time[idx[1]]; /* replace missing with 1st time */

end;

create kaplann_&u var{time OLF survival1 SS TT };

append;

quit;

sas-innovate-2024.png

 

Time is running out to save with the early bird rate. Register by Friday, March 1 for just $695 - $100 off the standard rate.

 

Check out the agenda and get ready for a jam-packed event featuring workshops, super demos, breakout sessions, roundtables, inspiring keynotes and incredible networking events. 

 

Register now!

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.

From The DO Loop
Want more? Visit our blog for more articles like these.
Discussion stats
  • 4 replies
  • 897 views
  • 0 likes
  • 2 in conversation