楼主: 一眼瞬间
9791 12

[原创博文] 一列数据,移动平均求标准差不知怎么做? [推广有奖]

  • 0关注
  • 1粉丝

讲师

50%

还不是VIP/贵宾

-

威望
0
论坛币
730 个
通用积分
0.0001
学术水平
0 点
热心指数
4 点
信用等级
0 点
经验
903 点
帖子
376
精华
0
在线时间
309 小时
注册时间
2010-3-14
最后登录
2023-8-19

楼主
一眼瞬间 发表于 2010-8-13 15:44:14 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
有一列年度数据,要求相对于前面9年做标准差,就是移动着做

但是,问题是是时候数据不全,所以还要再设定一个要求,前面的数据不能少于三年,否则就删除。

不知哪位高手能指导下?

谢谢了!
二维码

扫码加我 拉你入群

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

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

关键词:移动平均 怎么做 标准差 年度数据 标准差

回帖推荐

一眼瞬间 发表于5楼  查看完整内容

/* test data */ data one; input symbol $ value date :date9.; format date date9.; cards; ABP1 -0.025 18feb1997 ABP1 0.05 25feb1998 ABP1 -0.025 05mar1999 ABP1 0.06 20mar2000 ABP1 0.25 05mar2001 ABP1 0.455 07mar2002 ABP1 0.73 25feb2003 ABP1 1.01 19feb2004 ABP1 1.25 16feb2005 ABP1 1.65 09feb2006 ABP1 1.87 08feb2007 ABT 0.555 14jan1991 ABT 0.6375 14 ...

本帖被以下文库推荐

沙发
rdzr 发表于 2010-8-14 14:06:05
帮你顶一个,盼高人出现!

藤椅
dou2snow 发表于 2010-8-14 14:20:24
有类似问题 求高手回答

板凳
一眼瞬间 发表于 2010-8-17 07:59:43
找到一个,可是觉得不对

/* test data */
data one;
  input symbol $ value date :date9.;
  format date date9.;
cards;
ABP1 -0.025  18feb1997
ABP1  0.05   25feb1998
ABP1 -0.025  05mar1999
ABP1  0.06   20mar2000
ABP1  0.25   05mar2001
ABP1  0.455  07mar2002
ABP1  0.73   25feb2003
ABP1  1.01   19feb2004
ABP1  1.25   16feb2005
ABP1  1.65   09feb2006
ABP1  1.87   08feb2007
ABT   0.555  14jan1991
ABT   0.6375 14jan1992
ABT   0.73   16jan1993
;
run;

/* 5 year moving avg, stdev, cv assuming:
   one obs per year from 1990 to 2010.
   observations are already in the sorted order by symbol. */
%let START = 1990;
%let FINISH = 2010;

data two;
   array val[%eval(&START-3):&FINISH] val1-val3 val&START-val&FINISH;
   call missing(of val&START-val&FINISH);
   do until (last.symbol);
     set one;
     by symbol;
     year = year(date);
     if &START<=year<=&FINISH then val[year] = value;
   end;
   do year = %eval(&START+2) to &FINISH;
      avg5 = mean(val[year-5],val[year-4],val[year-3],val[year-2],val[year-1]);
      std5 =  std(val[year-5],val[year-4],val[year-3],val[year-2],val[year-1]);
      cv5  = divide(std5,avg5);
      if not missing(cv5) then output;
   end;
   keep symbol year avg5 std5 cv5;
run;

/* check */
proc print data=two;
run;
/* on lst
Obs    symbol    year      avg5       std5       cv5

  1     ABP1     1999    0.01250    0.05303    4.24264
  2     ABP1     2001    0.01500    0.04637    3.09121
  3     ABP1     2002    0.06200    0.11251    1.81461
  4     ABP1     2003    0.15800    0.19457    1.23146
  5     ABP1     2004    0.29400    0.30597    1.04071
  6     ABP1     2005    0.50100    0.37786    0.75422
  7     ABP1     2006    0.73900    0.40448    0.54734
  8     ABP1     2007    1.01900    0.46185    0.45324
  9     ABP1     2008    1.30200    0.46338    0.35590
10     ABP1     2009    1.44500    0.38726    0.26800
11     ABP1     2010    1.59000    0.31432    0.19769
12     ABT      1993    0.59625    0.05834    0.09784
13     ABT      1994    0.64083    0.08755    0.13662
14     ABT      1995    0.64083    0.08755    0.13662
15     ABT      1996    0.64083    0.08755    0.13662
16     ABT      1997    0.68375    0.06541    0.09566
*/

报纸
一眼瞬间 发表于 2010-8-17 08:00:26
/* test data */
data one;
  input symbol $ value date :date9.;
  format date date9.;
cards;
ABP1 -0.025  18feb1997
ABP1  0.05   25feb1998
ABP1 -0.025  05mar1999
ABP1  0.06   20mar2000
ABP1  0.25   05mar2001
ABP1  0.455  07mar2002
ABP1  0.73   25feb2003
ABP1  1.01   19feb2004
ABP1  1.25   16feb2005
ABP1  1.65   09feb2006
ABP1  1.87   08feb2007
ABT   0.555  14jan1991
ABT   0.6375 14jan1992
ABT   0.73   16jan1993
;
run;

proc sql;
    create table two as
    select distinct
        a.symbol,
        b.value,
        year(a.date) as year,
        b.date as date5
    from
        one a,
        one b
    where
            a.symbol=b.symbol
        and intck('year',b.date,a.date) between 1 and 5
    order by
        a.symbol,
        year,
        date5;
quit;

proc sql;
    create table three as
    select distinct
        symbol,
        year,
        count(symbol) as n5,
        avg(value) as avg5,
        std(value) as std5
    from
        two
    group by
        symbol,
        year;
quit;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

地板
cluky 发表于 2010-8-17 08:57:55
试试看行不行

7
tracyyang 发表于 2010-8-17 10:01:13
这个做一个循环就好了。

你用index=_n_给数据编个号;

然后每次取出year1~year9;

如果N(variable) < 3就不执行计算。

8
一眼瞬间 发表于 2010-8-17 10:16:20
tracyyang 发表于 2010-8-17 10:01
这个做一个循环就好了。

你用index=_n_给数据编个号;

然后每次取出year1~year9;

如果N(variable) < 3就不执行计算。
但是还有要求要分组计算,还要加个什么条件么?

9
一眼瞬间 发表于 2010-8-17 10:16:49
对了,楼里面我贴的答案是网上复制来的。

10
tracyyang 发表于 2010-8-17 10:20:05
这样子好了,比如你有变量A和G;
A是计算变量;
G是分组变量;
data test;
        set test;
        by G;
        A1=lag(A);
        ....
        A9=lag9(A);
        if N(of A1 to A9) >=6;
run;

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

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