【问题标题】:Computing a weighted rolling average R [duplicate]计算加权滚动平均值 R [重复]
【发布时间】:2014-07-09 06:51:40
【问题描述】:

假设我在 dataframe/data.table 中有两列,一列是级别,另一列是卷。我想计算级别的滚动平均值,按体积加权,因此体积充当某些滚动窗口的权重(归一化为 1)。

Base R 有一个 weighted.mean() 函数,它对两个静态向量进行类似的计算。我尝试使用 sapply 将列表/向量 fo 参数传递给它并创建一个 rollign 系列,但无济于事。

我应该与 weighted.mean() 一起使用哪种“应用”机制来获得所需的结果,或者我必须循环/编写自己的函数?

/////////////////////////////////////// //////////////////////////////////////////

附:最后我决定编写简单的自定义函数,它利用了伟大的 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)))
}

【问题讨论】:

  • 看看rollapply?是否适合您的需求
  • rollapply 是 Zoo 的一部分,它是否适用于非 Zoo 对象?它似乎使用 rollapply 的一个版本,我必须将所有内容都转换为 zoo,然后再返回。以及如何滚动使用两个向量作为输入的函数的问题仍然是开放的 - 默认情况下,rollaplly 只使用一个输入,还是我错了?
  • 你看过包裹RcppRoll吗?
  • 不,谢谢,我去看看。

标签: r


【解决方案1】:

我认为这可能有效。它采用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"
  )

如果它不起作用或不清楚,请告诉我。

【讨论】:

  • 非常感谢。我明白了,但对我不起作用。查看调试 - 出于某种原因,它尝试按 10 个块的列对原始数据表进行子集化,当然它只是错过了某些子集中的相关列。再次可能是我错过了一些东西:(我想我只需要使用一个额外的列并以这种方式完成它。
【解决方案2】:

这是一个可能有帮助的代码 sn-p。它使用 zoo 包中的 rollmean 函数和两个间隔(你选择间隔)。我假设您将使用 weighted.mean 函数计算的变量:

library(zoo) # for the rollmean() function

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2012-06-14
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多