SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2093|回复: 9
打印 上一主题 下一主题

语法求救

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-12-21 13:45:27 | 只看该作者

语法求救

%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在这里起什么作用。谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-12-21 16:34:40 | 只看该作者

随机程序打假

本来初一看,我认为楼上的这个方式不是太好懂。
然后我在外面加了一层,试了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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-12-21 17:22:42 | 只看该作者

to yamasun

nobs=nobs中前一个nobs是系统变量,用于取得数据集描述中该数据集的总记录数。而后一个nobs只是普通变量,是将纪录总数赋给它,供以后程序使用。写颠倒了?没有!!!很奇怪的赋值方法,这就是SAS <!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->

你可以改成nobs=temp试一试,在以后的程序中调用temp变量,效果一样。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-12-21 23:46:42 | 只看该作者

大概的意思

if &amp;sampsize &gt; _cnt_ and ranuni(0) * (nobs + 1 -_N_) &lt; (&amp;sampsize - _cnt_) then do;


&amp;sampsize &gt; _cnt_:控制输出的OBS总数(100)
(nobs + 1 -_N_) :控制每次可以选择OBS的范围,也就是FIRSTOBS=1,LASTOBS=(nobs + 1 -_N_)
ranuni(0) * (nobs + 1 -_N_) :随机选择一个OBS
ranuni(0) * (nobs + 1 -_N_) &lt; (&amp;sampsize - _cnt_):是否符合条件,如果符合,则输出

另外,NOBS=NOBS这种情况还是比较常见的,因为有些人推荐的一种编程规则就是把保留字赋值给相同的名字,这样容易知道这个变量的用处和来源。


to:ahuige

我不是很懂统计,请教一下。你的程序是否想证明这样产生的OBS 随机的,还是相反?
多谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-12-22 00:10:26 | 只看该作者

呵呵

我一开始时是想证明这个不是严格的均匀分布随机。
因为从直觉上我认为可能最后几位被选中的机会更大。
因为程序可能会有几个值跳得太后面,到了后面为了达到个数,不得不取后面的所有值。
但是我重复了成千上万次,次数越大越均匀。
看来是正确的。从理论上应该和多人抽签的效果差不多。
先抽后抽概率一样。
只是我没有去想怎么从数学上证明。
最近没时间,在编DELPHI的程序。
BTW:你上面的注释,有一个我不太同意
{anuni(0) * (nobs + 1 -_N_) :随机选择一个OBS }这不是随机选择obs,这里是对当前的值是否输出进行判断,输出的概率按照 还要抽取的个数/还余下的记录数,这样就保证了余下的记录被抽出的概率是相等的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2004-12-22 00:26:31 | 只看该作者

多谢指教

因为我用下面的程序对您产生的ALL DATASET进行了一下分析,所以有此一问,
多谢

proc univariate data=all plot;
var i;
freq i;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2004-12-22 19:05:47 | 只看该作者

高手啊!

不知道我是不是找错论坛了,呵呵。

看了大家的对话,有种摸不着北的感觉,差距很大的讲。

但我相信只是现在,谢谢大家对这个问题的热心解答。谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2004-12-29 15:31:51 | 只看该作者

回复

以上几位的讨论令我受益匪浅,最后看到楼主似乎对问题尚未清楚,再做一解释:
该程序从prdsale中随机抽取100条记录作为样本,
其中:
nobs=nobs 是将prdsale数据集中的记录总数赋予变量nobs,等号右边的nobs只要是正常的命名的变量即可。
if &amp;sampsize &gt; _cnt_ and ranuni(0) * (nobs + 1 -_N_) &lt; (&amp;sampsize - _cnt_) then do; /*_N_,它的值为数据步循环数*/
_cnt_+1;
output;
end;

其他语句的解释参见以上各位的,已经非常详细了。
大家主要在探讨按照此种方法的抽样结果是否随机
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2004-12-29 21:34:20 | 只看该作者

谢谢goldencredit!

goldencredit谢谢你的答疑,前几天刚刚上手sas编程感到不是太习惯。现在慢慢的熟悉了,也有一点感觉了。所以这段程序还是明白了。还是要谢谢你的解释!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2012-7-23 11:38:39 | 只看该作者

Re: 语法求救

Mark
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-4 00:16 , Processed in 0.106252 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表