簡體   English   中英

使用dplyr迭代計算指數加權移動平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM