Logit mit Coefficients = NA

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Logit mit Coefficients = NA

Beitrag von schubbiaschwilli »

Gude!

Ich kam mal auf die Idee, nach dieser Diskussion
viewtopic.php?p=15553#p15553
ein wenig herumzuspielen.
Dazu habe ich einen Aktienindex (DAX) genommen, und ein paar Prädiktoren erstellt (Kurs von heute, von gestern, Differenz von Gestern auf Heute) und versuche damit die Richtung der Kurse (also Steigen oder Fallen) von Morgen zu prognostizieren; und dazu nehme ich eine logistische Regression.

Code: Alles auswählen

library(quantmod)

DAX_raw <- getSymbols(Symbols="^GDAXI", auto.assign=FALSE, from="2019-12-31", to="2021-01-01")

DAX <- data.frame(DAX_raw$GDAXI.Close)
# remove NAs
DAX <- na.omit(DAX)
colnames(DAX) <- c("Schlusspreis")

# Create Target / Move Target 1 day forward
DAX$Schlusspreis_Delta <- c(NA, diff(DAX$Schlusspreis))
DAX$Schlusspreis_Delta_Target <- c((as.integer(sign(DAX$Schlusspreis_Delta))+1)/2, NA)[-1]

# Add Previous
DAX$Schlusspreis_Previous <- c(NA, DAX$Schlusspreis[-nrow(DAX)])
DAX$Schlusspreis_PreviousPrevious <- c(NA, DAX$Schlusspreis_Previous[-nrow(DAX)])

# Add Previous Deltas
DAX$Schlusspreis_Delta_Previous <- c(NA, DAX$Schlusspreis_Delta[-nrow(DAX)])
DAX$Schlusspreis_Delta_PreviousPrevious <- c(NA, DAX$Schlusspreis_Delta_Previous[-nrow(DAX)])

# Logit
DAX_cleaned <- DAX[c(-1, -2, -3, -(nrow(DAX))),]

Model_Full <- glm(Schlusspreis_Delta_Target~., family=binomial(link='logit'), data=DAX_cleaned, trace=TRUE)
Nun bekomme ich für einzelne Prädiktoren/Koeffizienten "Schlusspreis_Previous" und "Schlusspreis_Delta_Previous" bei einem vollen Modell ein 'NA' - Und weiß nicht warum - Also die Meldung ist "Coefficients: (2 not defined because of singularities)".

Code: Alles auswählen

> summary(Model_Full)

Call:
glm(formula = Schlusspreis_Delta_Target ~ ., family = binomial(link = "logit"), 
    data = DAX_cleaned, trace = TRUE)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6892  -1.1031  -0.1882   1.1975   1.4640  

Coefficients: (2 not defined because of singularities)
                                      Estimate Std. Error z value Pr(>|z|)  
(Intercept)                          3.1934301  1.3707158   2.330   0.0198 *
Schlusspreis                         0.0005239  0.0005628   0.931   0.3520  
Schlusspreis_Delta                  -0.0010149  0.0008112  -1.251   0.2109  
Schlusspreis_Previous                       NA         NA      NA       NA  
Schlusspreis_PreviousPrevious       -0.0007826  0.0005688  -1.376   0.1688  
Schlusspreis_Delta_Previous                 NA         NA      NA       NA  
Schlusspreis_Delta_PreviousPrevious -0.0004240  0.0005806  -0.730   0.4651  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 346.57  on 249  degrees of freedom
Residual deviance: 338.26  on 245  degrees of freedom
AIC: 348.26

Number of Fisher Scoring iterations: 4
Ein einfaches Modell mit diesen Prädiktoren läuft ohne Fehler durch:

Code: Alles auswählen

> glm(Schlusspreis_Delta_Target~Schlusspreis_Previous, family=binomial(link='logit'), data=DAX_cleaned)

Call:  glm(formula = Schlusspreis_Delta_Target ~ Schlusspreis_Previous, 
    family = binomial(link = "logit"), data = DAX_cleaned)

Coefficients:
          (Intercept)  Schlusspreis_Previous  
            2.9203996             -0.0002368  

Degrees of Freedom: 249 Total (i.e. Null);  248 Residual
Null Deviance:	    346.6 
Residual Deviance: 341.5 	AIC: 345.5

Code: Alles auswählen

> glm(Schlusspreis_Delta_Target~Schlusspreis_Delta_Previous, family=binomial(link='logit'), data=DAX_cleaned)

Call:  glm(formula = Schlusspreis_Delta_Target ~ Schlusspreis_Delta_Previous, 
    family = binomial(link = "logit"), data = DAX_cleaned)

Coefficients:
                (Intercept)  Schlusspreis_Delta_Previous  
                 -0.0015043                    0.0005884  

Degrees of Freedom: 249 Total (i.e. Null);  248 Residual
Null Deviance:	    346.6 
Residual Deviance: 345.4 	AIC: 349.4
Die Daten sind teilweise hochkorreliert:

Code: Alles auswählen

> cor(DAX_cleaned)
                                    Schlusspreis Schlusspreis_Delta Schlusspreis_Delta_Target Schlusspreis_Previous Schlusspreis_PreviousPrevious
Schlusspreis                           1.0000000         0.10429748               -0.14977112            0.98217727                    0.96336710
Schlusspreis_Delta                     0.1042975         1.00000000               -0.04355631           -0.08449326                   -0.08950084
Schlusspreis_Delta_Target             -0.1497711        -0.04355631                1.00000000           -0.14182231                   -0.15485323
Schlusspreis_Previous                  0.9821773        -0.08449326               -0.14182231            1.00000000                    0.98210069
Schlusspreis_PreviousPrevious          0.9633671        -0.08950084               -0.15485323            0.98210069                    1.00000000
Schlusspreis_Delta_Previous            0.1086674         0.02563753                0.06745749            0.10402740                   -0.08516933
Schlusspreis_Delta_PreviousPrevious    0.1254341         0.12026087               -0.06385184            0.10294314                    0.09795976
                                    Schlusspreis_Delta_Previous Schlusspreis_Delta_PreviousPrevious
Schlusspreis                                         0.10866740                          0.12543412
Schlusspreis_Delta                                   0.02563753                          0.12026087
Schlusspreis_Delta_Target                            0.06745749                         -0.06385184
Schlusspreis_Previous                                0.10402740                          0.10294314
Schlusspreis_PreviousPrevious                       -0.08516933                          0.09795976
Schlusspreis_Delta_Previous                          1.00000000                          0.02729302
Schlusspreis_Delta_PreviousPrevious                  0.02729302                          1.00000000
Die Frage ist jetzt: Was ist das für ein Fehler? Ist das ein numerischer Fehler beim Berechnen der Prädiktoren/Koeffizienten? Ich hab' beim Recherchieren im www was gefunden, dass es daran liegen könnte, dass die fraglichen Prädiktoren/Koeffizienten Linearkombinationen der anderen Prädiktoren sein könnten - Aber das ist bei diesen Daten sehr wahrscheinlich auszuschließen.
Oder kennt jemand Methoden, da weiter zu analysieren? Ich bin ein wenig ratlos...

Dank&Gruß
Schubbiaschwilli
Edit: Einen Fehler bei der Datenerstellung gefunden und verbessert.
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Logit mit Coefficients = NA

Beitrag von schubbiaschwilli »

Gude!

Nachtrag: Ich hab' das mal in JASP ausprobiert (erspart doch viel Tippserei), und - siehe da - es gibt eine detaillierte Fehlermeldung:
The following problem(s) occurred while running the analysis:
The variance-covariance matrix of the supplied data is not positive-definite. Please check if variables have many missings observations or are collinear
Bild

Es scheint, die Kurse von Heute, Gestern, usw., die ja hoch korreliert sind (die sind ja auf dem gleichen Niveau) führen zu einem Numerik-Problem - Das hochkorrelierte Daten bei Regressionen kritisch sind, war mir klar, aber ich hätte Auswirkungen auf die Ergebnisse erwartet (also bspw. Effekte bei der Analyse der Residuen), aber nicht Problemen mit der Numerik.

Dank&Gruß
Schubbiaschwilli
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Logit mit Coefficients = NA

Beitrag von bigben »

Hallo,

ich hab mir jetzt nicht extra quantmod installiert um das nachzuvollziehen. Wenn ich das richtig sehe, dann willst Du aus etwa 250 Samples 7 Prädiktoren bestimmen und davon fallen zwei aus, die mit 0,98 korrelieren. Dass es da Probleme mit der Schätzung gibt ist ja erstmal nicht unplausibel. Vor einiger Zeit habe ich mal (war das auf CrossValidated??) eine Frage beantwortet, wo ebenfalls die logistische MLE-Schätzung nicht klappte und ein einfaches Skalieren der Prädiktoren mit scale das Problem gelöst hat.
Ansonsten vielleicht eine regularisierende Regression? Ridge-Regression mit glmnet soll doch gut mit Multikollinearität umgehen können oder sonst Bayes-Regression mit stan_glm (regularisierend durch Prior-Verteilung steuerbar, wenn man erstmal die default-prior übernimmt ist die Syntax nahezu gleich wie glm)?

Wie gesagt, keine echte Ahnung, nur ein Stochern im Nebel.
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Logit mit Coefficients = NA

Beitrag von EDi »

Code: Alles auswählen

 die ja hoch korreliert sind (die sind ja auf dem gleichen Niveau) führen zu einem Numerik-Problem - Das hochkorrelierte Daten bei Regressionen kritisch sind, war mir klar, aber ich hätte Auswirkungen auf die Ergebnisse erwartet (also bspw. Effekte bei der Analyse der Residuen), aber nicht Problemen mit der Numerik
Doch könnte sein. Stell dir eine Ebene vor (2Prädikatoren) und alle Punkte liegen auf der Diagonalen (sind korreliert) - dann ist die Ebene nicht wirklich stabil, sie kippt an den Ecken die nicht an der Diagonalen mit dem Punkten liegt weg.

Generell, bringen hoch-korrelierte Prädikatoren (hier tlw. 0.98!) nichts, oder sind eher schlecht: sie machen das Model instabil und erhöhen den Standardfehler. Solange du kein Vorwissen hast (Bayes lässt grüßen), ist es vollkommen egal welchen der hochkorrelierten du rauslässt...


Ich hab da vor Jahren mal was aufgeschrieben: http://edild.github.io/collinear/
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