使用for循环提取自相关重要系数列表时R中的错误-时间序列

问题描述 投票:0回答:3

我正在尝试运行一个 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")

如有任何建议,我将不胜感激!

r for-loop time-series confidence-interval autocorrelation
3个回答
1
投票

这是一个使用 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  

0
投票

如果您假设滞后值是白噪声,此代码将计算 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))
  }
}

0
投票

您遇到的错误是由于置信区间 (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 的地方缺少值”错误,并在缺少置信区间时提供更多信息反馈。

© www.soinside.com 2019 - 2024. All rights reserved.