楼主: tianlai888
10373 12

[原创博文] 求助:计算移动平均数的问题? [推广有奖]

  • 0关注
  • 0粉丝

本科生

19%

还不是VIP/贵宾

-

威望
0
论坛币
46 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
540 点
帖子
44
精华
0
在线时间
57 小时
注册时间
2009-1-9
最后登录
2012-5-18

楼主
tianlai888 发表于 2009-9-26 12:38:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
求助:计算移动平均数的问题?

        如有下列数据,怎样按beibie(类别)计算3期移动平均数?
data a;
input leibie $ y @@;
cards;
a 2 a 3 a 5 a 7 a 1 a 4 a 8
b 6 b 4 b 8 b 7 b 2 b 9
c 7 c 3 c 4 c 2 c 6 c 1
;
run;
data b;
set a;
by leibie;
if first.leibie then  y_sum = 0;
y_sum+y;
run;

如果用这句 y3=(y_sum-lag3(y_sum))/3;  那么只有a类的3期移动平均数是对的。
后面类别的头3个都是错的,应该是空值。
由于数据集中的类别比较多(几千个),不好分开。

请教该如何计算? 谢谢!!
二维码

扫码加我 拉你入群

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

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

关键词:移动平均 平均数 Input cards First 平均数 如何

回帖推荐

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

按你每三个算平均数,那每组前三个不是正好能算一个数么?为什么是每组前三个空,而不是前两个空呢? data a; input leibie $ y @@; n=1; cards; a 2 a 3 a 5 a 7 a 1 a 4 a 8 b 6 b 4 b 8 b 7 b 2 b 9 c 7 c 3 c 4 c 2 c 6 c 1 ; run; proc sql; /*判断每组至少3个数的,且排序*/ create table b as select * from a group by leibie having count(*)>=3;quit; data b; set b; by leibie; if first.leibie ...

本帖被以下文库推荐

沙发
sushe1527 发表于 2009-9-26 13:33:32
按你每三个算平均数,那每组前三个不是正好能算一个数么?为什么是每组前三个空,而不是前两个空呢?

data a;
input leibie $ y @@;
n=1;
cards;
a 2 a 3 a 5 a 7 a 1 a 4 a 8
b 6 b 4 b 8 b 7 b 2 b 9
c 7 c 3 c 4 c 2 c 6 c 1
;
run;
proc sql;    /*判断每组至少3个数的,且排序*/
create table b as select * from a group by leibie having count(*)>=3;quit;

data b;
set b;
by leibie;
if first.leibie then  y_sum = 0;
y_sum+y;
y3=(y_sum-lag3(y_sum))/3;
retain m;
m+n;
if first.leibie then m=n;
if m in(1,2) then y3=.;
if m=3 then y3=y_sum/3;
run;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

藤椅
tianlai888 发表于 2009-9-26 16:31:14
谢谢回复!
按照您的思路完成,谢谢!!!

板凳
jingju11 发表于 2009-9-28 02:28:20
3# tianlai888


  1. data a;
  2. input leibie $ y @@;
  3. cards;
  4. a 2 a 3 a 5 a 7 a 1 a 4 a 8
  5. b 6 b 4 b 8 b 7 b 2 b 9
  6. c 7 c 3 c 4 c 2 c 6 c 1
  7. d 1 d 2
  8. e 3 e 4
  9. f 5 f 6 f 7
  10. g 8
  11. ;
  12. run;
  13. data b1;
  14. set a;
  15. by leibie;
  16. if first.leibie then n=0;
  17. n+1;
  18. y_sum+y;
  19. dif3=dif3(y_sum);
  20. if  n<3 then ma3=.;
  21.   else if n=3 & _n_=3 then ma3=y_sum/3;
  22.    else ma3=dif3/3;
  23. drop n y_sum dif3;
  24. run;
复制代码

如果只是在同一类别里每三个求一次平均数的话。不过moving average应该要更复杂吧,不懂。

报纸
邢不行 在职认证  发表于 2012-7-20 09:37:37
不管去哪里 只要在路上

地板
YueweiLiu 发表于 2012-7-20 11:29:29
PROC EXPAND

7
BraveMadMan 发表于 2012-7-20 15:29:54
data a;
input leibie $ y @@;
cards;
a 2 a 3 a 5 a 7 a 1 a 4 a 8
b 6 b 4 b 8 b 7 b 2 b 9
c 7 c 3 c 4 c 2 c 6 c 1
;
run;

proc expand data=a out=b method=none;
  by leibie;
  CONVERT y = MA_y / TRANSFORM=( MOVAVE 3 TRIMLEFT 2);
RUN;
Don't get lost in technical details. What is the big picture?

8
paulwong 发表于 2013-9-16 10:02:04
BraveMadMan 发表于 2012-7-20 15:29
data a;
input leibie $ y @@;
cards;
这个为最简单的正解

9
fjlhr 在职认证  发表于 2014-5-7 16:49:55
BraveMadMan 发表于 2012-7-20 15:29
data a;
input leibie $ y @@;
cards;
请问,如果我用proc expand求滚动方差的话该怎么用呢?菜鸟一个,求大神赐教!

10
learsaas 发表于 2014-5-7 17:01:47
movave 3 替换为movstd 3即可
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
fjlhr + 1 + 1 + 1 热心帮助其他会员

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

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

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