SAS中文论坛

标题: 缺失值的处理 [打印本页]

作者: shiyiming    时间: 2009-12-17 16:30
标题: 缺失值的处理
换个标题问,咔咔。

com date spread
A 20020101 .
A 20020202 .
A 20030304 70
...
B 20020101 40
B 20020202 .
B 20030304 60

还是看这个例子吧。我现在想做如下调整:
1,如果一个com,missing value占了60%以上,那么这个com的数据就都不要了。
2,其他com把missing value的地方用最近的数值代替,比如A前两个missing value就用70代替,B那里的就用40代替。
这里的主要问题是如果光用lag的话,前一个数也可能是missing的,那么可能需要找下一个,我希望是时间上最接近的。

另外transpose的时候我用了prefix,变量名变成com_A com_B ......,但是后面如何引用这些变量?直接var com_* (我试过这个,告诉我没有这个变量,  )
作者: shiyiming    时间: 2009-12-17 21:20
标题: Re: 缺失值的处理
[code:2kvsnbz5]
data raw;
        input com $ date yymmdd8. spread;
        format date yymmdd10.;
datalines;
A 20020101 .
A 20020202 .
A 20020203 60
A 20030304 70
B 20020101 40
B 20020202 .
B 20030304 60
B 20030305 .
B 20030306 .
C 20020101 .
C 20020202 .
C 20030304 70
;

%let valid_pct=0.4;

data temp(drop=valid_n valid_pct prev_spread next_spread );
        valid_n=0;
        do _n_=1 by 1 until(last.com);
                set raw;
                by com;
                if not missing(spread) then valid_n+1;
                if valid_n=1 then do;
                                if not missing(spread) then prev_spread=spread;
                        end;
        end;
        valid_pct=round(valid_n/_n_,0.01);
        valid_n=0;
        do _n_=1 to _n_;
                retain next_spread;
                set raw;
                if not missing(spread) then do;
                                valid_n+1;
                                next_spread=spread;
                        end;
                if valid_n=0 then spread=prev_spread;
                        else if missing(spread) then spread=next_spread;
                if valid_pct ge &valid_pct then output;
        end;
run;[/code:2kvsnbz5]
可以用com_: 的方式引用前缀为com_的变量列表
作者: shiyiming    时间: 2009-12-17 22:18
标题: Re: 缺失值的处理
谢谢hope大虾!!!

这一句什么意思啊?“%let valid_pct=0.4;”

大脑比较混乱,一看见循环就晕。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
作者: shiyiming    时间: 2009-12-18 09:42
标题: Re: 缺失值的处理
[quote:17wx94tl]1,如果一个com,missing value占了60%以上,那么这个com的数据就都不要了。[/quote:17wx94tl]
用macro variable设定有效值的比例最小为40%,用在下面的语句中,以控制记录的输出。直接写数字也没问题。
[code:17wx94tl]if valid_pct ge &amp;valid_pct then output;[/code:17wx94tl]
作者: shiyiming    时间: 2009-12-18 09:48
标题: Re: 缺失值的处理
看明白了。

不过又有新问题出现,因为原来数据里面各公司的date不太一样,transpose之后还是出现了大量的missing value。

我可不可以先把数据transpose,每个公司的数据是一个变量,然后对每个变量做上述处理呢?比如missing value&gt;40%的变量丢掉,其他的missing value用附近的填上?这时候在循环的n那里怎么处理?
作者: shiyiming    时间: 2009-12-18 10:57
标题: Re: 缺失值的处理
[quote:2a599tk1]不过又有新问题出现,因为原来数据里面各公司的date不太一样,transpose之后还是出现了大量的missing value。[/quote:2a599tk1]
不了解你的业务,没什么想法
[quote:2a599tk1]我可不可以先把数据transpose,每个公司的数据是一个变量,然后对每个变量做上述处理呢?[/quote:2a599tk1]
不理解转置后“每个公司的数据是一个变量”,是observation吧?如果是,不如偷个懒,现预处理一下,再重用原有的程序
[code:2a599tk1]proc sql;
        create table date_list as
                select *
                        from (select distinct(com) from raw),
                                (select distinct(date) from raw)
                        order by com, date;
        create table temp as
                select a&#46;com, a&#46;date, b&#46;spread
                        from date_list a left join raw b
                                on a&#46;com=b&#46;com and a&#46;date=b&#46;date
                        order by com, date;
quit;[/code:2a599tk1]
作者: shiyiming    时间: 2009-12-18 11:33
标题: Re: 缺失值的处理
咔咔,就是我想要的,big hug to hope!!!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2