turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Find a Community

- Home
- /
- SAS Programming
- /
- Base SAS Programming
- /
- Simulating time-varying covariates

Topic Options

- RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

12-28-2015 09:09 PM

Hi,

I am trying to simulate a longitidunal data with time-varying variables but I am having some trouble. The code seems to be fine but it's not yielding an ouput (i.e. it runs forever). The problem arise when I use the do while statements. Basically when Yt = 1, no records are included for that individual from time t + 1 onwards. For instance, if for individuals with Y1 =1, there should be no record available (L2, A2 and Y2 will be missing).

Can someone help me fix the code. Thank you

Data test;

Call streaminit(234);

do id = 1 to 1000;

U = rand("normal",0, 0.25);

L0 = rand("normal", 5.5 + U, 0.04);

A0 = rand("Bernoulli", expit(5 - L0));

L1 = rand("normal",0.9*L0 + A0 + 0.1*U, 0.01);

A1 = rand("bernoulli", expit(A0 + 4.5*L1));

Y1 = rand("bernoulli", expit(-8 + L0 - 0.3*(A0) - U));

do while (Y1=0);

L2 = rand("normal",0.9*L1 + A1 + 0.1*U, 0.01);

A2 = rand("bernoulli", expit(A1 + 4.5*L2)) ;

Y2 = rand("bernoulli", expit(-8 + L1 - 0.3*(A0 + A1) - U));

end;

do while (Y2=0);

Y3 = rand("bernoulli", expit(-8 + L2 - 0.3*(A0 + A1 + A2) - U));

end;

output;

end;

run;

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to SimRock

12-28-2015 09:18 PM

In your do while loops you never change the variable that causes you to enter the loop (Y1, Y2) so you'll never exit the loop if you enter it.

If Y1=0, you enter the loop, never change Y1 and are stuck...

do while (Y1=0);

L2 = rand("normal",0.9*L1 + A1 + 0.1*U, 0.01);

A2 = rand("bernoulli", expit(A1 + 4.5*L2)) ;

Y2 = rand("bernoulli", expit(-8 + L1 - 0.3*(A0 + A1) - U));

end;

If Y1=0, you enter the loop, never change Y1 and are stuck...

do while (Y1=0);

L2 = rand("normal",0.9*L1 + A1 + 0.1*U, 0.01);

A2 = rand("bernoulli", expit(A1 + 4.5*L2)) ;

Y2 = rand("bernoulli", expit(-8 + L1 - 0.3*(A0 + A1) - U));

end;

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to SimRock

12-29-2015 05:09 PM

Thank you Reeza, that was really helpful

So do you think I could do something like this.

Data test;

Call streaminit(234);

do id = 1 to 1000;

U = rand("normal",0, 0.25);

L0 = rand("normal", 5.5 + U, 0.04);

A0 = rand("Bernoulli", expit(5 - L0));

L1 = rand("normal",0.9*L0 + A0 + 0.1*U, 0.01);

A1 = rand("bernoulli", expit(A0 + 4.5*L1));

Y1 = rand("bernoulli", expit(-8 + L0 - 0.3*(A0) - U));

if (Y1=0) then do;

L2 = rand("normal",0.9*L1 + A1 + 0.1*U, 0.01);

A2 = rand("bernoulli", expit(A1 + 4.5*L2)) ;

Y2 = rand("bernoulli", expit(-8 + L1 - 0.3*(A0 + A1) - U));

end;

if (Y2=0) then do;

Y3 = rand("bernoulli", expit(-8 + L2 - 0.3*(A0 + A1 + A2) - U));

end;

output;

end;

run;

However, it does not seem to quite work because people with Y1=1 still have records for L2, A2, Y2, which does not makes sense.

Can you share your wisdom once more

Thanks

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to SimRock

12-29-2015 09:02 PM

You may also notice the values are the same as the previous record. Because there is no data set, there is no output and reinitialization of the PDV.

You need to set them to missing at the top of the loop. I recommend the call missing routine.

You need to set them to missing at the top of the loop. I recommend the call missing routine.

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to Reeza

12-29-2015 11:39 PM

Thank you very much Reeza. It worked out well. Now I am trying to automate the process by using functions like arrays, but I am having a bit of trouble. I want it to go from t=0 to t=9 for variabes A and L. For the Y variables, I would like it to go from t=1 to t=10.Could you provide some guidance.

Data sim;

Call streaminit(234);

array A{0:9} A0-A9; array L{0:9} L0-L9 ; array Y{1:10} Y1-Y10;

do id = 1 to 100;

do t=0 to 1;

U = rand("normal",0, 0.25);

L{0} = rand("normal", 5.5 + U, 0.04);

A{0} = rand("Bernoulli", expit(5 - L{0}));

L{1} = rand("normal",0.9*L{0} + A{0} + 0.1*U, 0.01);

A{1} = rand("bernoulli", expit(A{0} + 4.5*L{1}));

Y{1} = rand("bernoulli", expit(-8 + L{0} - 0.3*(A{0}) - U));

end;

do t=2 to 8;

if (Y{t-1}=0) then do;

L{t} = rand("normal",0.9*L{t-1} + A{t-1} + 0.1*U, 0.01);

A{t} = rand("bernoulli", expit(A{t-1} + 4.5*L{t})) ;

Y{t} = rand("bernoulli", expit(-8 + L{t-1} - 0.3*sum(of A{0} to A{t-1}) - U));

end; else do L{t}=.; A{t}=.; Y{t}=.; end;

end;

t=9;

if (Y{t}=0) then do;

Y{t+1} = rand("bernoulli", expit(-8 + L{t} - 0.3*sum(of A{0} to A{t}) - U));

end; else do Y{t+1}=.; end;

output;

end;

run;