我在R中制作了一个非常脏的自相关函数版本。
我有一个循环,可以达到指定的最大滞后,然后像acf()函数一样将所有相关作为矩阵返回。
想法是复制acf()函数的输出,如下所示:
Autocorrelations of series ‘acfData’, by lag
0 1 2 3 4 5 6 7 8
1.000 -0.038 0.253 0.266 0.250 0.267 -0.182 0.281 -0.013
9 10 11 12 13
-0.067 -0.122 -0.115 -0.023 -0.337
到目前为止,我所输入的是数据,指定的最大延迟,然后代码通过将数据框滑回所需的量,然后在必要的数据范围内执行协方差和标准偏差计算,来在该范围内工作矩阵。在滞后范围内重复此操作,然后将其附加到所示的矩阵上,我还包括cor()函数以及创建用于测试的数据帧。
我的问题是代码为第一个循环或幻灯片返回正确的值,然后从此以后返回略有错误的值。
myAcf <- function(dat, lg){
dataF <- data.frame("data" = dat)
names(dataF)[1] <- "acfData"
lagMat <- c()
testMat <- c()
for(i in 0:lg){
dataLag <- slide(dataF, "acfData", slideBy = -i)
covacf <- cov(dataLag[(1+i):nrow(dataLag[1]), 1], dataLag[(1+i):nrow(dataLag[1]), 2])
sd1 <- sd(dataLag[(1+i):nrow(dataLag[1]), 1])
sd2 <- sd(dataLag[(1+i):nrow(dataLag[1]), 2])
corrCalc <- covacf/(sd1 * sd2)
lagMat <- c(lagMat, corrCalc)
a <- cor(dataLag[(1+i):nrow(dataLag[1]), 1], dataLag[(1+i):nrow(dataLag[1]), 2])
testMat <- c(testMat, a)
}
plot(lagMat)
return(list(lagMat, testMat))
}
然后,我的代码返回与acf()函数输入相同的数据:
[[1]]
[1] 1.00000000 -0.03786539 0.27700596 0.30197418 0.31009956
[6] 0.37123797 -0.19520518 0.44399863 0.05684766 0.02063488
[11] -0.03724332
[[2]]
[1] 1.00000000 -0.03842146 0.27502462 0.29292583 0.35052131
[6] 0.40931426 -0.23637159 0.52320559 0.07270497 0.02555461
[11] -0.04524035
非常感谢您的帮助!