| 
 | 
 
本文作者: @bxfly 
原文地址:http://blog.sina.com.cn/s/blog_8fc24da10101nyen.html 
 
按照百分位数处理极端值,比如将99%分位数以上的数用99%分位数代替,1%分位数以下的数用1%分位数代替。 
(一)一个变量 
- option mlogic;
 
 - %macro quan(data,variable,ll,ul) ;
 
 - proc means data=&data ;
 
 -    var &variable;
 
 -   output out=&data.1 (drop= _type_ _freq_) &ll=a &ul=b;
 
 - run;
 
 - data &data.2;
 
 - set &data;
 
 -     if _n_=1 then set &data.1;
 
 -     if &variable<a then x=a;
 
 -     if &variable>b then x=b;
 
 -     drop  a b;
 
 - run;
 
 - %mend;
 
 - quan(quan,x,p5,p95)
 
  复制代码 
此处利用宏来修改原数据集,此处四个参数data,variable,ll,ul分别代表数据集、变量以及上下限。 
另外我们亦可以利用proc rank来编写,得到相应的分位数的值。亦可以利用proc univariate过程。有兴趣的可以参考《cody’s data cleanning techniques》。 
(二)多个变量 
多个变量的方法也是类似于一个变量的。 
- %macro quan1(number) ;
 
 - data quan;
 
 - array x(&number) x1-x&number;
 
 -   do i=1 to 1000;
 
 -     %do j=1 %to &number;
 
 -      x{&j}=ranuni(0);
 
 -     %end;
 
 -   output;
 
 - end;
 
 - drop i;
 
 - run;
 
 - proc means data=quan;
 
 -   var x1-x&number;
 
 -    output out=quan1 (drop= _type_ _freq_)
 
 -         p5(x1-x&number)=a1-a&number  p95(x1-x&number)=b1-b&number;
 
 - run;
 
 - data quan2;  
 
 -   set quan;
 
 -   if _n_=1 then set quan1;
 
 -    array x(&number)x1-x&number;
 
 -     array a(&number) a1-a&number;
 
 -     array b(&number) b1-b&number;
 
 -      do i=1 to dim(x) ;
 
 -        if x{i]<a{i} then x{i}=a{i};
 
 -         if x{i}>b{i} then x{i}=b{i};
 
 -     end;
 
 -     keep  x1-x&number;
 
 - %mend;
 
 - %quan1(4)
 
  复制代码 
此处任然利用上面的思路,只不过利用了数组的思路进行比较,然后判断替换。 
本程序是通过随机生成数据进行分析,所以在变量名格式上(x1-x4)一致,所以方便后面判断,宏的参数只有一个变量的个数。而实际情况比这个更加复杂。建议看这个宏程序:http://ihome.cuhk.edu.hk/~b121456/tools/Winsorize_Macro.txt。相应的书籍可以参考:《cody’s data cleanning techniques》。 
 |   
 
 
 
 |