SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 5467|回复: 33
打印 上一主题 下一主题

练手系列2:移动平均计算

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2007-9-12 23:52:03 | 只看该作者

练手系列2:移动平均计算

[code:a4b04]data a;
infile datalines;
input cid month $ balance;
datalines;
1 200001 1
1 200002 1
1 200003 2
1 200004 .
1 200005 1
1 200006 1
1 200007 1
1 200008 1
1 200009 1
1 200010 1
1 200011 1
1 200012 1
1 200101 1
1 200102 1
1 200103 1
1 200104 1
1 200105 1
1 200106 1
1 200107 1
1 200108 1
1 200109 1
2 200001 1
2 200002 1
2 200003 2
2 200004 .
2 200005 1
2 200006 1
2 200007 1
2 200008 1
2 200009 1
;
run;[/code:a4b04]
cid表示客户号,要求计算每个客户在每个月的前6个月和前12个月的移动平均余额。
月份是从开户月至销户月是连续的,但是可能会有余额值的缺失。
如果不足6个月,则按照实际的月数求移动平均。如客户1在200001之前没有开户,所以没有余额,那么200001的6个月的移动平均就是空;在200002要求200001的平均余额;在200003要求200001到200002的平均余额;200007要求200001到200006的平均余额;200109要求200103到200108的平均余额。12个月的平均余额以次类推。
客户2的计算逻辑相同。如第1个月的移动平均是空;第2个月是第1个月的平均;以此类推。
平均数的逻辑采用与SAS的mean函数逻辑完全一致的方式,即需要去除缺失值。
请参见附件中的结果。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2007-9-14 10:40:53 | 只看该作者

Re: 练手系列2:移动平均计算

能提供一下程序吗?谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2007-9-14 15:55:01 | 只看该作者

Re: 练手系列2:移动平均计算

考虑一下用lag函数
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2007-9-14 18:24:04 | 只看该作者

Re: 练手系列2:移动平均计算

为什么不练习下混合模型呢。。。。。。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2007-9-25 11:43:45 | 只看该作者

Re: 练手系列2:移动平均计算

我想到的两个方法,一个就是用retain,一个就是用lag函数,retain比较麻烦,lag就比较直接一点,比如
lagb1=lag(balance);
lagb2=lag2(balance);
lagb3=lag3(balance);
lagb4=lag4(balance);
然后直接用函数得到结果就可以了。
不知道有没有其他更方便一点的做法?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2007-9-25 22:26:58 | 只看该作者

Re: 练手系列2:移动平均计算

大家为什么不动手试试看,写一个完整的程序,别只停留在耍耍嘴皮子。绝对没有你想象中简单,但是一旦你写出来以后,你会发现在金融行业非常实用,可重用性很高。你将从中受益颇多。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2007-9-26 20:23:12 | 只看该作者

Re: 练手系列2:移动平均计算

data b;
set a;

lagb1=lag(balance);
lagb2 =lag2 (balance);
lagb3 =lag3 (balance);
lagb4 =lag4 (balance);
lagb5 =lag5 (balance);
lagb6 =lag6 (balance);
lagb7 =lag7 (balance);
lagb8 =lag8 (balance);
lagb9 =lag9 (balance);
lagb10=lag10(balance);
lagb11=lag11(balance);
lagb12=lag12(balance);

mean6=mean(of lagb1-lagb6);
mean12=mean(of lagb1 - lagb12);

keep cid month balance mean6 mean12;
run;
proc print data=b;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2007-9-26 22:30:38 | 只看该作者

to xsmile

当第二个客户号出现的时候你的方法就失灵咯,呵呵呵。
这就是我在数据中特意安排2个客户的原因,就是为了阻止简单使用lag1-lag12来实现。
再动动脑筋 <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2007-9-27 09:17:43 | 只看该作者

Re: 练手系列2:移动平均计算

<!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: --> 经验不足,没有想到这个问题,加上个排序和计数变量应该就可以了。
proc sort data = a;
  by cid;
run;

data a1;
  set a;
  count + 1;
  by cid;
  if first.cid then count = 1;
run;

data b;
set a1;

if(count&gt;1)lagb1=lag(balance);
if(count&gt;2)lagb2 =lag2 (balance);
if(count&gt;3)lagb3 =lag3 (balance);
if(count&gt;4)lagb4 =lag4 (balance);
if(count&gt;5)lagb5 =lag5 (balance);
if(count&gt;6)lagb6 =lag6 (balance);
if(count&gt;7)lagb7 =lag7 (balance);
if(count&gt;8)lagb8 =lag8 (balance);
if(count&gt;9)lagb9 =lag9 (balance);
if(count&gt;10)lagb10=lag10(balance);
if(count&gt;11)lagb11=lag11(balance);
if(count&gt;12)lagb12=lag12(balance);

mean6=mean(of lagb1-lagb6);
mean12=mean(of lagb1 - lagb12);

keep cid month balance mean6 mean12;
run;
proc print data=b;
run;


公司没有sas软件,所以也没有调试一下是否正确,不过我想思路应该就是这样的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2007-9-27 09:39:00 | 只看该作者

to xsmile

这次程序的调试结果比上次更不理想。这个测试貌似简单,其实蛮费脑子的。
楼上的TX很不错,已经想到了lag和first两个要点了,不过离成功还差好多哦。“思路”和实现是两回事儿,希望有条件调试的TX都来参加测试。
凡是1小时之内能够完全实现的TX说明你的经验火候编程技巧都过关了;半小时之内实现,且代码不超过30行的TX可以说是SAS和业务双料高手了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 12:56 , Processed in 0.085175 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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