楼主: suly
25613 17

winsorize的使用 [推广有奖]

  • 0关注
  • 0粉丝

博士生

19%

还不是VIP/贵宾

-

威望
0
论坛币
996 个
通用积分
0.0700
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
4210 点
帖子
157
精华
0
在线时间
209 小时
注册时间
2007-12-20
最后登录
2020-5-3

楼主
suly 发表于 2010-7-14 21:43:29 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
这也是网上找的。是不是这样就可以使用。只改上面的信息。谢谢各位

%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;
二维码

扫码加我 拉你入群

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

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

关键词:Winsorize winsor wins SOR Win Winsorize

回帖推荐

BraveMadMan 发表于2楼  查看完整内容

没具体检验,不过应该是对的。 winsorization就是把数据两端的极端值替换为99%和1%的数据(pctl=1 99)或删除掉。在你提供的程序里, 1、提取1%和99%的数据值:2.A、如果type=winsor,作替换2.B 如果type^=winsor,将极端值删除(一般不推荐这种做法)

本帖被以下文库推荐

沙发
BraveMadMan 发表于 2010-7-14 22:33:32
没具体检验,不过应该是对的。

winsorization就是把数据两端的极端值替换为99%和1%的数据(pctl=1 99)或删除掉。在你提供的程序里,
1、提取1%和99%的数据值:
  1. output out = xtemp_pctl PCTLPTS = &pctl PCTLPRE = &vars PCTLNAME = L H;
复制代码
2.A、如果type=winsor,作替换
  1. %if &type = winsor %then %do;
  2.             if not missing(trimvars{xi}) then do;
  3.               if (trimvars{xi} < trimvarl{xi}) then trimvars{xi} = trimvarl{xi};
  4.               if (trimvars{xi} > trimvarh{xi}) then trimvars{xi} = trimvarh{xi};
  5.             end;
  6.         %end;
复制代码
2.B 如果type^=winsor,将极端值删除(一般不推荐这种做法)
  1.         %else %do;
  2.             if not missing(trimvars{xi}) then do;
  3.               if (trimvars{xi} < trimvarl{xi}) then delete;
  4.               if (trimvars{xi} > trimvarh{xi}) then delete;
  5.             end;
  6.         %end;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
凡尘梦1990 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
BraveMadMan 发表于 2010-7-14 22:33:55
你提供的程序在这里讨论过
http://www.pinggu.org/bbs/redire ... 6&goto=lastpost

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

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

地板
hongxx 发表于 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;
已有 1 人评分学术水平 热心指数 收起 理由
凡尘梦1990 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

7
suly 发表于 2010-7-22 23:34:04
6# hongxx
你好,上面这部分什么意思啊,port1是我的数据集。完了以后原始数据集就i和 j了怎么
data port1;
   do i=1 to 99;
     j=100+i;
   output;
   end;
run;

proc univariate data=port1 noprint;
   var i j;
   output out=port2 p5=i_p5 j_p5 p95=i_p95 j_p95;
run;
proc sql;
   create table port3 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 port1,port2;
quit;

8
BraveMadMan 发表于 2010-7-23 00:46:23
红色部分生成一个新的数据集。跟你原始数据集没关系。
Don't get lost in technical details. What is the big picture?

9
suly 发表于 2010-7-23 23:54:27
那在哪里表现出来是在对我的数据集的某些变量 进行winsorize呢

10
BraveMadMan 发表于 2010-7-23 23:58:01
suly 发表于 2010-7-23 23:54
那在哪里表现出来是在对我的数据集的某些变量 进行winsorize呢
建议你仔细看看别人的回帖。
BraveMadMan 发表于 2010-7-15 20:54
极端值有没有变化?可以用proc univariate来观察
Don't get lost in technical details. What is the big picture?

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 12:58