SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 665|回复: 6
打印 上一主题 下一主题

缺失值的处理

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-12-17 16:30:44 | 只看该作者

缺失值的处理

换个标题问,咔咔。

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_* (我试过这个,告诉我没有这个变量,  )
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-12-17 21:20:14 | 只看该作者

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_的变量列表
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-12-17 22:18:09 | 只看该作者

Re: 缺失值的处理

谢谢hope大虾!!!

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

大脑比较混乱,一看见循环就晕。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-12-18 09:42:18 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-12-18 09:48:57 | 只看该作者

Re: 缺失值的处理

看明白了。

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

我可不可以先把数据transpose,每个公司的数据是一个变量,然后对每个变量做上述处理呢?比如missing value&gt;40%的变量丢掉,其他的missing value用附近的填上?这时候在循环的n那里怎么处理?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-12-18 10:57:20 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-12-18 11:33:52 | 只看该作者

Re: 缺失值的处理

咔咔,就是我想要的,big hug to hope!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 07:59 , Processed in 0.131976 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表