这是我试图用R计算的公式。
到目前为止,这是我使用简化示例的方法
t <- seq(1, 2, 0.1)
expk <- function(k){exp(-2*pi*1i*t*k)}
set.seed(123)
dat <- ts(rnorm(100), start = c(1994,3), frequency = 12)
arfit <- ar(dat, order = 4, aic = FALSE) # represent \phi in the formula
tmp1 <- numeric(4)
for (i in seq_along(arfit$ar)){
ek <- expk(i)
arphi <- arfit$ar[i]
tmp1[i] <- ek * arphi
}
tmp2 <- sum(tmp1)
denom = abs(1-tmp2)^2
s2 <- t/denom
错误:警告消息: 在tmp1 [i]&lt; - ek * arphi中: 要替换的项目数量不是替换长度的倍数
我试图避免使用for循环并尝试使用sapply,就像在question的解决方案中一样。
denom2 <- abs(1- sapply(seq_along(arfit$ar), function(x)sum(arfit$ar[x]*expf(x))))^2
但似乎不正确。问题是在从另一个向量中获取值时,对序列的总和(在索引k上),在这种情况下,t在分子中。 任何解决方案?
对测试数据集的任何建议,可能使用0和1检查此循环中的计算是否正确完成?
答案 0 :(得分:1)
键入聊天中确定的答案。这是一个涉及vapply
的解决方案。
首先将expk
更正为:
expk <- function(k){sum(exp(-2*pi*1i*t*k))}
然后你可以创建这个函数并vapply
:
myFun <- function(i) return(expk(i) * arfit$ar[i])
tmp2 <- sum(vapply(seq_along(arfit$ar), myFun, complex(1)))