Soit un processus stochastique formé en concaténant les tirages iid d'un processus AR (1), où chaque tirage est un vecteur de longueur 10. En d'autres termes, sont des réalisations d'un processus AR (1); sont tirés du même processus, mais sont indépendants des 10 premières observations; etc.
À quoi ressemblera l'ACF de - appelez-le ? Je m'attendais à ce que soit nul pour les retards de longueur puisque, par hypothèse, chaque bloc de 10 observations est indépendant de tous les autres blocs.
Cependant, lorsque je simule des données, j'obtiens ceci:
simulate_ar1 <- function(n, burn_in=NA) {
return(as.vector(arima.sim(list(ar=0.9), n, n.start=burn_in)))
}
simulate_sequence_of_independent_ar1 <- function(k, n, burn_in=NA) {
return(c(replicate(k, simulate_ar1(n, burn_in), simplify=FALSE), recursive=TRUE))
}
set.seed(987)
x <- simulate_sequence_of_independent_ar1(1000, 10)
png("concatenated_ar1.png")
acf(x, lag.max=100) # Significant autocorrelations beyond lag 10 -- why?
dev.off()
Pourquoi y a-t-il des autocorrélations si loin de zéro après le décalage 10?
Ma supposition initiale était que le burn-in dans arima.sim était trop court, mais j'obtiens un modèle similaire lorsque je définis explicitement par exemple burn_in = 500.
Qu'est-ce que je rate?
Edit : Peut-être que l'accent sur la concaténation des AR (1) est une distraction - un exemple encore plus simple est le suivant:
set.seed(9123)
n_obs <- 10000
x <- arima.sim(model=list(ar=0.9), n_obs, n.start=500)
png("ar1.png")
acf(x, lag.max=100)
dev.off()
Je suis surpris par les gros blocs d'autocorrélations significativement non nulles à de si longs décalages (où le véritable ACF est essentiellement nul). Dois-je l'être?
Un autre Edit : peut-être que tout ce qui se passe ici est que, l'ACF estimé, est lui-même extrêmement autocorrélé. Par exemple, voici la distribution conjointe de, dont les vraies valeurs sont essentiellement nulles ():
## Look at joint sampling distribution of (acf(60), acf(61)) estimated from AR(1)
get_estimated_acf <- function(lags, n_obs=10000) {
stopifnot(all(lags >= 1) && all(lags <= 100))
x <- arima.sim(model=list(ar=0.9), n_obs, n.start=500)
return(acf(x, lag.max=100, plot=FALSE)$acf[lags + 1])
}
lags <- c(60, 61)
acf_replications <- t(replicate(1000, get_estimated_acf(lags)))
colnames(acf_replications) <- sprintf("acf_%s", lags)
colMeans(acf_replications) # Essentially zero
plot(acf_replications)
abline(h=0, v=0, lty=2)