计算加权滚动平均值R

6
我有一个数据框/数据表格,有两列数据,一列是水平(level),另一列是体积(volume)。我想要计算水平的滚动加权平均值,使用体积作为权重(标准化为1),应用于某个滚动窗口。
基本的R语言有一个weighted.mean()函数,可以对两个静态向量进行类似的计算。我试图使用sapply将一个参数列表/向量传递给它,并创建一个滚动系列,但没有成功。
我应该使用哪种"apply"机制与weighted.mean()一起使用才能得到所需的结果,还是我必须循环/编写自己的函数?
P.S.最后,我选择了编写简单的定制函数,利用了优秀的RccpRoll包。我发现RccpRoll非常快速,比其他滚动方法要快得多,这对我来说非常重要,因为我的数据有数百万行。
函数代码如下(我在开头添加了一些NA,因为RccpRoll返回没有NA的数据):
require(RcppRoll)
my.rollmean.weighted <- function(vec1,vec2,width){
   return(c(rep(NA,width-1),roll_sum(vec1*vec2,width)/roll_sum(vec2,width)))
}

1
我可能漏掉了什么,但在我看来,所有这些函数似乎都使用1个参数进行滚动,即X是参数,其他所有内容都是参数,而在这里,我需要一个具有多个(2)参数的函数,这些参数在计算中相关,不像您传递2列,它按列计算。当然,我可以先创建一个产品重量*级别的列/向量,然后对其应用滚动总和,并除以权重的滚动总和-这并不是火箭科学。我正在寻找更优雅的解决方案。RccpRoll看起来很棒,谢谢! - flipper
rollapply并不要求您将受作用的对象转换为zoo。 - G. Grothendieck
@flipper,不是只有逐列才能使用rollapply。 - G. Grothendieck
@flipper 你使用了 RcppRoll 包的哪个函数来计算加权滚动平均值? - Julien
我刚刚发现了 RcppRoll::roll_mean 函数。它能像 rollapply 一样处理数据框吗? - Julien
显示剩余6条评论
2个回答

6

我认为这个方法可能是有效的。它采用了rollapply文档中展示的滚动回归技术。关键在于by.column=FALSE。这提供了一个基于滚动的所有列的矩阵。

  require(zoo)

  df <- data.frame(
    price = cumprod(1 + runif(1000,-0.03,0.03)) * 25,
    volume = runif(1000,1e6,2e6)
  )

  rollapply(
    df,
    width = 50,
    function(z){
      #uncomment if you want to see the structure
      #print(head(z,3))
      return(
        weighted_mean = weighted.mean(z[,"price"],z[,"volume"])
      )
    },
    by.column = FALSE,
    align = "right"
  )

如果不能正常工作或不够清晰,请让我知道。


1
非常感谢。我明白了,但对我不起作用。查看调试 - 由于某种原因,它尝试按10个列的块对原始数据表进行子集处理,当然在某些子集中会错过相关列。也许我又错过了什么:( 我想我只能使用额外的列来完成它。 - flipper
如何在此代码中使用 partial = TRUE - Julien
如何在这段代码中使用 partial = TRUE - undefined

-1
这是一个可能会有帮助的代码片段。它使用了来自zoo包的rollmean函数,并且间隔为两个(您选择间隔)。您将使用weighted.mean函数计算变量,我假设:
library(zoo) # for the rollmean() function

movavg <- rollmean(df$weightedVariable, k = 2, align = "right")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接