全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
10576 13
2012-09-14
悬赏 50 个论坛币 已解决
想了半天,找了半天,才来求教各位大侠了。
我的数据是这样的
date x
2008Q1 1
2008Q1 1
2008Q2 2
2008Q2 2
2008Q3 3
2008Q4 4
2008Q4 3
2009Q1 2
2009Q2 1
2009Q3 3
2009Q3 2
........
一共有几年,每个季度的变量个数是不一样的。想要每季度得到一个基于前四个季度的x的移动平均和移动标准差,在数据开始阶段,若季度数量不足4个,如2008Q3,就使用2008Q1~2008Q2的数据求平均和标准差。
形如
date     x  ave  std (略)
2008Q1 1  1   (2008Q1的平均)
2008Q1 1
2008Q2 2  1   (2008Q1的平均)
2008Q2 2
2008Q3 3  1.5 (2008Q1~2008Q2的平均)
2008Q4 4  1.8   (2008Q1~2008Q3的平均)
2008Q4 3
2009Q1 2  16/7  (2008Q1~2008Q4的平均)
2009Q2 1   ?(2008Q2~2009Q1的平均)
2009Q3 3 ? (2008Q3 ~2009Q2)
2009Q3 2
谢谢大家,为表诚意,特意多出点金子感谢愿意分享答案的好心人。

最佳答案

ziyenano 查看完整内容

呵呵~多谢关心 这下应该可以了,是你要求的第二种方法 proc iml; use ex1; read all var{year q x} into g; q=j(nrow(g),2,0); do i=1 to nrow(g); if i=1 then do; limit=(g[,1]-g)*4+g[,2]-g; locate=loc(limit>=-3 & limit=-3 & limit
二维码

扫码加我 拉你入群

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

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

全部回复
2012-9-14 16:33:05
luckycai 发表于 2012-9-15 09:52
您好!首先真的非常感激您大半夜的回复,请注意休息喔!

这里第一行的问题是解决了,但是我发现了另一 ...
呵呵~多谢关心
这下应该可以了,是你要求的第二种方法
proc iml;
use ex1;
read all var{year q x} into g;
q=j(nrow(g),2,0);     
do i=1 to nrow(g);  
   if i=1 then do;
   limit=(g[,1]-g[i,1])*4+g[,2]-g[i,2];
   locate=loc(limit>=-3 & limit<=0);
   q[i,1]=g[locate,3][:];              
   q[i,2]=((g[locate,3]-g[locate,3][:])##2)[:]##0.5;
   end;
  else if all(g[i,1:2]=g[i-1,1:2]) then do;   
   q[i,1]=.;                                    
   q[i,2]=.;
   end;
   else do;
   limit=(g[,1]-g[i,1])*4+g[,2]-g[i,2];   /*将年份的差乘以4,加上季度的差,赋值给limit*/
   locate=loc(limit>=-3 & limit<=0);      /*用loc函数找出limit值在[-3,0]之间的观测位置,即要求的四个季度的所有观测的位置*/     
   q[i,1]=g[locate,3][:];              
   q[i,2]=((g[locate,3]-g[locate,3][:])##2)[:]##0.5;
   end;
end;
create ans from q[colname={'mean','std'}];
append from q;
quit;
data ans;
merge ex ans;
run;








二维码

扫码加我 拉你入群

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

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

2012-9-14 18:23:13

data ex;
input
date $ x;
cards;
2008Q1 1
2008Q1 1
2008Q2 2
2008Q2 2
2008Q3 3
2008Q4 4
2008Q4 3
2009Q1 2
2009Q2 1
2009Q3 3
2009Q3 2
;
run;

data ex1;
set ex;
year=input(scan(date,1,'Q'),4.);
q=input(scan(date,2,'Q'),1.);
run;

proc iml;
use ex1;
read all var{year q x} into g;
q=j(nrow(g),2,0);
do i=1 to nrow(g);
   if i=1 then do;
   q[i,1]=g[i,3] ;
   end;
   else if all(g[i,1:2]=g[i-1,1:2]) then do;
   q[i,1]=.;
   q[i,2]=.;
   end;
else do;
   q[i,1]=g[1:i-1,3][:];
   q[i,2]=((g[1:i-1,3]-g[1:i-1,3][:])##2)[:];
end;
end;
create ans from q[colname={'mean','std'}];
append from q;
quit;
data ans;
merge ex ans;
run;
二维码

扫码加我 拉你入群

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

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

2012-9-14 19:34:15
ziyenano 发表于 2012-9-14 18:23
data ex;
input
date $ x;
one thousand thanks! 完全正确!不过我没有接触过iml语言,ls能不能好事做到底,稍微注释下,让我们能多懂一点
二维码

扫码加我 拉你入群

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

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

2012-9-14 20:46:57
ziyenano 发表于 2012-9-14 18:23
data ex;
input
date $ x;
发现一个奇怪的问题,我调用了这一段程序,数据从2008开始的,2008Q1的std算出来居然是0,2008Q1一共一千多个数据啊,另外均值也与单独计算该季度内均值不同
二维码

扫码加我 拉你入群

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

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

2012-9-14 20:59:36
luckycai 发表于 2012-9-14 19:34
one thousand thanks! 完全正确!不过我没有接触过iml语言,ls能不能好事做到底,稍微注释下,让我们能多 ...
改变了一下您给的实例的值,发现问题出现在第一次计算均值和标准差上上。能不能讲解下那段程序是什么意思呀,还有就是改正的方法?
DATE   X   MEAN STD
2008Q1 1   1    0
2008Q1 2   .     .
事实上应该是
DATE   X   MEAN STD
2008Q1 1   1.5    0.5
2008Q1 2   .     .

谢谢您的解答!

二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群