SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2512|回复: 0
打印 上一主题 下一主题

SAS处理极端值

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
跳转到指定楼层
楼主
发表于 2014-3-15 08:56:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文作者: @bxfly
原文地址:http://blog.sina.com.cn/s/blog_8fc24da10101nyen.html


按照百分位数处理极端值,比如将99%分位数以上的数用99%分位数代替,1%分位数以下的数用1%分位数代替。
(一)一个变量
  1. option mlogic;
  2. %macro quan(data,variable,ll,ul) ;
  3. proc means data=&data ;
  4.    var &variable;
  5.   output out=&data.1 (drop= _type_ _freq_) &ll=a &ul=b;
  6. run;
  7. data &data.2;
  8. set &data;
  9.     if _n_=1 then set &data.1;
  10.     if &variable<a then x=a;
  11.     if &variable>b then x=b;
  12.     drop  a b;
  13. run;
  14. %mend;
  15. quan(quan,x,p5,p95)
复制代码

此处利用宏来修改原数据集,此处四个参数data,variable,ll,ul分别代表数据集、变量以及上下限。
另外我们亦可以利用proc rank来编写,得到相应的分位数的值。亦可以利用proc univariate过程。有兴趣的可以参考《cody’s data cleanning techniques》。
(二)多个变量
多个变量的方法也是类似于一个变量的。
  1. %macro quan1(number) ;
  2. data quan;
  3. array x(&number) x1-x&number;
  4.   do i=1 to 1000;
  5.     %do j=1 %to &number;
  6.      x{&j}=ranuni(0);
  7.     %end;
  8.   output;
  9. end;
  10. drop i;
  11. run;
  12. proc means data=quan;
  13.   var x1-x&number;
  14.    output out=quan1 (drop= _type_ _freq_)
  15.         p5(x1-x&number)=a1-a&number  p95(x1-x&number)=b1-b&number;
  16. run;
  17. data quan2;  
  18.   set quan;
  19.   if _n_=1 then set quan1;
  20.    array x(&number)x1-x&number;
  21.     array a(&number) a1-a&number;
  22.     array b(&number) b1-b&number;
  23.      do i=1 to dim(x) ;
  24.        if x{i]<a{i} then x{i}=a{i};
  25.         if x{i}>b{i} then x{i}=b{i};
  26.     end;
  27.     keep  x1-x&number;
  28. %mend;
  29. %quan1(4)
复制代码

此处任然利用上面的思路,只不过利用了数组的思路进行比较,然后判断替换。
本程序是通过随机生成数据进行分析,所以在变量名格式上(x1-x4)一致,所以方便后面判断,宏的参数只有一个变量的个数。而实际情况比这个更加复杂。建议看这个宏程序:http://ihome.cuhk.edu.hk/~b121456/tools/Winsorize_Macro.txt。相应的书籍可以参考:《cody’s data cleanning techniques》。
分享到:  微信微信
收藏收藏1
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-11-22 12:55 , Processed in 0.160846 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表