这适用于SAS代码
我的代码是:
%macro replicate (new, out, n);
data &out;
set &new;
%do i=1 %to &n-1;
data &out;
set &out &new;
if d <.22 then count +1;
run;
/ *使用此行调用宏* / %replicate(new,out,8);
这是数据集中的前几个观察结果(称为新的) 字段名称是通过...(所以注意d(在循环中提到)是第四个值)
相应的计数值为0,7,1,8,.....
关于此代码的目的,我正在教授统计课程,并试图最终表明,从长远来看,计数器总数应该根据概率定律(列D数字是随机生成的)数字来运行来自任意的例子。
我不知道如何计算。有人可以帮忙吗?
感谢
约翰
答案 0 :(得分:1)
为了理解发生了什么,我建议你摆脱宏逻辑,并逐步运行宏调用生成的代码,查看结果。
示例数据:
data new;
input d;
cards;
0.22
0.21
0.22
0.21
;
在循环之前你有:
68 data out;
69 set new;
70 put (d)(=);
71 run;
d=0.22
d=0.21
d=0.22
d=0.21
没什么特别的。在循环的第一次迭代中,您将引入计数器,并且它可以按预期工作:
3 data out;
74 set out new;
75 if d < .22 then count+1 ;
76 put (d count)(=);
77 run;
d=0.22 count=0
d=0.21 count=1
d=0.22 count=1
d=0.21 count=2
d=0.22 count=2
d=0.21 count=3
d=0.22 count=3
d=0.21 count=4
在循环的第二次迭代中注意,正在读入的数据中存在变量COUNT(SET语句中的work.OUT)。因此,对于前八个记录,count的现有值有条件地增加1。它不是一个新的柜台。如果您想要一个新计数器,可以将SET语句更改为set out(drop=count) new ;
所以&amp; i = 2循环的迭代看起来像:
79 data out;
80 set out new;
81 if d < .22 then count+1 ;
82 put (d count)(=);
83 run;
d=0.22 count=0
d=0.21 count=2
d=0.22 count=1
d=0.21 count=3
d=0.22 count=2
d=0.21 count=4
d=0.22 count=3
d=0.21 count=5
d=0.22 count=.
d=0.21 count=1
d=0.22 count=1
d=0.21 count=2
如果您继续重新提交该步骤,则在第7次迭代中,您将获得您在问题中声明的内容:
109 data out;
110 set out new;
111 if d < .22 then count+1 ;
112 put (d count)(=);
113 run;
d=0.22 count=0
d=0.21 count=7
d=0.22 count=1
d=0.21 count=8
d=0.22 count=2
d=0.21 count=9
d=0.22 count=3
d=0.21 count=10
d=0.22 count=.
d=0.21 count=6
d=0.22 count=1
d=0.21 count=7
d=0.22 count=.
d=0.21 count=5
d=0.22 count=1
d=0.21 count=6
d=0.22 count=.
d=0.21 count=4
d=0.22 count=1
d=0.21 count=5
d=0.22 count=.
d=0.21 count=3
d=0.22 count=1
d=0.21 count=4
d=0.22 count=.
d=0.21 count=2
d=0.22 count=1
d=0.21 count=3
d=0.22 count=.
d=0.21 count=1
d=0.22 count=1
d=0.21 count=2
我还不清楚你要做什么。这是一个奇怪的结构,不断覆盖work.out自己,自我追加。但是使用DATA步骤代码可以帮助显示正在发生的事情。