您可以使用一些矩阵代数来避免此循环。假设原始数据是一个向量(a_1, a_2, a_3, ..., a_n)
我们想要创建 EWMA 方差(x_1, x_2, x_3, ..., x_n)
根据你的定义。让d
为衰减因子。如果我正确理解你的代码,你目前有一个递归定义
这让事情变得困难。我相信这个非递归定义是相同的
这使我们能够利用一些线性代数来完成矩阵乘法的工作。为了简洁起见,我将为您的 data.frame 和衰减因子分配较短的变量名称
dd <- base_retorno_diario
d <- DECAY_FACTOR
现在我们首先计算所有平方值,然后采用我们可以看到的成对差值,这是非递归定义的一部分。
asquare <- as.matrix(dd[,2:7])^2
asqdiffs <-sapply(data.frame(asquare), diff)
现在我们创建一个适当的矩阵,其值为d
取非递归定义的求和部分,然后执行减法(初始项有一点偏移)
dx <- outer(1:nrow(asqdiffs), 1:nrow(asqdiffs), FUN=function(x,y)
ifelse(x>=y, d^(x-y+1),0 )
)
EWMA_VARIANCE <- asquare - rbind(0, dx %*% asqdiffs)
这个方法似乎产生了与你相同的结果,但在我的测试中它快了大约 20 倍。