Dejemos que sea un proceso estocástico formado por la concatenación de extracciones iid de un proceso AR(1), donde cada extracción es un vector de longitud 10. En otras palabras, son realizaciones de un proceso AR(1); se extraen del mismo proceso, pero son independientes de las 10 primeras observaciones; etc.
¿Qué hará el ACF de -- llámalo -- ¿parece? Estaba esperando sea cero para los rezagos de longitud ya que, por supuesto, cada bloque de 10 observaciones es independiente de todos los demás bloques.
Sin embargo, cuando simulo datos, obtengo esto:
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()
¿Por qué hay autocorrelaciones tan alejadas de cero después del lag 10?
Mi suposición inicial era que el burn-in en arima.sim era demasiado corto, pero obtengo un patrón similar cuando establezco explícitamente, por ejemplo, burn_in=500.
¿Qué me falta?
Editar : Tal vez el enfoque en la concatenación de AR(1)s es una distracción - un ejemplo aún más simple es este:
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()
Me sorprenden los grandes bloques de autocorrelaciones significativamente no nulas en rezagos tan largos (donde la verdadera ACF es esencialmente cero). ¿Debería?
Otra edición : tal vez todo lo que está pasando aquí es que el ACF estimado, está a su vez extremadamente autocorrelacionado. Por ejemplo, aquí está la distribución conjunta de cuyos valores reales son esencialmente cero ( ):
## 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)
1 votos
Espero que mi respuesta te siga siendo útil, más de año y medio después. Al menos a mí me ayudó a mejorar mis conocimientos de R.