【问题标题】:Monthly summary of a time series in r [duplicate]r中时间序列的每月摘要[重复]
【发布时间】:2014-05-13 01:19:42
【问题描述】:

这是 R 中的一个新手问题。我有一个时间序列对象,我想为该系列创建每月摘要(即平均中位数模式)。我希望这是一个向量。示例如下:

ddd<-c(1:100)
ddd1<-ts(ddd,frequency=12,start=c(1960,1))

我需要的是 1 月、2 月等月份的平均值。它是一个 12X1 的向量值。 1 月、2 月和 3 月分别为 49、50,51。一个很长的方法是使用预测包的 seasondummy() 函数并进行回归以获得结果,但我正在寻找一个优雅的解决方案。提前致谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    这可能有点笨拙,我确信有一个更好的 zoo 函数,但本着学习的精神,您可以使用处理 ts 对象的基本 R 函数来做到这一点:

    window(ddd1, c(1960,1), deltat=1)
    

    ...将从1960.1(1 月)开始,每 12 个月提取一个值(deltat=12/12=1),这意味着您可以然后sapply 这个函数像:

    sapply(1:12, function(x) mean(window(ddd1, c(1960,x), deltat=1)) )
    #[1] 49 50 51 52 47 48 49 50 51 52 53 54
    

    【讨论】:

      【解决方案2】:

      您可以使用tapply,将函数应用于按另一个向量中的值分组的向量是很有用的

      > v<-rnorm(48)  #our fake values
      > mos<-rep(1:12,4)  # our months, jan=1, feb=2 etc, for 4 years
      > tapply(v, mos, mean) #take the mean of values in vector v by mos
                  1             2             3             4             5 
      -0.7616624170 -0.4196531309  0.1366554601 -0.1670395139 -0.0954241388 
                  6             7             8             9            10 
       0.1867522250 -0.1505984224 -0.0897725216 -0.0005245822 -0.0870436711 
                 11            12 
       0.5518353674 -0.0652350665 
      

      将此应用于您的示例,您可以通过查看月份 %% 12(月 mod 12)、s.t december = 0、jan =1 等来进行分组

      > ddd1 %% 12
           Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
      1960   1   2   3   4   5   6   7   8   9  10  11   0
      1961   1   2   3   4   5   6   7   8   9  10  11   0
      1962   1   2   3   4   5   6   7   8   9  10  11   0
      1963   1   2   3   4   5   6   7   8   9  10  11   0
      1964   1   2   3   4   5   6   7   8   9  10  11   0
      1965   1   2   3   4   5   6   7   8   9  10  11   0
      1966   1   2   3   4   5   6   7   8   9  10  11   0
      1967   1   2   3   4   5   6   7   8   9  10  11   0
      1968   1   2   3   4                                
      > tapply(ddd,ddd1 %% 12, mean)
       0  1  2  3  4  5  6  7  8  9 10 11 
      54 49 50 51 52 47 48 49 50 51 52 53 
      

      还有我最喜欢的版本:使用 plyr

      > ddply(data.frame(mo=ddd1%%12, val=ddd), .(mo), summarize, mean=mean(val), median=median(val), min=min(val), max=max(val))
         mo mean median min max
      1   0   54     54  12  96
      2   1   49     49   1  97
      3   2   50     50   2  98
      4   3   51     51   3  99
      5   4   52     52   4 100
      6   5   47     47   5  89
      7   6   48     48   6  90
      8   7   49     49   7  91
      9   8   50     50   8  92
      10  9   51     51   9  93
      11 10   52     52  10  94
      12 11   53     53  11  95
      

      您可以使用tapply 重新创建相同的结果(尽管以列表形式),如下所示,但我倾向于发现ddplydata.frame 的输出更适合进一步分析

      tapply(ddd, ddd1%%12, function(x) c(mean=mean(x), median=median(x), min=min(x), max=max(x)))
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2021-07-15
      • 2014-08-18
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多