全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
10397 6
2009-02-26
<p>求助:如何在SAS中快速剔除两端1%和99%的极端值?将这些极端值设置为缺省值 </p>
二维码

扫码加我 拉你入群

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

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

全部回复
2009-2-26 22:12:00

没人顶一个~~~~

二维码

扫码加我 拉你入群

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

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

2009-2-27 10:40:00

我 只会个笨蛋法!

proc univiriate data=ex1;

var tepvar1;

output out=pctls pctlpts=1 99 pctlname=pct1 pct99;

run;

查看pctls中1和99的分位数然后在进行删除

[em04][em04]

[此贴子已经被作者于2009-2-27 10:47:18编辑过]

二维码

扫码加我 拉你入群

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

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

2009-2-27 17:16:00

问题已经解决了,还是非常感谢

为表感谢,我贴个macro Winso,用于解决极端值问题的很好的一个宏

/*******************************************************************************
Winsorize macro
 Can winsorize or trim at specified percentiles;
 dsetout = leave blank to overwrite dsetin
 byvar   = none for no byvar (trims/winsorizes pooled sample)
 type    = delete/winsor
 ex: %winsor(dsetin=mydata, dsetout=mydata2, byvar=year, vars=assets earnings, pctl=0 98);
     winsorizes by year at 98%, puts resulting dataset into mydata2

     %winsor(dsetin=mydata, vars=assets earnings, type=delete);
     trims pooled sample at 1% and 99%, puts resulting dataset back into mydata
********************************************************************************/

%macro winsor(dsetin=, dsetout=, byvar=none, vars=, 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;

%let dropvar = ;
%if &byvar = none %then %do;

    data xtemp;
        set xtemp;
        xbyvar = 1;
        run;

    %let byvar = xbyvar;
    %let dropvar = 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 trimvars{xi} ne . 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 trimvars{xi} ne . then do;
              if (trimvars{xi} < trimvarl{xi}) then delete;
              if (trimvars{xi} > trimvarh{xi}) then delete;
            end;
        %end;

    end;
    drop &varL &varH &dropvar xi;
    run;

%mend winsor;

二维码

扫码加我 拉你入群

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

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

2010-2-24 14:20:01
如何用eviews spss stata 实现呢
二维码

扫码加我 拉你入群

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

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

2013-3-16 15:26:42
xiaotusheng 发表于 2009-2-27 17:16
问题已经解决了,还是非常感谢为表感谢,我贴个macro Winso,用于解决极端值问题的很好的一个宏/********** ...
能不能具体说说这个宏怎么用呢?我粘贴到程序中之后,跑出来的观测值一点都没有减少啊,哭……
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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