王笑权
按权重抽样的可能性程序
安徽省五河县临北乡石家村卫生室 王笑(孝)权 2008年12月7日 23:28
前两天本人将自己编造的常用抽样SAS程序上传到了人大,遗憾的是当时并没有倾向性抽样的程序,比如按照一定的意愿抽样,使我们的目标观测有最大的抽中机会。这种偏心眼儿的抽样程序似乎在网上或杂志上还看不到,基于补缺的心理,本人今晚拼了性命试验性编造程序如下,以求抛砖引玉,共同学习、促进。
%macro w(m1,m2);
%do w=1 %to &m1;
%do wx=1 %to &m2;
data a;
do x=1 to 10; /*假设了10个观测*/
output;end;
data aa;
set a;
do i= 10 to x by -1;/*赋予权重*/
output;end;
proc sql;
create view w1 as select *,normal(0) as k from aa
order by calculated k;
data b(keep=x);set w1(obs=1); /*指定挑选个数,可以是多个*/
proc append base=ww&w force; /*将抽出按损序存入各数据集中*/
data xx&w&wx;set ww&w; /*进入数据洗涤阶段*/
proc sort;by x;%end;
data wxq16&w;set xx&w&m2;/*数据洗涤成功*/
proc append base=wxq1638;
%end;proc freq data=wxq1638;table x;proc print;run;
%mend w(m1,m2);
%w(5,100); /*有条件者运行大数观察*/
天晚了,本人要睡大觉了,具体思路,程序过程请见本人在程序中稍作的注解和解释。
运行一下结果见此截屏图。
由此可见:这个程序可以完成权重抽样过程。
data a;
do x=1 to 10; /*假设了10个观测*/
output;end;
data aa;
set a;
do i= 10 to x by -1;/*赋予权重*/
output;end;
proc sql;
create view w1 as select *,normal(0) as k from aa
order by calculated k;
data b(keep=x);set w1(obs=1);
proc print;run;
警告:
(1)文中内容为本人抽空所写,因业务繁忙,其中可能有不完善处,只代表当时见解。
(2)不知道网上是否有类似内容,如有雷同,纯属巧合。
(3)企图因本贴无故兴奋者如:过度癫痫发作、对暗示疗法不买账的歇斯底里、汗、晕、抓狂等等新潮表情过于亢奋者,
我要立马将其头揍扁。
(4)本贴热烈欢迎捧场架势者。
hexm26
老王呀,我很想明白,你做这个程序的目的是什么?什么叫“按权重抽样”?它的实际用途是什么?
我试着把你的程序运行了一下,根本什么都看不到,SAS在那里死循环了。我不是来捣乱的,你别揍我。 我这次真的很想知道你在做什么。
abel
参考下sas中抽样的proc就ok了,差不多的方法人家都已经提供了
王笑权
[quote]引用第1楼hexm26于2008-12-10 11:13发表的“”:
老王呀,我很想明白,你做这个程序的目的是什么?什么叫“按权重抽样”?它的实际用途是什么?
我试着把你的程序运行了一下,根本什么都看不到,SAS在那里死循环了。我不是来捣乱的,你别揍我。 我这次真的很想知道你在做什么。[/quote]
兄弟!我刚才复制后运行一下,没有发生死循环现象。你那机子在躲懒吧。看看
SAS 系统 2008年12月11日 星期四 下午07时00分31秒 1
FREQ 过程
累积 累积
x 频数 百分比 频数 百分比
-----------------------------------------------
1 96 19.20 96 19.20
2 80 16.00 176 35.20
3 60 12.00 236 47.20
4 63 12.60 299 59.80
5 63 12.60 362 72.40
6 52 10.40 414 82.80
7 35 7.00 449 89.80
8 22 4.40 471 94.20
9 24 4.80 495 99.00
10 5 1.00 500 100.00
目的吗:就是在第二个数据集赋想象值,通过笛卡儿乘积模式干涉第一个数据集,使其中原来的各观测被扩大不同倍数。最终原数据集各观测被随机抽中的几率带倾向性。
报告完毕!!!
王笑权
日志大的过于惊人,本坛一筐盛不下。我粘一点给你看看。
NOTE: Copyright (c) 2002-2003 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) 9.1 (TS1M3 DBCS3054)
Licensed to Demo SID, Site 0047162208.
NOTE: 该会话正在执行,平台: XP_PRO
NOTE: SAS 初始化所用时间:
实际时间 9.15 秒
CPU 时间 0.92 秒
1 %macro w(m1,m2);
2 %do w=1 %to &m1;
3 %do wx=1 %to &m2;
4 data a;
5 do x=1 to 10; /*假设了10个观测*/
6 output;end;
7 data aa;
8 set a;
9 do i= 10 to x by -1;/*赋予权重*/
10 output;end;
11 proc sql;
12 create view w1 as select *,normal(0) as k from aa
13 order by calculated k;
14 data b(keep=x);set w1(obs=1); /*指定挑选个数,可以是多个*/
15 proc append base=ww&w force; /*将抽出按损序存入各数据集中*/
16 data xx&w&wx;set ww&w; /*进入数据洗涤阶段*/
17 proc sort;by x;%end;
18 data wxq16&w;set xx&w&m2;/*数据洗涤成功*/
19 proc append base=wxq1638;
20 %end;proc freq data=wxq1638;table x;proc print;run;
21 %mend w(m1,m2);
WARNING: 已忽略宏定义 W 的 %MEND 语句中的无关信息。
22 %w(5,100);
NOTE: 数据集 WORK.A 有 10 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.28 秒
CPU 时间 0.00 秒
NOTE: 从数据集 WORK.A 读取了 10 个观测。
NOTE: 数据集 WORK.AA 有 55 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.00 秒
…………
………………
…………………………
NOTE: 数据集 WORK.A 有 10 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.00 秒
CPU 时间 0.00 秒
NOTE: 从数据集 WORK.A 读取了 10 个观测。
NOTE: 数据集 WORK.AA 有 55 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.00 秒
NOTE: SQL 视图 WORK.W1 已定义。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.00 秒
NOTE: 从数据集 WORK.AA 读取了 55 个观测。
NOTE: 从数据集 WORK.W1 读取了 1 个观测。
NOTE: 数据集 WORK.B 有 1 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.03 秒
CPU 时间 0.03 秒
NOTE: 正在追加 WORK.B 至 WORK.WW5。
NOTE: 从数据集 WORK.B 读取了 1 个观测。
NOTE: 添加了 1 个观测。
NOTE: 数据集 WORK.WW5 有 100 个观测和 1 个变量。
NOTE: “PROCEDURE APPEND”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.01 秒
NOTE: 从数据集 WORK.WW5 读取了 100 个观测。
NOTE: 数据集 WORK.XX5100 有 100 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.00 秒
NOTE: 从数据集 WORK.XX5100 读取了 100 个观测。
NOTE: 数据集 WORK.XX5100 有 100 个观测和 1 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.01 秒
NOTE: 从数据集 WORK.XX5100 读取了 100 个观测。
NOTE: 数据集 WORK.WXQ165 有 100 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.00 秒
NOTE: 正在追加 WORK.WXQ165 至 WORK.WXQ1638。
NOTE: 从数据集 WORK.WXQ165 读取了 100 个观测。
NOTE: 添加了 100 个观测。
NOTE: 数据集 WORK.WXQ1638 有 500 个观测和 1 个变量。
NOTE: “PROCEDURE APPEND”所用时间(总处理时间):
实际时间 0.00 秒
CPU 时间 0.00 秒
NOTE: 从数据集 WORK.WXQ1638 读取了 500 个观测。
NOTE: “PROCEDURE FREQ”所用时间(总处理时间):
实际时间 0.15 秒
CPU 时间 0.00 秒
NOTE: 从数据集 WORK.WXQ1638 读取了 500 个观测。
NOTE: “PROCEDURE PRINT”所用时间(总处理时间):
实际时间 0.03 秒
CPU 时间 0.00 秒
王笑权
[quote]引用第2楼abel于2008-12-10 13:09发表的“”:
参考下sas中抽样的proc就ok了,差不多的方法人家都已经提供了[/quote]
是sas 帮助?
还是什么教材阿?
hexm26
目的吗:就是在第二个数据集赋想象值,通过笛卡儿乘积模式干涉第一个数据集,使其中原来的各观测被扩大不同倍数。最终原数据集各观测被随机抽中的几率带倾向性。
还是不明白你在说什么。。。 算了,隔行如隔山,反正我的机器也运行不出什么东西,就此做罢。。。
hexm26
[quote]引用第2楼abel于2008-12-10 13:09发表的“”:
参考下sas中抽样的proc就ok了,差不多的方法人家都已经提供了[/quote]
据我的了解,SAS / Base和STAT里面只有MULTTEST等少数程序中有抽样的选项,难道真有专门的抽样程序吗?
王笑权
ok!
ding一下,方便
朋友看看。
qmax
proc surveyselect 不可以用吗?
当然可能data步效率高一些。
王笑权
[quote]引用第9楼qmax于2009-01-22 17:50发表的“”:
proc surveyselect 不可以用吗?
当然可能data步效率高一些。[/quote]
老弟有此资料吗?
能否给我看看,
wxq1638@yahoo.com.cn
ok
xie xie!