[英]iteratively calculating an exponentially weighted moving average using dplyr
我有一張桌子,看起來像:
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引用先前的迭代?
首次引用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])
}
這是你想要的 ?
編輯:更改代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.