Fórmula ACF y PACF

18

Quiero crear un código para trazar ACF y PACF a partir de datos de series temporales. Al igual que esto generó la trama de minitab (abajo).

Trazado ACF

Trazado PACF

He intentado buscar la fórmula, pero todavía no la entiendo bien. ¿Te importaría decirme la fórmula y cómo usarla, por favor? ¿Cuál es la línea roja horizontal en el gráfico ACF y PACF anterior? Cual es la formula?

Gracias,

Surya Dewangga
fuente
1
@javlacalle ¿Es correcta la fórmula que proporciona? No funcionaría si ¿verdad? ¿Debería ser como el siguiente? $$ \ rho (k) = \ frac {\ frac {1} {nk} \ sum_ {t = k + 1} ^ n (y_t - \ bar {y}) (y_ {tk} - \ bar {y} )} {\ sqrt {\ frac {1} {n} \ sum_ {t = 1} ^ n (y_t - \ bar {y}) ^ 2} \ sqrt {\ frac {1} {nk} \ sum_ {t = k + 1} ^ n (y_ {tk} - \ bar {y}) ^ 2}} \ ,,
ρ(k)=1n-kt=k+1norte(yt-y¯)(yt-k-y¯)1nortet=1norte(yt-y¯)1norte-kt=k+1norte(yt-k-y¯),
t=1n(yty¯)<0and/ort=k+1n(ytky¯)<0
conighion
@conighion Tienes razón, gracias. No lo vi antes. Lo he arreglado
javlacalle

Respuestas:

33

Autocorrelaciones

La correlación entre dos variables se define como:y1,y2

ρ=E[(y1μ1)(y2μ2)]σ1σ2=Cov(y1,y2)σ1σ2,

donde E es el operador esperado, μ1 y μ2 son las medias respectivamente para y1 e y2 y σ1,σ2 son sus desviaciones estándar.

En el contexto de una sola variable, es decir, autocorrelación , y1 es la serie original e y2 es una versión retrasada de la misma. Tras la definición anterior, autocorrelaciones de muestra de orden k=0,1,2,...se puede obtener calculando la siguiente expresión con la observada serie yt , t=1,2,...,n :

ρ(k)=1nkt=k+1n(yty¯)(ytky¯)1nt=1n(yty¯)21nkt=k+1n(ytky¯)2,

donde y¯ es la media muestral de los datos.

Autocorrelaciones parciales

Las autocorrelaciones parciales miden la dependencia lineal de una variable después de eliminar el efecto de otras variables que afectan a ambas variables. Por ejemplo, la autocorrelación parcial de orden mide el efecto (dependencia lineal) de yt2 en yt después de eliminar el efecto de yt1 en yt y yt2 .

Cada autocorrelación parcial podría obtenerse como una serie de regresiones de la forma:

y~t=ϕ21y~t1+ϕ22y~t2+et,

donde y~t es la serie original menos la media muestral, yty¯ . La estimación de ϕ22 dará el valor de la autocorrelación parcial de orden 2. Extendiendo la regresión con k rezagos adicionales, la estimación del último término dará la autocorrelación parcial de orden k .

Una forma alternativa de calcular las autocorrelaciones parciales de la muestra es resolviendo el siguiente sistema para cada orden k :

(ρ(0)ρ(1)ρ(k1)ρ(1)ρ(0)ρ(k2)ρ(k1)ρ(k2)ρ(0))(ϕk1ϕk2ϕkk)=(ρ(1)ρ(2)ρ(k)),

donde ρ() son las autocorrelaciones de muestra. Este mapeo entre las autocorrelaciones de muestra y las autocorrelaciones parciales se conoce como la recursión de Durbin-Levinson . Este enfoque es relativamente fácil de implementar para ilustración. Por ejemplo, en el software R, podemos obtener la autocorrelación parcial de orden 5 de la siguiente manera:

# sample data
x <- diff(AirPassengers)
# autocorrelations
sacf <- acf(x, lag.max = 10, plot = FALSE)$acf[,,1]
# solve the system of equations
res1 <- solve(toeplitz(sacf[1:5]), sacf[2:6])
res1
# [1]  0.29992688 -0.18784728 -0.08468517 -0.22463189  0.01008379
# benchmark result
res2 <- pacf(x, lag.max = 5, plot = FALSE)$acf[,,1]
res2
# [1]  0.30285526 -0.21344644 -0.16044680 -0.22163003  0.01008379
all.equal(res1[5], res2[5])
# [1] TRUE

Bandas de confianza

Las bandas de confianza se pueden calcular como el valor de las autocorrelaciones de la muestra ±z1α/2n , dondez1α/2es el cuantil1α/2en la distribución gaussiana, por ejemplo, 1.96 para bandas de confianza del 95%.

A veces se utilizan bandas de confianza que aumentan a medida que aumenta el orden. En estos casos, las bandas se pueden definir como ±z1α/21n(1+2i=1kρ(i)2).

javlacalle
fuente
1
(+1) ¿Por qué las dos bandas de confianza diferentes?
Scortchi - Restablece a Monica
2
@Scortchi Las bandas constantes se usan cuando se prueba la independencia, mientras que las bandas crecientes a veces se usan al identificar un modelo ARIMA.
javlacalle
1
Los dos métodos para calcular las bandas de confianza se explican con un poco más de detalle aquí .
Scortchi - Restablece a Monica
Explicación perfecta!
Jan Rothkegel el
1
@javlacalle, ¿la expresión para omite cuadrados en el denominador? ρ(k)
Christoph Hanck
9

"Quiero crear un código para trazar ACF y PACF a partir de datos de series temporales".

Aunque el OP es un poco vago, posiblemente esté más orientado a una formulación de codificación de estilo "receta" que a una formulación de modelo de álgebra lineal.


tt1tst333

Ejemplo:

Prepararemos una serie temporal con un patrón de seno cíclico superpuesto en una línea de tendencia y ruido, y trazaremos el ACF generado por R. Obtuve este ejemplo de una publicación en línea de Christoph Scherber, y le agregué el ruido:

x=seq(pi, 10 * pi, 0.1)
y = 0.1 * x + sin(x) + rnorm(x)
y = ts(y, start=1800)

ingrese la descripción de la imagen aquí

Por lo general, tendríamos que probar los datos para la estacionariedad (o simplemente mirar el gráfico anterior), pero sabemos que hay una tendencia en él, así que omita esta parte y pasemos directamente al paso de tendencia:

model=lm(y ~ I(1801:2083))
st.y = y - predict(model)

ingrese la descripción de la imagen aquí

Ahora estamos listos para abordar esta serie de tiempo generando primero el ACF con la acf()función en R, y luego comparando los resultados con el ciclo improvisado que armé:

ACF = 0                  # Starting an empty vector to capture the auto-correlations.
ACF[1] = cor(st.y, st.y) # The first entry in the ACF is the correlation with itself (1).
for(i in 1:30){          # Took 30 points to parallel the output of `acf()`
  lag = st.y[-c(1:i)]    # Introducing lags in the stationary ts.
  clipped.y = st.y[1:length(lag)]    # Compensating by reducing length of ts.
  ACF[i + 1] = cor(clipped.y, lag)   # Storing each correlation.
}
acf(st.y)                            # Plotting the built-in function (left)
plot(ACF, type="h", main="ACF Manual calculation"); abline(h = 0) # and my results (right).

ingrese la descripción de la imagen aquí


tst4tsttst1tst2tst3tst4tsttst1+tst2+tst3+tst4 tst4

PACF = 0          # Starting up an empty storage vector.
for(j in 2:25){   # Picked up 25 lag points to parallel R `pacf()` output.
  cols = j        
  rows = length(st.y) - j + 1 # To end up with equal length vectors we clip.

  lag = matrix(0, rows, j)    # The storage matrix for different groups of lagged vectors.

for(i in 1:cols){
  lag[ ,i] = st.y[i : (i + rows - 1)]  #Clipping progressively to get lagged ts's.
}
  lag = as.data.frame(lag)
  fit = lm(lag$V1 ~ . - 1, data = lag) # Running an OLS for every group.
  PACF[j] = coef(fit)[j - 1]           # Getting the slope for the last lagged ts.
}

Y finalmente graficando de nuevo lado a lado, generados por R y cálculos manuales:

ingrese la descripción de la imagen aquí

Se puede ver que la idea es correcta, además de posibles problemas computacionales, en comparación PACFcon pacf(st.y, plot = F).


codificar aquí .

Antoni Parellada
fuente
1

Bueno, en la práctica encontramos error (ruido) que está representado por mit las bandas de confianza lo ayudan a determinar si un nivel puede considerarse solo como ruido (porque aproximadamente el 95% de las veces estará dentro de las bandas).

usuario120580
fuente
Bienvenido a CV, es posible que desee considerar agregar información más detallada sobre cómo OP haría esto específicamente. ¿Quizás también agregar información sobre lo que representa cada línea?
Repmat
1

Aquí hay un código de Python para calcular ACF:

def shift(x,b):
    if ( b <= 0 ):
        return x
    d = np.array(x);
    d1 = d
    d1[b:] = d[:-b]
    d1[0:b] = 0
    return d1

# One way of doing it using bare bones
# - you divide by first to normalize - because corr(x,x) = 1
x = np.arange(0,10)
xo = x - x.mean()

cors = [ np.correlate(xo,shift(xo,i))[0]  for i in range(len(x1)) ]
print (cors/cors[0] )

#-- Here is another way - you divide by first to normalize
cors = np.correlate(xo,xo,'full')[n-1:]
cors/cors[0]
Sada
fuente
El formato del código Hmmm era malo:
Sada