SAS中文论坛
标题:
语法求救
[打印本页]
作者:
shiyiming
时间:
2004-12-21 13:45
标题:
语法求救
%let sampsize=100;
data tmp;
set sashelp.prdsale nobs=nobs;
retain _cnt_ 0;
if &sampsize > _cnt_ and ranuni(0) * (nobs + 1 -_N_) < (&sampsize - _cnt_) then do;
_cnt_+1;
output;
end;
drop _cnt_;
run;
有人可以帮我我这段程序注释一下么?特别是nobs=nobs在这里起什么作用。谢谢
作者:
shiyiming
时间:
2004-12-21 16:34
标题:
随机程序打假
本来初一看,我认为楼上的这个方式不是太好懂。
然后我在外面加了一层,试了1000次。看看结果出来的数据是不是UNIFORM分布的。
结果一看,的确是趋近于UNIFORM分布,然后再仔细一看,就明白了,呵呵,下面是测试的程序,如果哪位老兄有自己的抽样方式,把其中的一部分换成你的程序,运行一下,看看FREQ过程的结果,就可以知道自己的随机程序是否有效了,呵呵,机子慢的可以把MAIN里的1000改成200就差不多了,几十秒到几分钟运行时间吧。
data source;
do i=1 to 1000;
output;
end;
run;
%macro name(j);
tmp&j;
%mend;
%macro nameall(j);
%do m=1 %to &j;
tmp&m
%end;
%mend;
%macro main;
%do i=1 %to 1000;
%let sampsize=100;
data %name(&i);
set source nobs=nobs;
retain _cnt_ 0;
if &sampsize > _cnt_ and ranuni(0) * (nobs + 1 -_N_) < (&sampsize - _cnt_) then do;
_cnt_+1;
output;
end;
drop _cnt_;
run;
%end;
%mend;
%main;
data all;
set %nameall(1000);
run;
proc freq;
table i;
run;
作者:
shiyiming
时间:
2004-12-21 17:22
标题:
to yamasun
nobs=nobs中前一个nobs是系统变量,用于取得数据集描述中该数据集的总记录数。而后一个nobs只是普通变量,是将纪录总数赋给它,供以后程序使用。写颠倒了?没有!!!很奇怪的赋值方法,这就是SAS <!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->
你可以改成nobs=temp试一试,在以后的程序中调用temp变量,效果一样。
作者:
shiyiming
时间:
2004-12-21 23:46
标题:
大概的意思
if &sampsize > _cnt_ and ranuni(0) * (nobs + 1 -_N_) < (&sampsize - _cnt_) then do;
&sampsize > _cnt_:控制输出的OBS总数(100)
(nobs + 1 -_N_) :控制每次可以选择OBS的范围,也就是FIRSTOBS=1,LASTOBS=(nobs + 1 -_N_)
ranuni(0) * (nobs + 1 -_N_) :随机选择一个OBS
ranuni(0) * (nobs + 1 -_N_) < (&sampsize - _cnt_):是否符合条件,如果符合,则输出
另外,NOBS=NOBS这种情况还是比较常见的,因为有些人推荐的一种编程规则就是把保留字赋值给相同的名字,这样容易知道这个变量的用处和来源。
to:ahuige
我不是很懂统计,请教一下。你的程序是否想证明这样产生的OBS 随机的,还是相反?
多谢
作者:
shiyiming
时间:
2004-12-22 00:10
标题:
呵呵
我一开始时是想证明这个不是严格的均匀分布随机。
因为从直觉上我认为可能最后几位被选中的机会更大。
因为程序可能会有几个值跳得太后面,到了后面为了达到个数,不得不取后面的所有值。
但是我重复了成千上万次,次数越大越均匀。
看来是正确的。从理论上应该和多人抽签的效果差不多。
先抽后抽概率一样。
只是我没有去想怎么从数学上证明。
最近没时间,在编DELPHI的程序。
BTW:你上面的注释,有一个我不太同意
{anuni(0) * (nobs + 1 -_N_) :随机选择一个OBS }这不是随机选择obs,这里是对当前的值是否输出进行判断,输出的概率按照 还要抽取的个数/还余下的记录数,这样就保证了余下的记录被抽出的概率是相等的。
作者:
shiyiming
时间:
2004-12-22 00:26
标题:
多谢指教
因为我用下面的程序对您产生的ALL DATASET进行了一下分析,所以有此一问,
多谢
proc univariate data=all plot;
var i;
freq i;
run;
作者:
shiyiming
时间:
2004-12-22 19:05
标题:
高手啊!
不知道我是不是找错论坛了,呵呵。
看了大家的对话,有种摸不着北的感觉,差距很大的讲。
但我相信只是现在,谢谢大家对这个问题的热心解答。谢谢!
作者:
shiyiming
时间:
2004-12-29 15:31
标题:
回复
以上几位的讨论令我受益匪浅,最后看到楼主似乎对问题尚未清楚,再做一解释:
该程序从prdsale中随机抽取100条记录作为样本,
其中:
nobs=nobs 是将prdsale数据集中的记录总数赋予变量nobs,等号右边的nobs只要是正常的命名的变量即可。
if &sampsize > _cnt_ and ranuni(0) * (nobs + 1 -_N_) < (&sampsize - _cnt_) then do; /*_N_,它的值为数据步循环数*/
_cnt_+1;
output;
end;
其他语句的解释参见以上各位的,已经非常详细了。
大家主要在探讨按照此种方法的抽样结果是否随机
作者:
shiyiming
时间:
2004-12-29 21:34
标题:
谢谢goldencredit!
goldencredit谢谢你的答疑,前几天刚刚上手sas编程感到不是太习惯。现在慢慢的熟悉了,也有一点感觉了。所以这段程序还是明白了。还是要谢谢你的解释!
作者:
shiyiming
时间:
2012-7-23 11:38
标题:
Re: 语法求救
Mark
欢迎光临 SAS中文论坛 (http://www.mysas.net/forum/)
Powered by Discuz! X3.2