楼主: bhhk
20743 20

求助用SAS生成缺失数据 [推广有奖]

  • 0关注
  • 1粉丝

硕士生

57%

还不是VIP/贵宾

-

威望
0
论坛币
393 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
8203 点
帖子
141
精华
0
在线时间
189 小时
注册时间
2012-4-28
最后登录
2022-6-7

楼主
bhhk 发表于 2015-1-6 22:04:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现在有一个完整数据,想生成不同缺失率的随机缺失数据集,比如这个数据有10个变量(x1~x10)有50个观测(n=50),现想生成一个含缺失的数据,如将变量(x1,x3,x4,x7,x8)处理成缺失率为10%,其他变量不变的缺失数据,要怎么做?谢谢,如果这个过程想重复100次 ,又怎么做呢?万分感谢
二维码

扫码加我 拉你入群

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

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

关键词:缺失数据 万分感谢 怎么做 数据集

沙发
mingfeng07 学生认证  发表于 2015-1-7 00:16:10
  1. data a(drop=i j);
  2. array a{10} x1-x10;
  3. do i=1 to 50;
  4.   do j=1 to 10;
  5.   a(j)=rannor(0);
  6.   end;
  7.   output;
  8. end;
  9. run;
  10. %macro test(lib,data,rate);
  11. proc datasets lib=&lib nodetails nolist;
  12. contents data=&data out=b;
  13. quit;
  14. proc sql noprint;
  15. select count(*) into:count from b;
  16. select name into:var1-:var%left(&count) from b;
  17. quit;
  18. %let newvar=1 3 4 7;
  19. %let r=%sysevalf(1-&rate.);
  20. %do i=1 %to &count.;
  21. %if %index(&newvar,&i.)>0 %then %do;
  22. %let r=%sysevalf(1-&rate.);
  23. %end;
  24. %else %do;
  25. %let r=1;
  26. %end;
  27. proc surveyselect data=a(keep=&&var&i.) out=c outall method=srs samprate=&r noprint;
  28. run;
  29. %if &i.=1 %then %do;
  30. data test(drop=selected);
  31. set c;
  32. if selected=0 then &&var&i.=.;
  33. run;
  34. %end;
  35. %else %do;
  36. data test(drop=selected);
  37. set test;
  38. set c;
  39. if selected=0 then &&var&i.=.;
  40. run;
  41. %end;
  42. %end;
  43. proc delete data=b c;
  44. run;
  45. %mend;
  46. %test(work,a,0.1);
复制代码

如果想重复一百次,在外面套个宏循环就行了。
已有 4 人评分经验 学术水平 热心指数 信用等级 收起 理由
eijuhz + 40 精彩帖子
李会超 + 20 精彩帖子
teqel + 1 + 1 + 1 精彩帖子
heguima + 1 + 1 + 1 精彩帖子

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

藤椅
teqel 发表于 2015-1-7 00:51:43
mingfeng07 发表于 2015-1-7 00:16
如果想重复一百次,在外面套个宏循环就行了。
不错,就是有点复杂。是不是应该把newvar写到外面

板凳
jingju11 发表于 2015-1-7 01:53:06
I use proc surveryselect as well. JingJu
  1. %macro test(data, var, rate, nsamp);
  2. %local i nn; %let nn =%sysfunc(countw(&var));
  3. proc surveyselect data=&data out=selectout outall method=srs rate=&rate reps=%eval(&nn*&nsamp) seed=1234 noprint; run;
  4. data have;
  5. if 1=0 then set &data;
  6. %do i =1 %to &nn;
  7.         set selectout(drop=%sysfunc(tranwrd(&var, %scan(&var,&i),%str( ))) where=(replicate in (%eval(1+&nsamp*(&i-1)):%eval(&nsamp*&i))));
  8.         if selected then call missing(%scan(&var,&i));
  9. %end;
  10. replicate =mod(replicate-1,&nsamp) +1;
  11. drop selected;
  12. run;
  13. %mend test;
  14. %test(sashelp.class, %str(sex age weight),0.10, 10);
复制代码
已有 4 人评分经验 学术水平 热心指数 信用等级 收起 理由
eijuhz + 40 精彩帖子
teqel + 2 + 2 + 2 精彩帖子
heguima + 1 + 1 + 1 精彩帖子
jl60156 + 1 + 1 + 1 精彩帖子

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

报纸
mingfeng07 学生认证  发表于 2015-1-7 10:00:54
teqel 发表于 2015-1-7 00:51
不错,就是有点复杂。是不是应该把newvar写到外面
恩,写外面也可以的。

地板
mingfeng07 学生认证  发表于 2015-1-7 10:47:08
jingju11 发表于 2015-1-7 01:53
I use proc surveryselect as well. JingJu
京剧大神厉害,利用一次proc surveyselect过程,产生重复样本,避免了宏循环,把所有的数据都放在selectout里,然后通过条件设置set依次进去就行,其中最出彩之处在于这个reps用的特别好,不但囊括了产生缺失值变量的个数还包括了重复次数,一举两得,后面的data步也设置的非常精简。膜拜!!不过不太理解的是,为了在data步中要加一个if 1=0 then set &data;这么一个语句呢,这似乎是一个不执行的语句啊?

7
jl60156 发表于 2015-1-7 10:57:50
data a(drop=i j);
array a{10} x1-x10;
do i=1 to 50;
  do j=1 to 10;
  a(j)=rannor(0);
  end;
  output;
end;
run;

%macro test(dsin=,dsout=,seed=,vars=, rate=,b=1);
data &dsin;
        set &dsin;
seq=_n_;
run;
%let n=%sysfunc(countw(&vars,%str( )));
%do i=1 %to &n;
%let var = %scan(&vars,&i,%str( ));
%syscall ranuni(seed,b);
proc surveyselect data=&dsin(keep=seq &var) out=temp&i method=srs samprate=&rate seed=&seed;
run;
data temp&i;
        set temp&i;
        call missing(&var);
run;
%end;
data &dsout(drop=seq);
        merge &dsin %do i=1 %to &n; temp&i %end;;
        by seq;
run;
proc datasets;
   delete %do i=1 %to &n; temp&i %end;;
%mend;
%test(dsin=a,dsout=want,seed=123456,vars=%str(x1 x3 x4 x7 x8),rate=0.1);
已有 2 人评分经验 论坛币 收起 理由
eijuhz + 20 精彩帖子
admin_kefu + 40 热心帮助其他会员

总评分: 经验 + 20  论坛币 + 40   查看全部评分

8
sushe1527 发表于 2015-1-7 11:14:42
都挺好
回去消化下,手头就个400M的简约版 稍微复杂的语句和函数就不认

9
yongyitian 发表于 2015-1-7 11:59:16
/* 不用宏和 surveyselect,只用数据步的方法。*/


data test;
  array x{10};
   do n = 1 to 50;
      do j = 1 to 10;
       x[j] = ceil(ranuni(12345)*100);
    end;
  output;
  end; drop j;
run;

data want;
  array x{10} x1-x10;
  array y{50, 10};
  if _n_ = 1 then do;
       p = 1;
     do until (last);
      set test end=last ;
        do j = 1 to 10;
         y[p, j] = x[j];
        end;
      p+1;
     end;
  
   do k = 1 to 10;
      seed = k+1000;
      nmiss = 0;
      do until (nmiss=5);
         n1 = ceil(ranuni(seed)*50);
         if ^missing(y[n1, k]) then do;
          call missing(y[n1, k]);
          nmiss+1;   end;
      end;
   end;
   
   do n = 1 to 50;
      do k1 = 1 to 10;
        x[k1] =y[n, k1];
      end;
      output;
   end;
  end;
keep n x1-x10;  
run;

10
teqel 发表于 2015-1-7 14:02:35
mingfeng07 发表于 2015-1-7 10:47
京剧大神厉害,利用一次proc surveyselect过程,产生重复样本,避免了宏循环,把所有的数据都放在selecto ...
研究半天,终于看懂了。大神确实厉害。
我觉得if 1=0这句就是只把变量带进来,但是不带进来数据,这样写比较严谨。
试了一下(proc compare),写不写其实结果是一样的。

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

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