Autokorrelation beheben

Methoden der Zeitreihenanalyse

Moderator: schubbiaschwilli

Fledermaus
Beiträge: 25
Registriert: Di Aug 04, 2020 3:00 pm

Autokorrelation beheben

Beitrag von Fledermaus »

Hallo zusammen,

ich möchte einen Trend im Zeitablauf belegen.
Hierfür habe ich den nachfolgenden Datensatz erstellt.

Code: Alles auswählen

   Produkte Dummy Jahre
1      2038     0     1
2      2932     0     2
3      3532     0     3
4      4290     0     4
5      6208     0     5
6      6653     0     6
7      7898     0     7
8      9628     0     8
9      9451     1     9
10    10047     1    10
11     9812     1    11
12     9841     1    12
13    11171     1    13
14    14292     1    14
15    17673     1    15
16    19921     0    16
17    20869     0    17
18    22325     0    18
19    23144     0    19
20    24523     0    20
Im Anschluss daran habe ich untersucht wie sich die Anzahl an Produkten im Zeitablauf verändert. Über die Plots lässt sich erkennen, das definitiv ein Trend vorliegt. Versucht man diesen mithilfe des linearen Modells zu belegen erhält man zwar ein hohes Bestimmtheitsmaß. Leider liegt aber Autokorrelation vor. Ich habe versucht die Autokorrelation mithilfe eines Dummys zu beheben (siehe Datensatz oben). Bei der vorliegenden Zeitreihe funktioniert das aber nicht wie der nachfolgende Output zeigt.

Code: Alles auswählen

> summary(modell10)

Call:
lm(formula = Produkte ~ Dummy + Jahre, data = Forum)

Residuals:
     Min       1Q   Median       3Q      Max 
-1533.38  -570.06    81.39   470.19  1708.91 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)    65.46     395.89   0.165    0.871    
Dummy       -3220.23     409.03  -7.873 4.54e-07 ***
Jahre        1210.76      32.51  37.247  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 832.8 on 17 degrees of freedom
Multiple R-squared:  0.988,	Adjusted R-squared:  0.9866 
F-statistic: 700.4 on 2 and 17 DF,  p-value: < 2.2e-16

> durbinWatsonTest(modell10)
 lag Autocorrelation D-W Statistic p-value
   1       0.3194353      1.306938   0.036
 Alternative hypothesis: rho != 0
Ich habe mich inbesondere für die Modellierung über Dummys entschieden, weil das bei einem vorherigen Datensatz die Autokorrelation ausgeschlossen hat.
Ich habe auch andere Modelle also lin-log, log-lin und Doppel-log ausprobiert, die Autokorrelation tritt bei allen auf.

Wie würdet ihr nun vorgehen?

Theoretisch gäbe es auch die Möglichkeit den Datensatz zu verringern, also nur 10 anstatt 20 Jahre in die Untersuchung einzubeziehen. Davon würde ich aber gerne absehen.

Liebe Grüße
Tobi
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Autokorrelation beheben

Beitrag von EDi »

Wie würdet ihr nun vorgehen?
Kommt auf die fragestellung an...

Das Lineare-Model passt ja nur bedingt: man sieht ja, dass es um jahr 10 einen Einbruch in der Steigung gibt. Ist der von interesse?

1. Man könnte die auto.korrelation auf den residuen fitten, geht mit gls.
2. Ich würde eine smoother fitten, das hat den Vorteil, das man aus der ersten Ableitung sieht, dass es um jahr 10 nicht steigt.

Hier Beispiele dazu:

Code: Alles auswählen

# some data
df <- read.table(text = "   Produkte Dummy Jahre
1      2038     0     1
2      2932     0     2
3      3532     0     3
4      4290     0     4
5      6208     0     5
6      6653     0     6
7      7898     0     7
8      9628     0     8
9      9451     1     9
10    10047     1    10
11     9812     1    11
12     9841     1    12
13    11171     1    13
14    14292     1    14
15    17673     1    15
16    19921     0    16
17    20869     0    17
18    22325     0    18
19    23144     0    19
20    24523     0    20")

plot(Produkte ~ Jahre, data = df)

mod1 <- lm(Produkte ~ Jahre, data = df)
summary(mod1)
par(mfrow = c(2, 2))
plot(mod1) # first plot already indicates it

par(mfrow = c(1,1))
plot(residuals(mod1) ~ df$Jahre) # jupp, some nice pattern in the residuals

acf(residuals(mod1)) # auto-correlation function also indicates it

# lets model the auto-correlation on the residuals
library(nlme)
mod2 <- gls(Produkte ~ Jahre, data = df, correlation = corAR1(form = ~Jahre))
summary(mod2)  # high correlation (phi = 0.999)
plot(mod2)     # the pattern is still there
acf(residuals(mod2))

# which one is better?
library(MuMIn)
model.sel(mod1, mod2)
# mod2 has a much lower AICc...


# lets get fancy with a gam
library(mgcv)
library(gratia)
mod3 <- gam(Produkte ~ s(Jahre), data = df,  method = "REML")
plot(mod3)
plot(residuals(mod3)) # better

model.sel(mod1, mod2, mod3)
# but mod 2 is better (gam might overfit...)
plot(mod3, residuals = TRUE)
draw(mod3, residuals = TRUE)
# the nice thing is that we can see the regions of change, b´from the first derivative

d_mod3 <- derivatives(mod3)
draw(d_mod3) # indicates a drop of the increase (to not different from zero) around year 10



pdat <- data.frame(Jahre = d_mod3$data)
pdat$fit <- predict(mod3, newdata = pdat)
pdat$deriv = d_mod3$derivative
pdat$is_zero <- d_mod3$lower < 0 & d_mod3$upper > 0

ggplot(pdat, aes(x = Jahre, y = fit, col = is_zero)) +
  geom_point() 
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Fledermaus
Beiträge: 25
Registriert: Di Aug 04, 2020 3:00 pm

Re: Autokorrelation beheben

Beitrag von Fledermaus »

Hallo EDi,

zunächst einmal möchte ich mich für deine Antwort bedanken, du hast mir sehr weiterhelfen können. Gibt es eine Anleitung für dein Vorgehen bzw. Literatur die man nutzen könnte um genauer zu verstehen was es mit den Modellen 2 und 3 auf sich hat bzw. wie man fitten kann? Hintergrund ist folgender: Ich würde gerne dazulernen um später vielleicht auch anderen Personen hier im Forum weiterhelfen zu können.

Darüber hinaus ist noch eine weitere Frage aufgetreten:

Für Modell 2 kann ich mir leider keinen Durbin-Watson-Koeffizienten ausgeben lassen auch die F-Statistik bzw. das Bestimmtheitsmaß erhalte ich über die summary nicht.

Code: Alles auswählen

> summary(mod2)
Generalized least squares fit by REML
  Model: Produkte ~ Jahre 
  Data: Hersteller 
       AIC      BIC    logLik
  310.2724 313.8338 -151.1362

Correlation Structure: AR(1)
 Formula: ~Jahre 
 Parameter estimate(s):
      Phi 
0.9999691 

Coefficients:
                Value Std.Error  t-value p-value
(Intercept)  854.1257 125725.58 0.006794  0.9947
Jahre       1183.4211    226.64 5.221606  0.0001

 Correlation: 
      (Intr)
Jahre -0.019

Standardized residuals:
         Min           Q1          Med           Q3          Max 
-0.041474039 -0.017505124 -0.007177891 -0.001369417  0.001346590 

Residual standard error: 125721.5 
Degrees of freedom: 20 total; 18 residual

> durbinWatsonTest(mod2)
Fehler in durbinWatsonTest.default(mod2) : requires vector of residuals
Welche Möglichkeiten gibt es die Ergebnisse der genannten Tests zu erhalten?

Liebe Grüße
Tobi
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Autokorrelation beheben

Beitrag von EDi »

durbinWatsonTest kenne ich nicht und nutze ich auch nicht. Was macht der? Ich diagnostiziere fast immer nur graphisch (ab und zu mal ein bootstrap oder ähnliches).

Für einen F-Test / Statistik, kannst du anova(model) mal machen. Das vergleicht dann das Model gegen das Nullmodel. Kann sein, dass du das Nullmodel explizit angeben musst (hab gerade kein R zur Hand).

Literatur zu Model 3: Simon Wood - Generalized additive models - die Referenz. Guter Mix aus harter Mathematik und angewandten Beispielen.

Zuur hat auch ein Buch zu GAM - das ist aber überteuert. Leih es dir lieber aus.

Literatur zu Model 2: Zuur - a beginner's guide to glm and glmm. Gute praktische Einführung.

Etwas älter, aber für mich immernoch die Referenz:
Zuur - mixed effects models and extensions in ecology

Pinheiro & Bates (nochmal älter) dürfte auch was dazu haben - bin ich aber nicht sicher.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Fledermaus
Beiträge: 25
Registriert: Di Aug 04, 2020 3:00 pm

Re: Autokorrelation beheben

Beitrag von Fledermaus »

Hallo EDi,

der Durbin-Watson-Test wird genutzt um Autokorrelation zu überprüfen. Die graphische Analyse von mod2 lässt eindeutig auf Autokorrelation schließen, allerdings würde ich das gerne noch analytisch belegen.

Die nachfolgende Fehlermeldung erscheint dann:

Code: Alles auswählen

> library(car)
> library(lmtest)
> durbinWatsonTest(mod2)
Fehler in durbinWatsonTest.default(mod2) : requires vector of residuals
Weißt du wie man diese beheben könnte?

Darüber hinaus versuche ich das Bestimmtheitsmaß von mod2 zu ermitteln.
Weißt du wie das geht? (In der Summary ist das Bestimmtheitsmaß nicht angegeben.)

Die Literatur werde ich mir umgehend ansehen.

Liebe Grüße
Tobi
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Autokorrelation beheben

Beitrag von EDi »

Weißt du wie man diese beheben könnte?
Wie aus ?durbinWatsonTest und auch die Fehlermeldung andeuten, wird eine Vektor mit den residuen benötigt.

Code: Alles auswählen

durbinWatsonTest(residuals(mod2, type = "pearson"))
Darüber hinaus versuche ich das Bestimmtheitsmaß von mod2 zu ermitteln.
Wenn dann gibt's nur ein pseudo-R^2, siehe z.b. ?rcompanion::nagelkerke.
Nutze ich auch nicht, weil es mir nicht viel sagt.

Um zu sehen wie viel das Model taugt, schaue ich mir auch die Residuen an und vergleiche verschiedene Modelle (z.b. eins ohne korrelation, eins nur mit Intercept etc...).
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Fledermaus
Beiträge: 25
Registriert: Di Aug 04, 2020 3:00 pm

Re: Autokorrelation beheben

Beitrag von Fledermaus »

Hallo EDi,

nochmal vielen Dank für deine Mühe.
Das Bestimmtheitsmaß kann möglicherweise ein wenig außer Acht gelassen werden sofern die Autokorrelation bestätigt werden kann.

Leider habe ich beim Test der Autokorrelation weiterhin die nachfolgende Fehlermeldung.
Habe ich etwas vergessen?

Code: Alles auswählen

> durbinWatsonTest(residuals(mod2, type = "pearson"))
Fehler in durbinWatsonTest.default(residuals(mod2, type = "pearson")) : 
  requires vector of residuals
Liebe Grüße
Tobi
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Autokorrelation beheben

Beitrag von EDi »

Hmm, was gibt denn

Code: Alles auswählen

residuals(mod2, type = "pearson")
zurück?
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Fledermaus
Beiträge: 25
Registriert: Di Aug 04, 2020 3:00 pm

Re: Autokorrelation beheben

Beitrag von Fledermaus »

Hi EDi,

dann erhält man den nachfolgenden Output:

Code: Alles auswählen

> residuals(mod2, type = "pearson")
            1             2             3             4             5             6             7             8             9 
 3.605127e-06 -2.298476e-03 -6.939059e-03 -1.032290e-02 -4.479989e-03 -1.035346e-02 -9.863652e-03 -5.516114e-03 -1.633702e-02 
           10            11            12            13            14            15            16            17            18 
-2.100942e-02 -3.229167e-02 -4.147404e-02 -4.030814e-02 -2.489646e-02 -7.416723e-03  1.051033e-03 -8.215270e-04  1.346590e-03 
           19            20 
-1.552047e-03  3.605135e-06 
attr(,"std")
 [1] 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5
[15] 125721.5 125721.5 125721.5 125721.5 125721.5 125721.5
attr(,"label")
[1] "Standardized residuals"
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Autokorrelation beheben

Beitrag von EDi »

Mach mal einen normalen Vektor draus (ohne attribute und ohne extra klassen).
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten