Dejar ser un proceso estocástico formado mediante la concatenación de dibujos iid de un proceso AR (1), donde cada dibujo 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 primeras 10 observaciones; etcétera.
¿Cuál será el ACF de -- llámalo -- ¿parece? Esperaba que fuera cero para los retrasos 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 lejos de cero después del retraso 10?
Mi conjetura inicial fue que el quemado en arima.sim era demasiado corto, pero obtengo un patrón similar cuando configuro explícitamente, por ejemplo, burn_in = 500.
¿Qué me estoy perdiendo?
Editar : Tal vez el enfoque en concatenar 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()
Estoy sorprendido por los grandes bloques de autocorrelaciones significativamente distintas de cero en retrasos tan largos (donde el verdadero ACF es esencialmente cero). ¿Debo ser?
Otra edición : quizás todo lo que está sucediendo aquí es que , el ACF estimado, en sí mismo está extremadamente autocorrelacionado. Por ejemplo, aquí está la distribución conjunta de , cuyos valores verdaderos 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)