【问题标题】:Nested Do Loops in SASSAS 中的嵌套 Do 循环
【发布时间】:2021-12-22 16:31:50
【问题描述】:

我试图弄清楚如何嵌套这些循环,以便生成一些多级数据。不过,我不断收到错误消息。我对SAS真的很陌生,所以我正在努力弄清楚如何解决这个问题。感谢您的帮助!

%macro MLM;
data x;
call streaminit(525600);
do rep=1 to 1000;
 
    %do a=1 %to 4;
    %if &a=1 %then %do; %let N=100; %end;
    %if &a=2 %then %do; %let N=250; %end;
    %if &a=3 %then %do; %let N=500; %end;
    %if &a=4 %then %do; %let N=1000; %end;

        do J=1 to &N;
        u0= RAND('NORMAL',0,1);
        w1= RAND('BERNOULLI',.5);
         
            do I=1 to (10000/&N);
    
                %do b = 1 %to 5;
                %if &b=1 %then %do; %let e=RAND('NORMAL',0,1); %end;
                %if &b=2 %then %do; %let e=RAND('UNIFORM'); %end;
                %if &b=3 %then %do; %let e=RAND('CHISQUARE', &N-1); %end;
                %if &b=4 %then %do; %let e=RAND('LOGNORMAL'); %end;
                %if &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+&e;
                output; 
                %end; 
            end;
        end; 
    %end;
end; 
%mend MLM; run; %MLM; run;
        

我想运行 1000 次模拟,使用 4 个样本大小(a,N),然后生成 N 个样本,在此期间我想模拟 5 种不同的误差分布。所以,最后,我应该得到 1000x4x5 的总样本。

再次感谢!

【问题讨论】:

  • 您能否提供有关错误内容的更多信息?从最初的代码来看 - ëNORMALí 看起来不正确
  • 哈哈这绝对是某种奇怪的复制错误,我不知道我是怎么错过的。我现在就修。
  • 我将投票关闭这个作为一个错字。修复“智能引号”后,代码实际上可以按预期工作。预期的数字虽然不太正确 - 但这与代码错误无关,它只是错误的。 (你得到 1000x4x10000x5。有没有可能你也用完了 2 亿行的磁盘?它不是特别大,但如果你的磁盘很小......)
  • 另请注意@therussman 这不是“奇怪的复制错误” - 您的代码中有智能引号,可能是从 Outlook 或 Word 或其他内容粘贴的。弯曲的引号而不是只是直线的“单引号”。只有“真实”的引号才有效!
  • 您忘记了10000/N 内部循环。它最终是 1000x4x10000x5,N“加法”无关紧要。

标签: loops sas do-loops


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多