2017-08-08 91 views
0

我正在教SAS课程,并且在模拟中涉及了一些内容。我目前正在模拟棒球阵容。我在宏中不是很强大,并且能够通过这个网站上的许多试验和错误以及一些帮助来执行此代码。我希望有人能帮助我走向终点。SAS宏内部的计数器/循环

我在这里的目标是能够与计数器正常工作。
我在具有9周的观察,并具有可变截止称为一个数据组读出(它是根据面糊来确定命中与否和将被比作randvar的能力所使用的截止值)。 “顺序”这个变量只是为了让它更容易遵循(注意,每9个击球手切换循环)。 Count_outs在三分之一输出结束后将输出重置为0(结局)。

我需要能够在这9个观测数据集中重复读取,而且我已经做到了这一点(在此之前的一些帮助下)的方法是创建一个名为'out'的数据集,并将其附加到我的数据集'orig'以我下面的方式。

一切正常,因为我想除了一些例外。我想要一个计数器,在27次输出后重置为0。

18后的观察,它的作品,因为我想它,虽然19观察,记下19观察missings。所以,当然,我想要的是第19次(和下一次)的观测有一个随机变量(它从第19次观测开始,每9次观测就缺少一次),并相应更新计数器。

其他问题,我认为应该是一个简单的办法是,数右脚不下车。注意第一个观测值有一个randvar = 0.18(小于截止值,这应该导致一个输出并且count = 1,但是它在那之后正确地工作了,我已经尝试了修改这几十次)。任何人都可以帮忙吗?

非常感谢

%macro replicate(new,out,n)/des=’&out is &new repeated &n times.’; 
    Data & out; 
    Set &new; 
    %do i=1 %to &n; 
    Data &out; 
     randvar=uniform(1); 
     if randvar<cutoff then do; 
     count+1; 
     count_outs+1; 
     end; 
     set &out &new; 
     if count_outs=3 then count_outs=0; 
     if count=28 then do; 
     set &new; 
     count=1; 
     end; 
    run; 
    run; 
    %end; 
%mend; 

注:我尝试显示输出,但不能正确格式化。

+0

如果你的问题更具通用性,它会有所帮助。由于棒球不是我来自的“事物”,我对此知之甚少,所以很难理解你的问题。你能提供样本数据和期望的输出吗?这就是说,这段代码看起来很奇怪。看起来你在数据步骤中放置了一个数据步骤,这没有什么意义。另外我会假设你的第一个'data & out;'声明在这里输入错误,你的意思是数据&out;' – user2877959

+0

感谢你的回应。我确实得到了答案 – GKJohn

回答

1

您使用的宏的方式实际上并非必要或不恰当。宏只是写SAS代码 - 所以不要把任何东西写入不合法的宏中,除非它在前面有%

在这里,你有这样的结构:

data out; 
    set in; 
    data out; 
    set in out; 
    run; 
run; 

这显然是行不通的,对吗?外部数据/集合将快速结束,然后内部数据将运行。

在任何情况下,你不需要做任何的这种做你的模拟。你可以在宏观之外做一切事情。

data out; 
    call streaminit(7);   *seed better random number engine; 
    do pointvar = 1 by 1 until (outs=27); *iterate starting at 1 and stop when 27 outs; 
    randvar = rand('Uniform'); *better random number engine; 
    if pointvar > 9 then pointvar=1;  *reset to 1 if over 9; 
    set in point=pointvar;  *pull the row we need; 
    if randvar < cutoff then do; 
     outs+1; 
     outs_inning+1; 
    end; 
    output; 
    if outs_inning=3 then outs_inning=0; 
    end; 
    stop; 
run; 

这就是你想要的(或多或少,你不提供样本数据,所以我不能测试)。不需要宏;你可以自定义任意数量的宏变量(用于输入,输出等)。

+0

同意。如果你在教SAS课程,我只会教SAS,而不是宏语言。在你的学生学会了很多SAS之后,他们可以自己学习宏语,或者在第二课中学习。 – Quentin

+0

你好乔(和昆汀)谢谢你的回复。这实际上只是一些学生想要看的东西(就像我一样),因为我们已经以概率的方式讨论了模拟(p值等)。 Joe,我为了截取的九个数字是.74,.73,.75,.70,.76,.78,.75,.72,.76。我试过你的代码,它似乎挂着,可以这么说。让它运行10分钟或更长时间。有些东西似乎不对。你能在这里测试吗?对不起,我在这里比较新。有没有办法用数字发送文件,以便让其他人更容易地运行它们?再次感谢John – GKJohn

+0

@GJJhn需要一个“停止”;最后,我忽略了这一点。 – Joe