王笑权 安徽省五河县临北乡石家村卫生室 233316 wxq1638@yahoo.com.cn 在实际的统计和科学研究中,常常想了解得到的一序列数据是否随机,虽然SPSS等软件有菜单 操作方法,并可以被复制为代码使用,但是其输出亢烦,格式固定,其检验方法不具延伸性。且 其中算法细节又不能被人知道,无法根据具体情况灵活编程和按要求输出。而相关sas的游程检验 法至今未见。为了填补sas空缺,为了可以了解具体算法和将来编程的灵活使用,现在将本人昨天 晚上编写的sas代码公布。 通过以往的学习经验可知:游程检验依赖的是位次关系,而与具体数值无关,因此不论变量下 的属性如何,关键需要知道位次编号,便可以进行随机性检验,显然这也正是sas强大编程能力易于 发挥的地方。但是,这种情况仍然需要一定的假定情况,那就是总体的个数N。由于编程的灵活性, 在sas中N可以按想象的可能情况填数,显然若样本已经抽取n个单位且编号固定,那么样本的随机性 必依赖总体N的个数在一定范围。故,这种情况下N应当为有限总体,不需要太大、太小的假设过多 。当然,如果n中各观察单位的位次不确定,那么对N无特别要求,都有可能是随机,或不随机的。 所以,编程的思路显然需要按前一种进行。 本次sas算法思路:1 假设有一个总体N ;抽取一个样本n1,剩余部分叫n2,本次sas简单抽样部分; 2 对n1,n2采取同样要求操作:该序列中位次不连续的孤胆观测记为1,位次上 增量为1的连续观测记其最小、最大者,后取其最大者并记录连续的个数本次sas操作中的反复递增、 递减排序及if指令过程; 3 将经过2操作的n1、n2数据洗涤出来,用merge合并到一起,此时sas中两组 数据相对应的部分恰是在位次上最接近的单数,此时数据已经洗涤成功; 4 普通算法+if 达到目的; 5 调用游程检验过程嵌入,本次已经加入; /*http://www.pinggu.org/bbs/dispbbs.asp?boardid=68&id=194772&star=1*/ 6 有兴趣者可以加入宏编辑进行大量重复抽样和检验,观察游程检验效果 宏嵌入可参阅/*http://cos.name/bbs/read.php?tid=13015&fpage=2*/,本次不在赘述。 警告!!! 1 不代表以后观点 2 保留揍癫狂者的权利 3 数据部分纯属虚构,如有雷同,纯属巧合;另外,初看可能复杂,我将随后粘一个简单、明确的上来。 鸣谢:本次操作之初,呈经遭遇瓶颈问题,人大sushe1527兄弟热情帮助,再次表示衷心感谢!!! http://www.pinggu.org/bbs/dispbbs.asp?BoardID=68&ID=395006&replyID=&skin=1 附件:本次操作程序 data c;n=100;do b=1 to n;output;end;proc sort;by b;run; proc sql;create table wxq1638 as select *, normal(0) as wxq168 from c order by wxq168;run; data c1;set wxq1638(obs=38);x=b;proc sort;by b;run; data a;merge c c1;by b;keep g b x;if x=b then g=1;if x=. then g=0;run; data a1;set a(rename=(x=x1 g=g1 b=b1));where g1=1;if dif(b1)>1 then d1=1;proc sort;by b1;run; data aa1;set a1;proc sort;by descending b1;run; data a2(keep=g1 b1);set aa1;if dif(b1)<-1 then d11=1;if d1=. & d11=. | d1= 1 & d11=. then delete; keep g1 b1;proc sort;by b1;run; data b1;set a(rename=(x=x2 g=g2 b=b2));where g2=0;if dif(b2)>1 then d1=1;proc sort;by b2;run; data bb1;set b1;proc sort;by descending b2;run; data b2(keep= g2 b2);set bb1;if dif(b2)<-1 then d11=1;if d1=. & d11=. | d1= 1 & d11=. then delete; proc sort;by b2;run; data wxq;merge a2 b2;if b1>b2 then f1=b1-b2; if b1<b2 then f1=b1-lag(b2); if b2>b1 then f2=b2-b1;if b2<b1 then f2=b2-lag(b1); if _n_=1 & f1=. then f1=b1; if _n_=1 & f2=. then f2=b2;bb1=b1;if bb1=. then bb1=b2;bb1=dif(bb1);if b1=. then f2=bb1; bb2=b2;if bb2=. then bb2=b1;bb2=dif(bb2);if b2=. then f1=bb2;keep b1 f1 b2 f2; proc means sum n;var f1;output out=d1 sum=s1 n=n1; proc means data=wxq sum n;var f2;output out=d2 sum=s2 n=n2; data d2;merge d1 d2;r=n1+n2;u=2*s1*s2/(s1+s2)+1;/*游程平均数*/ ss=sqrt(2*s1*s2*(2*s1*s2-s1-s2)/((s1+s2)**2*(s1+s2-1)));/*游程标准差*/ z=abs((r-u)/ss);p=(1-probnorm(z))*2;proc print;var z p;run; /*[url]http://www.pinggu.org/bbs/dispbbs.asp?boardid=68&id=194772&star=1*/
王笑权 SAS 系统 2008年12月28日 星期日 下午09时04分35秒 1 MEANS 过程 分析变量:f1 总和 N ------------------ 38.0000000 25 ------------------ SAS 系统 2008年12月28日 星期日 下午09时04分35秒 2 MEANS 过程 分析变量:f2 总和 N ------------------ 62.0000000 25 ------------------ SAS 系统 2008年12月28日 星期日 下午09时04分35秒 3 Obs z p 1 0.40126 0.68823