【问题标题】:Rolling weighted average in R (multiple observations)R中的滚动加权平均值(多个观察值)
【发布时间】:2019-02-22 14:48:22
【问题描述】:

是否有任何快速函数能够计算加权的滚动平均值?这是必要的,因为我对每个数据点(以秒为单位)进行了多次观察(并不总是相同的数量),并且我平均了。当我取滚动平均值时,我想重新加权以获得无偏的滚动平均值。

到目前为止,我想出了这个解决方案(在这个例子中,窗口为 3 秒)。

sam <- data.table(val_mean=c(1:15),N=c(11:25))

sam[,weighted:=val_mean*N]

sam[,rollnumerator:=rollapply(weighted,3,sum,fill=NA,align="left")]

sam[,rolldenominator:=rollapply(N,3,sum,fill=NA,align="left")]

sam[,rollnumerator/rolldenominator]

我找不到任何已解决此问题的问题。

这与数据的不等间距无关:我可以通过使用 NA 扩展我的 data.table 以包含每秒(上面的示例是等间距的)来解决这个问题。另外,我不想包含 RcppRoll 的 roll_mean 意义上的权重:在那里,所有时间窗口的权重都是固定的(“长度为 n 的向量,为 窗口内的每个元素提供权重 ."),而在我的情况下,权重会根据当前处理的值而变化。第三,我不想要自适应窗口大小,它应该保持固定(比如 3 秒)。

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    1) 使用by.column = FALSE

    library(data.table)
    library(zoo)
    
    wmean <- function(x) weighted.mean(x[, 1], x[, 2])
    sam[, rollapplyr(.SD, 3, wmean, by.column = FALSE, fill = NA, align = "left")]
    

    2) 另一种方法是将值和权重编码为复向量:

    wmean_cmplx <- function(x) weighted.mean(Re(x), Im(x))
    sam[, rollapply(complex(real = val_mean, imag = N), 3, wmean_cmplx, 
      fill = NA, align = "left")]
    

    【讨论】:

    • 谢谢! 1) 是一个很好的解决方案,我完全忽略了这个选项,速度对我的用例来说应该不是什么大问题
    猜你喜欢
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多