楼主: harlon1976
2912 15

如何实现这个要求的程序编写 [推广有奖]

  • 2关注
  • 27粉丝

版主

院士

54%

还不是VIP/贵宾

-

威望
1
论坛币
33781 个
通用积分
135.1232
学术水平
25 点
热心指数
39 点
信用等级
17 点
经验
59249 点
帖子
1928
精华
0
在线时间
4352 小时
注册时间
2005-8-27
最后登录
2025-12-9

楼主
harlon1976 发表于 2010-7-24 21:36:51 |AI写论文
50论坛币
假设现在又数据集A,只含有变量X,观测个数为10个,首先采用有放回抽样的方式抽取10个观测,(当然有些观测可能多次被抽取,有的可能一次都没有被抽取)形成数据集为A1,把这个过程进行比如20次,依次吧这些数据集记为A2,A3.....A20。现在的要求是:如何找出这20个数据集中不包含某个观测,比如说就A1而言,如何判断他是否含有第1、第2。。。 第10个观测,对这20个都进行判断,然后把不包含第一个观测的数据集合在一起形成一个新的数据集,把不包含第二个观测的数据集合在一起形成一个新的数据集,等等一直进行到把不包含第10个观测的数据集合在一起形成一个新的数据集。谢谢指教。

关键词:程序编写 如何实现 数据集 在一起 程序 编写

回帖推荐

jingju11 发表于3楼  查看完整内容

没有在sas上试运行,如果有错误可以改改。 思路是:把原始数据重复20次,重复的次序可用为抽样的分层。所以经过放回性的分层抽样(层数20),即相当于对原始数据抽样20次。在抽样输出中,不包含某某观测,等于每一层中包含其他的观测的数目为10.比如如果数据不包括观测1,即为包括2,3, ---, 10 的观测数为总观测数(此为10)。两个宏只是方便书写,没有重复运算的功能。最后的数据是result1.。。result10, 其中result1为不包括 ...

本帖被以下文库推荐

沙发
hguanyu 发表于 2010-7-24 21:44:14
!!!!!!!!!!!!!!!!!!!
努力才是未来

藤椅
jingju11 发表于 2010-7-24 23:22:03
  1. data have;
  2.   do _n = 1 to 10;
  3.     x = round(100*ranuni(1)); output;
  4.     end;
  5. run;
  6. data have1;
  7.   set have;
  8.   do s = 1 to 20; output;
  9.     end;
  10. run;
  11. proc sort; by s _n; run;
  12. proc surveyselect data = have1 out = have2(keep = s _n x)
  13.                   method = urs n = 10 seed = 2;
  14.   strata s;
  15. run;
  16. data have3;
  17.   do until(last.s);
  18.     set have2; by s;
  19.     array nc(10);
  20.     do _n_ = 1 to 10;
  21.       nc[_n_] = sum(nc[_n_], _n ne _n_);
  22.     end;
  23.   end;
  24.   do until(last.s);
  25.     set have2; by s;
  26.     output;
  27.   end;
  28. run;
  29. %macro _1mcr; %local i;
  30.   %do i = 1 %to 10;
  31.     result&i
  32.   %end;
  33. %mend _1mcr;
  34. %macro _2mcr; %local i;
  35.   %do i = 1 %to 10;
  36.     if nc&i = 10 then output result&i;
  37.   %end;
  38. %mend _2mcr;
  39. data %_1mcr;;
  40.   set have3;
  41.   %_2mcr
  42. run;
  43. *note: result1 is the dataset not cotaining observation 1,and so on;
复制代码
没有在sas上试运行,如果有错误可以改改。
思路是:把原始数据重复20次,重复的次序可用为抽样的分层。所以经过放回性的分层抽样(层数20),即相当于对原始数据抽样20次。在抽样输出中,不包含某某观测,等于每一层中包含其他的观测的数目为10.比如如果数据不包括观测1,即为包括2,3, ---, 10 的观测数为总观测数(此为10)。两个宏只是方便书写,没有重复运算的功能。最后的数据是result1.。。result10, 其中result1为不包括原观测1的数据。。。其中,s为抽样顺序(层), _n为原观测的顺序标记,x即为原观测。
已有 1 人评分学术水平 热心指数 收起 理由
crackman + 1 + 1 呵呵

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

板凳
crackman 发表于 2010-7-25 00:34:59
data crackman;
do i=1 to 10;
x=ranuni(10);
output;
end;
format x f8.2;
run;
%macro crackman1;
%do n=1 %to 10;
proc sql noprint;
select _name_ into:name separated by " "  from tb where col&n.=.;
quit;
data B&n.;
set &name.;
run;
%end;
%mend crackman1;
%macro crackman(seed);
%do k=1 %to 20;
proc surveyselect data=crackman  method=urs n=10 seed=%eval(&seed.*&k.) out=A&k. noprint;
run;
proc sort data=A&k. out=A&k.;
by i;
run;
data B&k.;
merge crackman(drop=x) A&k.(rename=(x=A&k.) drop=NumberHits);
by i;
run;
%end;
data B;
merge b1-b20;
by i;
run;
proc transpose data=B(drop=i) out=TB;
var _all_;
run;
%crackman1;
%mend crackman;
%crackman(55);
/*对程序有异议的欢迎交流*/

报纸
crackman 发表于 2010-7-25 00:35:14
答案在B1-B20里面

地板
jingju11 发表于 2010-7-25 00:45:20
crackman 发表于 2010-7-25 00:35
答案在B1-B20里面
应该是10个数据集啊

7
crackman 发表于 2010-7-25 01:10:35
是B1-B10

8
crackman 发表于 2010-7-25 01:10:52
data crackman;
do i=1 to 10;
x=ranuni(10);
output;
end;
format x f8.2;
run;
%macro crackman1;
%do n=1 %to 10;
proc sql noprint;
select _name_ into:name separated by " "  from tb where col&n.=.;
quit;
data C&n.;
set &name.;
run;
%end;
%mend crackman1;
%macro crackman(seed);
%do k=1 %to 20;
proc surveyselect data=crackman  method=urs n=10 seed=%eval(&seed.*&k.) out=A&k. noprint;
run;
proc sort data=A&k. out=A&k.;
by i;
run;
data B&k.;
merge crackman(drop=x) A&k.(rename=(x=A&k.) drop=NumberHits);
by i;
run;
%end;
data B;
merge b1-b20;
by i;
run;
proc transpose data=B(drop=i) out=TB;
var _all_;
run;
%crackman1;
%mend crackman;
%crackman(55);

方便起见改成C1-C10

9
soporaeternus 发表于 2010-7-25 02:28:51
  1. /*构造原始数据集*/
  2. data a;
  3.         do i=1 to 10 by 1;
  4.                 x=ranuni(1);
  5.                 output;       
  6.         end;
  7.         drop i;
  8. run;
  9. /*每条记录给唯一ID*/
  10. data b;
  11.         set a;
  12.         id+1;       
  13. run;
  14. /*依次给定原始数据条数、试验次数、每次试验无放回抽取条数*/
  15. %let Obs=10;
  16. %let Test=20;
  17. %let Select=10;
  18. /*试验结果*/
  19. data select;
  20.         do test=1 to &Test by 1;
  21.                 do n=1 to &Select by 1;
  22.                         getID=ceil(ranuni(1)*&Obs);
  23.                         output;
  24.                 end;
  25.         end;
  26. run;
  27. /*合并逻辑*/
  28. data c;
  29.         do i=1 to &Obs by 1;
  30.                 do j=1 to &Obs by 1;
  31.                         if j^=i then output;
  32.                 end;
  33.         end;
  34. run;
  35. /*合并*/
  36. proc sql;
  37.         create table d as
  38.                 select
  39.                         a.i
  40.                         ,b.test
  41.                         ,b.getID
  42.                 from c a
  43.                 inner join Select b
  44.                 on a.j=b.getID
  45.                 group by i,test
  46.                 having count(getID)=&Select
  47.                 order by i,test
  48.         ;
  49. quit;
复制代码
最后根据b把id转化为与原始数据,再分别按d中的i输出下,参考jinju11的输出......
Let them be hard, but never unjust

10
jingju11 发表于 2010-7-25 03:11:19
sorry.没有sas我是无法读懂大家的程序。料想思路和方法虽然不同,但总是殊途同归。
我想,这里的放回性抽样,也类同于:产生200个1到10的随机数,每十个一组,对应了要求的A1,。。, A20.

  1. data random;
  2.   do _n_ = 1 to 20*10;
  3.     _obs = ceil(ranuni(1)*10);
  4.     sample = ceil(_n_*0.1);
  5.   end;
  6. run;
复制代码

其中的_obs是数据中的观测次序 sample 是抽样的次序。然后附带上x(假设原数据YourData的观测次序已经存在,也设为_obs)

  1. proc sql;
  2.   create table have as
  3.     select r.sample, r._obs, y.x from random r, YourData y where r._obs = y._obs
  4.     order by 1, 2;
  5. quit;
复制代码

然后依据输出规则输出数据

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-20 12:47