楼主: Bel-esprit
16454 9

如何用SAS对数据进行winsorize缩尾处理? [推广有奖]

  • 1关注
  • 1粉丝

博士生

4%

还不是VIP/贵宾

-

威望
0
论坛币
9 个
通用积分
8.0953
学术水平
10 点
热心指数
15 点
信用等级
5 点
经验
1915 点
帖子
104
精华
0
在线时间
301 小时
注册时间
2012-9-19
最后登录
2024-2-17

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
如题,请教各位大神,如何用SAS对数据进行winsorize缩尾处理?最好能够提供详细的程序和注释,感激不尽!
二维码

扫码加我 拉你入群

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

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

关键词:Winsorize winsor wins Win SOR 如何

沙发
chrisky 发表于 2014-8-7 00:31:40 |只看作者 |坛友微信交流群
有人编了宏的。http://www.wrds.us/index.php/repository/view/1

  1. /*****************************************
  2. Trim or winsorize macro
  3. * byvar = none for no byvar;
  4. * type  = delete/winsor (delete will trim, winsor will winsorize;
  5. *dsetin = dataset to winsorize/trim;
  6. *dsetout = dataset to output with winsorized/trimmed values;
  7. *byvar = subsetting variables to winsorize/trim on;
  8. ****************************************/
  9.   
  10. %macro winsor(dsetin=, dsetout=, byvar=none, vars=, type=winsor, pctl=1 99);
  11.   
  12. %if &dsetout = %then %let dsetout = &dsetin;
  13.      
  14. %let varL=;
  15. %let varH=;
  16. %let xn=1;
  17.   
  18. %do %until ( %scan(&vars,&xn)= );
  19.     %let token = %scan(&vars,&xn);
  20.     %let varL = &varL &token.L;
  21.     %let varH = &varH &token.H;
  22.     %let xn=%EVAL(&xn + 1);
  23. %end;
  24.   
  25. %let xn=%eval(&xn-1);
  26.   
  27. data xtemp;
  28.     set &dsetin;
  29.     run;
  30.   
  31. %if &byvar = none %then %do;
  32.   
  33.     data xtemp;
  34.         set xtemp;
  35.         xbyvar = 1;
  36.         run;
  37.   
  38.     %let byvar = xbyvar;
  39.   
  40. %end;
  41.   
  42. proc sort data = xtemp;
  43.     by &byvar;
  44.     run;
  45.   
  46. proc univariate data = xtemp noprint;
  47.     by &byvar;
  48.     var &vars;
  49.     output out = xtemp_pctl PCTLPTS = &pctl PCTLPRE = &vars PCTLNAME = L H;
  50.     run;
  51.   
  52. data &dsetout;
  53.     merge xtemp xtemp_pctl;
  54.     by &byvar;
  55.     array trimvars{&xn} &vars;
  56.     array trimvarl{&xn} &varL;
  57.     array trimvarh{&xn} &varH;
  58.   
  59.     do xi = 1 to dim(trimvars);
  60.   
  61.         %if &type = winsor %then %do;
  62.             if not missing(trimvars{xi}) then do;
  63.               if (trimvars{xi} < trimvarl{xi}) then trimvars{xi} = trimvarl{xi};
  64.               if (trimvars{xi} > trimvarh{xi}) then trimvars{xi} = trimvarh{xi};
  65.             end;
  66.         %end;
  67.   
  68.         %else %do;
  69.             if not missing(trimvars{xi}) then do;
  70.               if (trimvars{xi} < trimvarl{xi}) then delete;
  71.               if (trimvars{xi} > trimvarh{xi}) then delete;
  72.             end;
  73.         %end;
  74.   
  75.     end;
  76.     drop &varL &varH xbyvar xi;
  77.     run;
  78.   
  79. %mend winsor;
复制代码

使用举例:
  1. /* invoke macro to winsorize */
  2. %winsor(dsetin=myLib2.q_finalSet, dsetout=myLib2.r_finalWinsorized, byvar=none,
  3. vars=car_vw_log r_3day_log , type=winsor, pctl=1 99);
复制代码


已有 1 人评分论坛币 学术水平 热心指数 收起 理由
admin_kefu + 35 + 1 + 2 热心帮助其他会员

总评分: 论坛币 + 35  学术水平 + 1  热心指数 + 2   查看全部评分

使用道具

藤椅
Bel-esprit 发表于 2014-8-7 17:36:53 |只看作者 |坛友微信交流群
chrisky 发表于 2014-8-7 00:31
有人编了宏的。http://www.wrds.us/index.php/repository/view/1
谢谢,我明白了

使用道具

板凳
zl030739 发表于 2016-3-16 21:32:06 |只看作者 |坛友微信交流群

使用道具

报纸
omnijust 发表于 2016-3-25 01:31:43 |只看作者 |坛友微信交流群
这个程序有点长啊,用起来也挺方便。但是分组winsorize有时候效果并不明显,写了个短一点的,仅供参考:
/*datain是输入数据集,dataout是目标数据集,varlist是需要winsorize的变量,用空格分隔,lower是下分位点,higher是上分位点*/
/*如%winsorize(alpha,beta,var1 var2 var3,10,90)将数据集alpha的变量var1,var2和var3winsorize处理,结果输出到beta*//*注意:本程序同上面程序最大的不同在于不按照截面对数据分组,而采用面板统一winsorize,避免组间差异过大,但是对样本量的损失非常严重,在10%的水平下,按照国泰安数据库中几个常用变量,会有近千只股票损失*/
%macro winsorize(datain,dataout,varlist,lower,higher);
proc univariate data=&datain;
var &varlist.;
output out=alpha pctlpts=&lower. &higher.  pctlpre= &varlist. pctlname=l h;
run;
%let num=%eval(%length(&varlist.)-%length(%sysfunc(compress(&varlist.)))+1);
data beta;
        set &datain.;
run;
%do i=1 %to &num;
%let token=%scan(&varlist.,&i.);
proc sql noprint;
        select &token.l into:tokenl
        from alpha;
        select &token.h into:tokenh
        from alpha;
quit;
data beta;
        set beta;
        if &token.<=&tokenl. then &token.=&tokenl.;
        if &token.>=&tokenh. then &token.=&tokenh.;
run;
%end;
data &dataout.;
        set beta;
run;
proc delete data=alpha beta;
run;
%put _user_;
%mend;



使用道具

地板
jjyyff 发表于 2016-10-9 15:04:09 |只看作者 |坛友微信交流群
chrisky 发表于 2014-8-7 00:31
有人编了宏的。http://www.wrds.us/index.php/repository/view/1
你好,我是一个菜鸟,想问一下如果要进行3%的缩尾,是不是要把宏第一行括号里面的pctl=1 99 改成pctl=3 97  就可以了? 程序中的其他部分还有哪里要修改??

使用道具

7
chrisky 发表于 2016-10-11 11:52:52 |只看作者 |坛友微信交流群
jjyyff 发表于 2016-10-9 15:04
你好,我是一个菜鸟,想问一下如果要进行3%的缩尾,是不是要把宏第一行括号里面的pctl=1 99 改成pctl=3 97   ...
只要改下面的代码就行了(看红色部分)。

/* invoke macro to winsorize */
%winsor(dsetin=myLib2.q_finalSet, dsetout=myLib2.r_finalWinsorized, byvar=none,
vars=car_vw_log r_3day_log , type=winsor, pctl=3 97);

使用道具

8
冰族王子 发表于 2016-12-31 18:42:07 |只看作者 |坛友微信交流群
chrisky 发表于 2014-8-7 00:31
有人编了宏的。http://www.wrds.us/index.php/repository/view/1
谢谢分享

使用道具

9
希道 发表于 2020-2-2 22:26:34 |只看作者 |坛友微信交流群
请问为什么会出现“没有解析宏 "WINSOR" 的调用。”呢!非常感谢!!!

使用道具

10
yunfang2002 发表于 2022-6-6 23:14:43 |只看作者 |坛友微信交流群
chrisky 发表于 2014-8-7 00:31
有人编了宏的。http://www.wrds.us/index.php/repository/view/1
已使用stata验证宏完全正确,运行速度极快,感谢分享

使用道具

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

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

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

GMT+8, 2024-11-5 16:39