Вложенные циклы Do в SAS

#loops #sas #do-loops

Вопрос:

Я пытаюсь понять, как вложить эти циклы, чтобы я мог генерировать некоторые многоуровневые данные. Однако я продолжаю получать сообщение об ошибке. Я действительно новичок в SAS, поэтому изо всех сил пытаюсь понять, как это исправить. Спасибо за любую помощь!

 %macro MLM; data x; call streaminit(525600); do rep=1 to 1000;    %do a=1 %to 4;  %if amp;a=1 %then %do; %let N=100; %end;  %if amp;a=2 %then %do; %let N=250; %end;  %if amp;a=3 %then %do; %let N=500; %end;  %if amp;a=4 %then %do; %let N=1000; %end;   do J=1 to amp;N;  u0= RAND('NORMAL',0,1);  w1= RAND('BERNOULLI',.5);    do I=1 to (10000/amp;N);    %do b = 1 %to 5;  %if amp;b=1 %then %do; %let e=RAND('NORMAL',0,1); %end;  %if amp;b=2 %then %do; %let e=RAND('UNIFORM'); %end;  %if amp;b=3 %then %do; %let e=RAND('CHISQUARE', amp;N-1); %end;  %if amp;b=4 %then %do; %let e=RAND('LOGNORMAL'); %end;  %if amp;b=5 %then %do; %let e=RAND('BETA',1,1); %end;   x1= RAND('BERNOULLI',.5);  b0 = 2.5  1*w1 u0;  b1 = 0.15;  y=b0 b1*x1 amp;e;  output;   %end;   end;  end;   %end; end;  %mend MLM; run; %MLM; run;    

Я хочу выполнить 1000 симуляций с 4 размерами выборки (a, N), затем сгенерировать N выборок, в ходе которых я хочу смоделировать 5 различных распределений ошибок. Итак, в конце концов, я должен получить общее количество образцов 1000x4x5.

Еще раз спасибо!

Комментарии:

1. Не могли бы вы предоставить дополнительную информацию о том, что говорится в ошибке? С первого взгляда на код — ëNORMALí выглядит неверно

2. ха-ха, это определенно какая-то странная ошибка копирования, я не знаю, как я это пропустил. Я сейчас все исправлю.

3. Я собираюсь проголосовать за то, чтобы закрыть это как опечатку. Код действительно работает так, как ожидалось, как только были исправлены «умные кавычки». Ожидаемое число, однако, не совсем правильное, но это не связано с ошибкой кода, это просто неправильно. (Вы получаете 1000x4x10000x5. Есть ли вероятность, что у вас также заканчивается диск с 200 миллионами строк? Он не безумно большой, но если ваш диск маленький…)

4. Также обратите внимание @therussman, что это не была «странная ошибка копирования» — в вашем коде есть умные кавычки, вероятно, вставленные из Outlook или Word или что-то в этом роде. Кавычки, которые являются извилистыми вместо «одинарных кавычек», которые являются просто прямыми линиями. Будут работать только «настоящие» цитаты!

5. Ты забываешь о 10000/N внутренней петле. В итоге получается 1000x4x10000x5, N «сложение» не имеет значения.

Ответ №1:

Удаление макро-логики и ее небольшое упрощение дает вам это, что, по-моему, работает правильно. Примечание. Я упростил N, чтобы он работал быстро. Обратите внимание, что я не проверяю логику, предполагая, что это правильно с вашей стороны.

 data x;  call streaminit(525600);   do rep=1 to 5;   do a=1 to 4;   if a=1 then  N=100;  else if a=2 then  N=250;  else if a=3 then  N=500;  else if a=4 then  N=1000;   do J=1 to N;  u0=RAND('NORMAL', 0, 1);  w1=RAND('BERNOULLI', .5);   do I=1 to (2000/N);   do b=1 to 5;   if b=1 then  e=RAND('NORMAL', 0, 1);  else if b=2 then  e=RAND('UNIFORM');  else if b=3 then  e=RAND('CHISQUARE', N-1);  else if b=4 then  e=RAND('LOGNORMAL');  else if b=5 then  e=RAND('BETA', 1, 1);      x1=RAND('BERNOULLI', .5);  b0=2.5  1*w1 u0;  b1=0.15;  y=b0 b1*x1 e;  output;  end;  end;  end;  end;  end;  run;