安徽省五河县临北乡石家村卫生室 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 调用游程检验过程嵌入,本次已经加入;
/*https://bbs.pinggu.org/thread-194772-1-1.html&star=1*/
6 有兴趣者可以加入宏编辑进行大量重复抽样和检验,观察游程检验效果
宏嵌入可参阅/*http://cos.name/bbs/read.php?tid=13015&fpage=2*/,本次不在赘述。
警告!!!
1 不代表以后观点
2 保留揍癫狂者的权利
3 数据部分纯属虚构,如有雷同,纯属巧合;另外,初看可能复杂,我将随后粘一个简单、明确的上来。
鸣谢:
本次操作之初,呈经遭遇瓶颈问题,人大sushe1527兄弟热情帮助,再次表示衷心感谢!!!
https://bbs.pinggu.org/thread-395006-1-1.html
附件:本次操作程序
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;
/*https://bbs.pinggu.org/thread-194772-1-1.html&star=1*/
[此贴子已经被作者于2008-12-28 22:42:05编辑过]