【问题标题】:R Rolling average from irregular time seriesR来自不规则时间序列的滚动平均值
【发布时间】:2017-01-29 12:19:47
【问题描述】:

这些年来我已经多次遇到过这个问题,所以也许我只是误解了某些东西,或者只是对此感到愚蠢。在对不规则时间序列进行滚动平均时,我遇到了一个奇怪的问题。包和简单脚本中可用方法的一个很好的概述在这里:Calculating moving average in R

我可能误读了其中一些,但我发现处理不规则时间序列时存在问题。例如,zoo 包中的滚动均值的常用方法需要每个数据的唯一值。但在这种情况下,这不是滚动平均值,而是每个时间单位平均值的滚动平均值 - 时间单位越少的数据点对平均值的影响越大。

在我看来,真正的移动平均线不需要使用聚合,而是需要使用每个计算点的分布。

鉴于我有以下数据框或不规则值,我如何才能最好地为每个值创建移动平均度量。

df <- data.frame(year = c(rep(2000,3),rep(2001,1),rep(2004,4),rep(2005,3),+
      rep(2006,3),rep(2007,1),rep(2008,2),rep(2009,6),rep(2010,8)),+
      value1=rnorm(31), value2=rnorm(31), value3=rnorm(31))

我找到了一种通过子集化的简单方法,我将把它作为初始答案发布,但这在有限的情况下有效,并且每次都需要自定义。我想知道什么是通用解决方案。此外,如果有人能够评论在滚动均值计算中使用平均值与分布平均值的做法,那将非常有帮助。谢谢!

【问题讨论】:

    标签: r time-series mean rolling-computation


    【解决方案1】:

    不规则时间序列的滑动或滚动窗口内的计算可以通过在非等值连接中聚合的能力来解决

    类似的问题还有很多,例如r calculating rolling average with window based on value (not number of rows or date/time variable)Rolling regression on irregular time series

    但是,这个问题是不同的,因此值得单独回答。从OP's own answer 可以得出结论,OP 正在寻找一个居中的滚动窗口。此外,还要计算多列的滚动平均值。

    library(data.table)
    cols <- c("value2", "value3")
    setDT(df)[SJ(year = (min(year) + 2):(max(year) - 2))[, c("start", "end") := .(year - 2, year + 2)],
       on = .(year >= start, year < end),
       c(.(year = i.year), lapply(.SD, mean)), .SDcols = cols, by = .EACHI][, -(1:2)]
    
       year      value2      value3
    1: 2002  0.57494219 -0.53001134
    2: 2003  0.33925292  0.75541896
    3: 2004 -0.05834453  0.23987209
    4: 2005  0.17031099  0.13074666
    5: 2006  0.05272739  0.09297215
    6: 2007 -0.12935805 -0.38780964
    7: 2008  0.19716437 -0.11587017
    

    结果与 OP 自己的结果 rmeans 相同。

    数据

    set.seed(123)   # ensure reproducible sample data
    df <- data.frame(
      year = rep(2000:2010, c(3, 1, 0, 0, 4, 3, 3, 1, 2, 6, 8)),
      value1 = rnorm(31), value2 = rnorm(31), value3 = rnorm(31))
    

    【讨论】:

    • 这个问题似乎已经很古老了,但非常感谢!这看起来非常有效。 :) 从那时起,我也搬到了 data.table,并使用了类似但不太紧凑的策略。
    【解决方案2】:

    所以这是我想出的简单子集。如果有人发现自己发现了相同的问题,可能会有所帮助:

    df <- data.frame(year = c(rep(2000,3),rep(2001,1),rep(2004,4),rep(2005,3), +
    rep(2006,3),rep(2007,1),rep(2008,2),rep(2009,6),rep(2010,8)), +
    value1=rnorm(31), value2=rnorm(31), value3=rnorm(31))
    
    rmeans <- data.frame()
    for (i in (min(df$year)+2):(max(df$year)-2)){
      rmeans <- rbind(rmeans, data.frame(year=i,as.data.frame.list(colMeans(df +
    [df$year>=(i-2)&df$year<(i+2),-c(1,2)]))))
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2019-03-30
      • 2013-02-26
      相关资源
      最近更新 更多