【问题标题】:iteratively calculating an exponentially weighted moving average using dplyr使用 dplyr 迭代计算指数加权移动平均值
【发布时间】:2016-08-31 22:42:50
【问题描述】:

我有一个看起来像这样的表:

  cat1 cat2         d
1    A    C 0.6445386
2    B    D 0.1831454
3    A    C 0.5093117
4    A    D 0.3516816
5    B    C 0.2547064
6    A    D 0.3209060

我想计算 cat1 和 cat2 的指数加权移动平均值。

使用零初始值,这将类似于:

table %>% 
          group_by(cat1,cat2) %>% 
          arrange(cat1,cat2) %>% 
          mutate(ema = (1-lambda)*ema+lambda*lag(ema,1,default=0)

但这会返回错误:

Error in (1 - lambda) * ema + lambda * lag(ema, 1, default = 0) : 
  object 'ema' not found

我该如何解决这个问题?使用 dplyr 不能引用以前的迭代吗?

【问题讨论】:

  • 试试TTR包中的EMA功能。
  • 我认为不可能在 dplyr 中引用以前的迭代

标签: r


【解决方案1】:

当你第一次引用ema时,它没有被初始化,所以没有名为ema的对象

在您的代码中 mutate(ema = (1-lambda) * ema+lambda * lag(ema,1,default=0)

那个粗体的ema是自引用的,可能你要找的公式是这样的:(1-lambda)*d + lambda*lag(ema),所以我在解决方案中使用了这个

library(dplyr)
table <- data.frame(cat1 = c("A","B","A","A","B","A"),
                    cat2 = c("C","D","C","D","C","D"),
                    d = c(0.1831454, 0.5093117, 0.3516816 ,0.2547064 ,0.3209060,0.6445386))

lambda <- 0.55
table$ema <- NA
table$ema[1] <- table$d[1]

table %>% 
  group_by(cat1,cat2) %>% 
  arrange(cat1,cat2)

for(i in (2:dim(table)[1])){
  table$ema[i] <- table$d[i]*(1-lambda) + lambda*(table$ema[i-1])
}

这是你要找的吗?

编辑:更改了代码

【讨论】:

  • 当我运行你的代码时,我得到 table$ema[1]=.45,所有其他索引的 table$ema=NA - 这似乎不起作用?
  • 是的,我昨天很着急,抱歉。所以这里的问题又是我们指的是 NA ema,我搜索了一下,但找不到管道方法来做到这一点。还有一件事,您使用的 EMA 公式是自引用的,正确的公式可能是这个 (1-lambda)*d+lambda*lag(ema),所以我将在我的解决方案中使用这个公式
  • 是的 - 我以同样的方式解决了它,但正在寻找使用 mutate/dplyr 的替代方法。我认为您的解决方案不适用于我的特定情况,因为存在按变量分组,因此您需要重置种子。不过不用担心,我已经写了,稍后会发布我的解决方案。
猜你喜欢
  • 2018-01-06
  • 2017-02-06
  • 2017-09-16
  • 2023-04-07
  • 1970-01-01
  • 2012-04-26
  • 2011-02-12
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多