我正在教授SAS课程,并且正在尝试模拟。我目前正在尝试模拟棒球阵容。我对宏不是很强大,并且能够通过MUCH试验和错误以及此网站上的一些帮助来完成此代码。我希望有人能帮助我走到终点。
我的目标是能够正确使用计数器 我正在读取一个有9个观测值的数据集,并且有一个名为cutoff的变量(它是根据击球手确定命中的能力而使用的截止值,并将与randvar进行比较)。变量'order'只是为了让它更容易理解(请注意截止周期每9个击球员循环)。一旦三分之一出局(局内结束),Count_outs将出局重置为0。
我需要能够在这9个观察数据集中重复阅读,我所做的方式(前面有一些帮助)是创建一个名为'out'的数据集,我已附加到我的数据按照我下面的方式设置'orig'。
除了一些例外,一切都按照我的意愿行事。我希望一个计数器在27次出局时重置为0。
经过18次观察,它按照我的意愿工作,虽然第19次观察,但注意到第19次观察的缺失。所以,当然,我想要的是第19次(及以后)观察中有一个随机变量(从第19次观察开始缺少每第9次观察)以及相应地更新计数器。
另一个我认为应该是一个容易解决的问题是,计数不会在正确的位置下降。注意第一个观察的randvar = 0.18(小于截止值,这应该导致out并且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 :(得分: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;
这可以做你想要的(或多或少,你不提供样本数据,所以我无法测试)。不需要宏;您当然可以根据需要定义任意数量的宏变量(输入,输出等)。