楼主: ybhk
4113 6

如何实现随机抽取 [推广有奖]

  • 0关注
  • 1粉丝

硕士生

2%

还不是VIP/贵宾

-

威望
0
论坛币
39 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1115 点
帖子
84
精华
0
在线时间
94 小时
注册时间
2012-6-2
最后登录
2017-10-22

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我想实现的就是每一个缺失值用其已观测到的值中随机抽取一个值进行填补,比如变量var1 一共有6个观测(1  2  .  4 . 6)两个缺失值,其中每个缺失值 都在已观测值(1 2 4 6)中随机抽取一个进行填补,想请教各位高手怎么实现,我自己有一个很麻烦的程序,运行很慢,所以想请教大家怎样能够简单一点


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:如何实现 缺失值 怎样能 观测值 VaR 如何 程序

如果你的数据集观测值很多的话建议这样做

  1. data one;
  2. input v1;
  3. cards;
  4. 1
  5. 2
  6. .
  7. 4
  8. .
  9. 6
  10. ;;;
  11. run;
  12. data two;
  13. set one(where=(v1 ne .));
  14. run;

  15. data three;
  16. do i =1 to 4; /*这里的数字4 是数据集two里面剩下的非空数据的数量*/
  17. set two ;
  18. array choose {4};
  19. choose{i}=v1;
  20. drop i v1;
  21. end;

  22. run;
  23. data final;
  24. if _n_=1 then set three;
  25. set one;
  26. if v1 eq . then do;
  27. v1=choosen(ceil(ranuni(0)*4),of choose1-choose4);
  28. end;
  29. keep v1;
  30. run;
复制代码




如果数据量不是很多的话 可以这样

  1. data final2;
  2. set one;
  3. array choose {4} (1 2 4 6);
  4. if v1 eq . then do;
  5. v1=choosen(ceil(ranuni(0)*4),of choose1-choose4);
  6. end;
  7. keep v1;
  8. run;
复制代码



注意所有的choose后面的数字以及 array的数字 都是非空数据的数量
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
teqel + 3 + 3 + 3 精彩帖子

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

使用道具

藤椅
teqel 发表于 2015-10-1 08:24:24 |只看作者 |坛友微信交流群
sas那个石家庄人 发表于 2015-10-1 02:41
如果你的数据集观测值很多的话建议这样做
choose 函数用得很好,第一次见到。不过感觉第一个程序不能工作啊。

我的设想:将非missing的数据输出为另一个dataset, 从中抽样2个数据,然后补回原来的数据中

使用道具

teqel 发表于 2015-10-1 08:24
choose 函数用得很好,第一次见到。不过感觉第一个程序不能工作啊。

我的设想:将非missing的数据输出 ...
我第一个程序可能有些地方没有写好 不过和你的设想思路是一致的

data two就是包含非missing的数据集

data three就是把data two里面非空的4个值变成一个单独的observation (choose1 choose2 choose3 choose4)

最后一步就是把这一列 (choose1 choose2 choose3 choose4)合并到原始数据的每一个观测值的右边
如果是missing就从这四个里随机选一个

使用道具

报纸
teqel 发表于 2015-10-1 08:42:14 |只看作者 |坛友微信交流群
sas那个石家庄人 发表于 2015-10-1 02:41
如果你的数据集观测值很多的话建议这样做
试了一下,可以工作。但是如果数据很多,会很慢

使用道具

地板
yongyitian 发表于 2015-10-1 08:46:32 |只看作者 |坛友微信交流群
  1. data have;
  2.   input x @@;
  3. datalines;
  4. 1 2 3 . 5 . 6 7 8 . 10
  5. ; run;

  6. proc sql outobs=1;
  7.     create table random_x as
  8.     select x as ran_x
  9.     from have
  10.     where ^missing(x)
  11.     order by ranuni(12);
  12. quit;

  13. data want;
  14.     if _n_ = 1 then set random_x;
  15.      set have;
  16.      if missing(x) then x=ran_x;
  17.     drop ran_x;
  18. run;
复制代码

使用道具

  1. data one;
  2. input v1;
  3. cards;
  4. 1
  5. 2
  6. .
  7. 4
  8. .
  9. 6
  10. ;;;
  11. run;

  12. data two;
  13. set one(where=(v1 ne .));
  14. num=_n_;
  15. run;


  16. data final;

  17. array choose {4} _temporary_;
  18. if _n_=1 then do until (last);
  19. set two end=last;
  20. choose{num}=v1;
  21. end;

  22. set one;
  23. if v1 eq . then v1=choose{ceil(ranuni(0)*4)};
  24. drop num;

  25. run;

  26. 我改进了一了下 加入了个temporary的array 应该可以减短运行时间
复制代码

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 14:48