全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
25439 17
2010-07-14
这也是网上找的。是不是这样就可以使用。只改上面的信息。谢谢各位

%macro winsor(dsetin=repr12, dsetout=repr13, byvar=stkcd year, vars=tacc sale ppe, type=winsor, pctl=1 99);
%if &dsetout = %then %let dsetout = &dsetin;
   
%let varL=;
%let varH=;
%let xn=1;
%do %until ( %scan(&vars,&xn)= );
    %let token = %scan(&vars,&xn);
    %let varL = &varL &token.L;
    %let varH = &varH &token.H;
    %let xn=%EVAL(&xn + 1);
%end;
%let xn=%eval(&xn-1);
data xtemp;
    set &dsetin;
    run;
%if &byvar = none %then %do;
    data xtemp;
        set xtemp;
        xbyvar = 1;
        run;
    %let byvar = xbyvar;
%end;
proc sort data = xtemp;
    by &byvar;
    run;
proc univariate data = xtemp noprint;
    by &byvar;
    var &vars;
    output out = xtemp_pctl PCTLPTS = &pctl PCTLPRE = &vars PCTLNAME = L H;
    run;
data &dsetout;
    merge xtemp xtemp_pctl;
    by &byvar;
    array trimvars{&xn} &vars;
    array trimvarl{&xn} &varL;
    array trimvarh{&xn} &varH;
    do xi = 1 to dim(trimvars);
        %if &type = winsor %then %do;
            if not missing(trimvars{xi}) then do;
              if (trimvars{xi} < trimvarl{xi}) then trimvars{xi} = trimvarl{xi};
              if (trimvars{xi} > trimvarh{xi}) then trimvars{xi} = trimvarh{xi};
            end;
        %end;
        %else %do;
            if not missing(trimvars{xi}) then do;
              if (trimvars{xi} < trimvarl{xi}) then delete;
              if (trimvars{xi} > trimvarh{xi}) then delete;
            end;
        %end;
    end;
    drop &varL &varH xbyvar xi;
    run;
%mend winsor;
proc reg data=repr12;
model tacc=sale ppe;
run;
data repr13;
set repr12;
if year=1998 then delete;
run;
proc reg data=repr13;
model tacc=sale ppe;
run;
二维码

扫码加我 拉你入群

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

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

全部回复
2010-7-14 22:33:32
没具体检验,不过应该是对的。

winsorization就是把数据两端的极端值替换为99%和1%的数据(pctl=1 99)或删除掉。在你提供的程序里,
1、提取1%和99%的数据值:
复制代码
2.A、如果type=winsor,作替换
复制代码
2.B 如果type^=winsor,将极端值删除(一般不推荐这种做法)
复制代码
二维码

扫码加我 拉你入群

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

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

2010-7-14 22:33:55
你提供的程序在这里讨论过
http://www.pinggu.org/bbs/redire ... 6&goto=lastpost
二维码

扫码加我 拉你入群

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

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

2010-7-15 17:40:03
是的。我也是在那看的。是不是要把所有的代码都放上,宏看不懂。我做了一下,数据没有变化。但是log里也没有error.
二维码

扫码加我 拉你入群

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

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

2010-7-15 20:54:00
suly 发表于 2010-7-15 17:40
是的。我也是在那看的。是不是要把所有的代码都放上,宏看不懂。我做了一下,数据没有变化。但是log里也没有error.
极端值有没有变化?可以用proc univariate来观察
二维码

扫码加我 拉你入群

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

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

2010-7-18 22:10:43
那宏看得实在太累了。
试试这个:
data a;
   do i=1 to 99;
     j=100+i;
   output;
   end;
run;
proc univariate data=a noprint;  *//查找5%、95%;
   var i j;
   output out=a_quant p5=i_p5 j_p5 p95=i_p95 j_p95;
run;
proc sql;
   create table a_winsorize as select
   case
   when(i<i_p5) then i_p5
   when(i>i_p95)  then i_p95
   else i
   end as i,
   case
   when(j<j_p5) then j_p5
   when(j>j_p95)  then j_p95
   else j
   end as j
   from a,a_quant;
quit;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群