我正在尝试运行一个 for 循环以创建一个列表/数据框对象,该对象会给我一组与 0 显着不同的 ACF 系数(在置信区间之外)。我不太确定我的 for-loop 是否这样做,无论如何它给了我以下错误消息:
Error in if (acf_res$ci[2, i + 1] < acf_res$acf[i + 1] || acf_res$ci[1, :
missing value where TRUE/FALSE needed
这是我当前的代码,我正在研究 1981 年至 1999 年法国电力生产的单变量时间序列:
production_periode_1 <-periode_1$`Production brute d'électricité nucléaire (en GWh)`
prod_periode_1 <- ts(periode_1, frequency=12)
prod_periode_1 <- ts(production_periode_1, start=c(1981,1) , end=c(1999,12),
frequency=12)
summary(prod_periode_1)
plot.ts(prod_periode_1)
plot(ts.union(prod_periode_1,log(prod_periode_1)))
acf(prod_periode_1,lag.max=150)
acf(diff(prod_periode_1),lag.max=150)
acf(diff(diff(prod_periode_1,12)),lag.max=150)
pacf(prod_periode_1, lag.max = 250)
pacf(diff(prod_periode_1), lag.max = 250)
pacf(diff(diff(prod_periode_1,12), lag.max = 250))
for (i in 1:228) {
acf_res <- acf(prod_periode_1, lag.max = i, plot = FALSE)
if (acf_res$ci[2, i+1] < acf_res$acf[i+1] || acf_res$ci[1, i+1] > acf_res$acf[i+1]) {
print(paste("Coefficient significatif pour lag", i))
} else {
print(paste("Pas de coefficient significatif pour lag", i))
}
}
这是我的数据集的可重复性结构:
structure(c(36509.514, 34485.002, 33702.518, 31274.906, 30241.116,
31542.381), tsp = c(1981, 1981.41666666667, 12), class = "ts")
如有任何建议,我将不胜感激!
这是一个使用 tidyverse 的提议,它避免了循环。这个想法是设置一个 tibble(一个具有附加功能的数据框),按照
plot.acf()
计算 CI 并使用其列检查 CI 排除。
library(tidyverse)
theacf <- acf(prod_periode_1)
tibble(
sample_ac = theacf$acf[, , 1],
CI_lower = -qnorm(.975)/sqrt(length(prod_periode_1)),
CI_upper = -CI_lower,
significant = !between(sample_ac, CI_lower, CI_upper)
)
对于您的示例数据,这会产生
# A tibble: 6 × 4
sample_ac CI_lower CI_upper significant
<dbl> <dbl> <dbl> <lgl>
1 1 -0.800 0.800 TRUE
2 0.495 -0.800 0.800 FALSE
3 0.0157 -0.800 0.800 FALSE
4 -0.403 -0.800 0.800 FALSE
5 -0.426 -0.800 0.800 FALSE
6 -0.181 -0.800 0.800 FALSE
如果您假设滞后值是白噪声,此代码将计算 95% 的置信区间:
ci <- 0.95
prod_periode_1 <- structure(c(36509.514, 34485.002, 33702.518, 31274.906, 30241.116,
31542.381), tsp = c(1981, 1981.41666666667, 12), class = "ts")
summary(prod_periode_1)
plot.ts(prod_periode_1)
plot(ts.union(prod_periode_1,log(prod_periode_1)))
acf(prod_periode_1,lag.max=150)
acf(diff(prod_periode_1),lag.max=150)
acf(diff(diff(prod_periode_1,12)),lag.max=150)
pacf(prod_periode_1, lag.max = 250)
pacf(diff(prod_periode_1), lag.max = 250)
pacf(diff(diff(prod_periode_1,12), lag.max = 250))
for (i in 1:228) {
acf_res <- acf(prod_periode_1, lag.max = i, plot = FALSE)
clim0 <- qnorm((1 + ci) / 2) / sqrt(acf_res$n.used)
if (-clim0 < acf_res$acf[i+1] || clim0 > acf_res$acf[i+1]) {
print(paste("Coefficient significatif pour lag", i))
} else {
print(paste("Pas de coefficient significatif pour lag", i))
}
}
您遇到的错误是由于置信区间 (acf_res$ci) 中缺少值所致。当 ACF 计算不提供某些滞后的置信区间时,就会发生这种情况。要解决此问题,您可以修改代码以在检查重要性时跳过缺失值。这是您的 for 循环的更新版本:
for (i in 1:228) {
acf_res <- acf(prod_periode_1, lag.max = i, plot = FALSE)
if (!is.na(acf_res$ci[2, i+1]) && !is.na(acf_res$ci[1, i+1])) {
if (acf_res$ci[2, i+1] < acf_res$acf[i+1] || acf_res$ci[1, i+1] > acf_res$acf[i+1]) {
print(paste("Coefficient significatif pour lag", i))
} else {
print(paste("Pas de coefficient significatif pour lag", i))
}
} else {
print(paste("Intervalles de confiance manquants pour lag", i))
}
}
在此更新的代码中,我们首先检查指定滞后的置信区间值 (acf_res$ci[2, i+1] 和 acf_res$ci[1, i+1]) 是否缺失 (NA)。如果它们没有丢失,我们将像以前一样进行重要性检查。如果它们丢失了,我们会打印一条消息,表明置信区间不适用于该滞后。
此修改应防止“需要 TRUE/FALSE 的地方缺少值”错误,并在缺少置信区间时提供更多信息反馈。