ACF- und PACF-Formel


17

Ich möchte einen Code zum Plotten von ACF und PACF aus Zeitreihendaten erstellen. Genau wie dieses erzeugte Diagramm aus Minitab (unten).

ACF-Plotten

PACF-Plotten

Ich habe versucht, die Formel zu durchsuchen, aber ich verstehe sie immer noch nicht gut. Würde es Ihnen etwas ausmachen, mir die Formel und deren Verwendung zu sagen? Was ist die horizontale rote Linie in den obigen ACF- und PACF-Diagrammen? Wie lautet die Formel?

Danke,


1
@javlacalle Ist die von Ihnen angegebene Formel korrekt? Es würde nicht funktionieren, wenn richtig? Sollte es so sein? $$ \ 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}} \ ,,n t = 1 ( y t - y ) < 0
ρ(k)=1n-kt=k+1n(yt-y¯)(yt-k-y¯)1nt=1n(yt-y¯)1n-kt=k+1n(yt-k-y¯),
t=1n(yt-y¯)<0und / odert=k+1n(yt-k-y¯)<0
conighion

@conighion Du hast recht, danke. Ich habe es vorher nicht gesehen. Ich habe es repariert.
Javlacalle

Antworten:


33

Autokorrelationen

Die Korrelation zwischen zwei Variablen ist definiert als:y1,y2

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

wobei E der Erwartungsoperator ist, sind und die für und und sind ihre Standardabweichungen.μ1μ2y1y2σ1,σ2

Im Kontext einer einzelnen Variablen, dh Autokorrelation , ist die ursprüngliche Reihe und ist eine verzögerte Version davon. Nach der obigen Definition können Beispielautokorrelationen der Ordnung erhalten werden, indem der folgende Ausdruck mit der beobachteten Reihe , wird :y1y2k=0,1,2,...ytt=1,2,...,n

ρ(k)=1n-kt=k+1n(yt-y¯)(yt-k-y¯)1nt=1n(yt-y¯)21n-kt=k+1n(yt-k-y¯)2,

Dabei ist der Stichprobenmittelwert der Daten.y¯

Teilweise Autokorrelationen

Partielle Autokorrelationen messen die lineare Abhängigkeit einer Variablen, nachdem die Auswirkungen anderer Variablen, die sich auf beide Variablen auswirken, beseitigt wurden. Beispielsweise misst die partielle Autokorrelation der Ordnung die Auswirkung (lineare Abhängigkeit) von auf nachdem die Auswirkung von sowohl auf als auch auf .yt-2ytyt-1ytyt-2

Jede partielle Autokorrelation könnte als eine Reihe von Regressionen der Form erhalten werden:

y~t=ϕ21y~t-1+ϕ22y~t-2+et,

Dabei ist die ursprüngliche Reihe abzüglich des Stichprobenmittelwerts, . Die Schätzung von ergibt den Wert der partiellen Autokorrelation der Ordnung 2. Wenn die Regression um zusätzliche Verzögerungen erweitert wird, ergibt die Schätzung des letzten Terms die partielle Autokorrelation der Ordnung .y~tyt-y¯ϕ22kk

Eine alternative Methode zur Berechnung der partiellen Autokorrelationen der Stichprobe besteht darin, das folgende System für jede Ordnung lösen :k

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

Dabei sind die Beispielautokorrelationen. Diese Zuordnung zwischen den Probenautokorrelationen und den Teilautokorrelationen ist als Durbin-Levinson-Rekursion bekannt . Dieser Ansatz ist zur Veranschaulichung relativ einfach zu implementieren. Zum Beispiel können wir in der R-Software die partielle Autokorrelation der Ordnung 5 wie folgt erhalten:ρ()

# 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

Vertrauensbereiche

Konfidenzbänder können als Wert der Stichproben-Autokorrelationen berechnet werden , wobei das Quantil in der Gaußschen Verteilung, zB 1,96 für 95% -Konfidenzbänder.±z1-α/2nz1-α/21-α/2

Manchmal werden Konfidenzbänder verwendet, die mit zunehmender Reihenfolge zunehmen. In diesem Fall können die Bänder definiert werden als .±z1-α/21n(1+2ich=1kρ(ich)2)


1
(+1) Warum die zwei verschiedenen Vertrauensbereiche?
Scortchi

2
@Scortchi-Konstantenbänder werden beim Testen der Unabhängigkeit verwendet, während die aufsteigenden Bänder manchmal beim Identifizieren eines ARIMA-Modells verwendet werden.
Javlacalle

1
Die beiden Methoden zur Berechnung der Vertrauensbereiche werden hier etwas näher erläutert .
Scortchi

Perfekte Erklärung!
Jan Rothkegel,

1
@javlacalle, verfehlt der Ausdruck für Quadrate im Nenner? ρ(k)
Christoph Hanck

9

"Ich möchte einen Code zum Plotten von ACF und PACF aus Zeitreihendaten erstellen".

Obwohl das OP ein bisschen vage ist, ist es möglicherweise eher auf eine Rezeptcodierungsformulierung als auf eine lineare Algebramodellformulierung ausgerichtet.


Das ACF ist ziemlich einfach: Wir haben eine Zeitreihe und erstellen im Grunde genommen mehrere "Kopien" (wie in "Kopieren und Einfügen"), wobei wir verstehen, dass jede Kopie um einen Eintrag aus der vorherigen Kopie versetzt wird, weil das Anfangsdaten enthalten Datenpunkte, während die vorherige Zeitreihenlänge (die den letzten Datenpunkt ausschließt) nur beträgt . Wir können praktisch so viele Kopien erstellen, wie Zeilen vorhanden sind. Jede Kopie ist mit dem Original korreliert, wobei zu berücksichtigen ist, dass wir identische Längen benötigen. Zu diesem Zweck müssen wir das hintere Ende der ursprünglichen Datenreihe weiter beschneiden, um sie vergleichbar zu machen. Um zum Beispiel die Anfangsdaten mit zu korrelieren, wir die letztentt-1tst-33Datenpunkte der ursprünglichen Zeitreihe (die ersten chronologisch).3

Beispiel:

Wir erstellen eine Zeitserie mit einem zyklischen Sinusmuster, das einer Trendlinie und Rauschen überlagert ist, und zeichnen den R-generierten ACF auf. Ich habe dieses Beispiel aus einem Online-Beitrag von Christoph Scherber erhalten und nur das Rauschen hinzugefügt:

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

Bildbeschreibung hier eingeben

Normalerweise müssten wir die Daten auf Stationarität testen (oder sehen uns nur die obige Grafik an), aber wir wissen, dass es einen Trend gibt. Lassen Sie uns diesen Teil überspringen und direkt zum absteigenden Schritt gehen:

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

Bildbeschreibung hier eingeben

Jetzt sind wir bereit, diese Zeitreihe zu erstellen, indem wir zuerst die ACF mit der acf()Funktion in R generieren und dann die Ergebnisse mit der von mir zusammengestellten provisorischen Schleife vergleichen:

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).

Bildbeschreibung hier eingeben


IN ORDNUNG. Das war erfolgreich Auf zum PACF . Viel kniffliger zu hacken ... Hier geht es darum, die ersten ts ein paarmal zu klonen und dann mehrere Zeitpunkte auszuwählen. Anstatt nur mit der anfänglichen Zeitreihe zu korrelieren, setzen wir alle Zwischenzeiten zusammen und führen eine Regressionsanalyse durch, damit die durch die vorherigen Zeitpunkte erklärte Varianz ausgeschlossen (kontrolliert) werden kann. Wenn wir uns zum Beispiel auf die PACF konzentrieren, die zum Zeitpunkt , behalten wir , , und sowie , und wir bilden durchtst-4tsttst-1tst-2tst-3tst-4tsttst-1+tst-2+tst-3+tst-4 den Ursprung und nur den Koeffizienten für :tst-4

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.
}

Und schließlich noch einmal nebeneinander zeichnen, R-generierte und manuelle Berechnungen:

Bildbeschreibung hier eingeben

Dass die Idee neben wahrscheinlichen Rechenproblemen richtig ist, kann man im Vergleich PACFdazu sehen pacf(st.y, plot = F).


Code hier .


1

Nun, in der Praxis haben wir Fehler (Rauschen) gefunden, die durch Die Konfidenzbänder helfen Ihnen herauszufinden, ob ein Pegel nur als Rauschen betrachtet werden kann (weil etwa 95% der Rauschanteile in den Bändern liegen).et


Willkommen bei CV, vielleicht möchten Sie etwas detailliertere Informationen darüber hinzufügen, wie OP dies speziell tun würde. Fügen Sie vielleicht auch Informationen darüber hinzu, was jede Zeile darstellt?
Repmat

1

Hier ist ein Python-Code zur Berechnung von 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]

Hmmm Code-Formatierung war schlecht:
Sada
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.