stepwise Regression

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
blue_thunder

stepwise Regression

Beitrag von blue_thunder »

Moin.

Für meine Abschlussarbeit führe ich eine lineare Regressionsnalyse durch. Dazu soll ich auf Wunsch meines Betreuers sukzessive Variablen dem Modell hinzufügen (bottom up-) oder entfernen (top-down). Ich möchte analysieren, wie sich die Signifikanzen der exogenen (unahängigen) Variablen dabei ändern.

Nun habe ich mehrere Probleme:
1)Mein erster Ansatz war es, die step()-Funktion zu nutzen. Einmal mit direction="backward" (top-down) oder eben direction="forward" (Bottom up)

So. Folgende Probleme:
1.1) ich komme nicht an die Zwischenschritte heran, sondern nur an das lezte Modell welches mit die step()-Funktion ausspuckt. Gibt es eine Funktion, um an die zwischenschritte ranzukommen?
1.2) die step()-Funktion überspringt manche Variable... ganz extrem ist das bei backward....
1.2.1. warum? wie "tickt" die step()-Funktion überhaupt?
1.2.2. wie kann ich das unterbinden?

Daher habe ich veruscht, dem Modell manuell Variable hinzufügen oder zu entfernen. Umgesetzt habe ich dies mit einer for-Schleife und der Funktion udate

ABER:

2) auch hier: er überspringt manche Variable, ganz extrem bei "backward", also bei (update~-X)


Ich möchte einfach nur automatisiert Modelle mit allen J exogenen Variablen, die ich so untersuchen möchte, bilden:
Model1=Y~X1
Model2=Y~X1+X2
...
ModelJ=Y+X1+X2...+XJ

und jeweils die summary() ausgeben lassen um eben die Signifikanzen, Bestimmtheitsmasse etc. zu analysieren....

Erster Ansatz:

Code: Alles auswählen

#Modellbildung step backward
backward=step(lm(Y~X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13+X14+X15+X16+X17+X18+X19+X20+X21+X22+X23+X24+X25+X26+X27+X28+X29+X30+X31+X32+X33+X34+X35+X36+X37+X38+X39+X40+X41+X42+X43+X44+X45), direction="backward")

#Modellbildung step forward
forward=step(lm(Y~1), scope=~X1+X2+X3+X4+X5+X6+X7+X8+X9+X10+X11+X12+X13+X14+X15+X16+X17+X18+X19+X20+X21+X22+X23+X24+X25+X26+X27+X28+X29+X30+X31+X32+X33+X34+X35+X36+X37+X38+X39+X40+X41+X42+X43+X44+X45, direction = "forward")

lmOut(backward, file = "Pfadv")
lmOut(forward, file = "Pfad")
Zweiter Ansatz:

Code: Alles auswählen

#Modellbildung Top Down

modelnametd="modeltd"

modeltd=lm(Y~X1)  
for(r in 2: J)
{
   modeltd=update(modeltd, paste0(".~.+X",r)) #Modellbildung mt allen vorhandenen exogenen Variablen als Ausgangsmodell
 
}

lmOut(modeltd, file="Pfad")

Ergebnistd[2,1]=modelnametd
Ergebnistd[2,2]=summary(modeltd)$r.squared    #Bestimmtheitsmass des jeweiligen Modells in Ergebnistabelle ablegen 
Ergebnistd[2,3]=summary(modeltd)$adj.r.squared #korrigiertes Bestimmtheitsmass
Ergebnistd[2,4]=summary(modeltd)$fstatistic[1] #F-Wert
Ergebnistd[2,5]=summary(modeltd)$fstatistic[2] #numdf
Ergebnistd[2,6]=summary(modeltd)$fstatistic[3] #dendf

k=J

modelname="modeltd"
q=3 #Zeile in Ergebnismatrix
while(k >1) #innere Schleife 
{ 
  modeltdn=modeltd
  modelname = paste(modelname, k ,sep="-") 
  modeltdn=update(modeltdn, paste0(".~.-X",k)) #Schrittweises entfernen von exogenen Variablen
  
  assign(modelname,modeltd)
  Ergebnistd[q,1]=modelname
  Ergebnistd[q,2]=summary(modeltdn)$r.squared    #Bestimmtheitsmass des jeweiligen Modells in Ergebnistabelle ablegen 
  Ergebnistd[q,3]=summary(modeltdn)$adj.r.squared #korrigiertes Bestimmtheitsmass
  Ergebnistd[q,4]=summary(modeltdn)$fstatistic[1] #F-Wert
  Ergebnistd[q,5]=summary(modeltdn)$fstatistic[2] #numdf
  Ergebnistd[q,6]=summary(modeltdn)$fstatistic[3] #dendf
 
  filenametd=paste(k-1,"TD.csv",sep="")
  filepathtd="Pfad"
  filetd=paste(filepathtd, filenametd, sep="")
  lmOut(modeltd, file = filetd)
  
   k=k-1
   q=q+1

  
  
} 


#Modellierung Bottom up
  modelnamebu="modelbu"
  modelbu=lm(Y~X1)    #Ausgansmodell
  assign(modelnamebu,modelbu)
  
  
  Ergebnisbu[2,1]=modelnamebu
  Ergebnisbu[2,2]=summary(modelbu)$r.squared    #Bestimmtheitsmass des jeweiligen Modells in Ergebnistabelle ablegen 
  Ergebnisbu[2,3]=summary(modelbu)$adj.r.squared #korrigiertes Bestimmtheitsmass
  Ergebnisbu[2,4]=summary(modelbu)$fstatistic[1] #F-Wert
  Ergebnisbu[2,5]=summary(modelbu)$fstatistic[2] #numdf
  Ergebnisbu[2,6]=summary(modelbu)$fstatistic[3] #dendf
  
  
  lmOut(modelbu, file = "Pfad")
  
  
g=3 #Zeile in Ergebnismatrix
  for(k in 2:J) #innere Schleife 
   { 
      modelnamebu = paste(modelnamebu, k ,sep="+") 
      modelbu=update(modelbu, paste0(".~.+X",k))
      
      assign(modelnamebu,modelbu)
      Ergebnisbu[g,1]=modelnamebu
      Ergebnisbu[g,2]=summary(modelbu)$r.squared    #Bestimmtheitsmass des jeweiligen Modells in Ergebnistabelle ablegen 
      Ergebnisbu[g,3]=summary(modelbu)$adj.r.squared #korrigiertes Bestimmtheitsmass
      Ergebnisbu[g,4]=summary(modelbu)$fstatistic[1] #F-Wert
      Ergebnisbu[g,5]=summary(modelbu)$fstatistic[2] #numdf
      Ergebnisbu[g,6]=summary(modelbu)$fstatistic[3] #dendf
      
      filenamebu=paste(k,"BU.csv",sep="")
      filepathbu="Pfad"
      filebu=paste(filepathbu, filenamebu, sep="")
      lmOut(modelbu, file = filebu)
      
      g=g+1
   } 
   

Und ja, es sind wirklich 45 exogene Variablen, effektiv allerdings nur 12, viele sind "ähnlich" bzw. "alternativen", und ich möchte in das finale Modell jeweils nur eine dieser "Alternativen" mit hinein nehmen. Mein Prof möchte aber eben, dass ich eben diesen bottom-up- und top-down-Ansatz verfolge..

Y und smätliche X wurden zuvor aus entsprechenden Dateien ausgelesen.


Vielen Dank im Voraus für etwaige Hilfe,

Gruß
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: stepwise Regression

Beitrag von EDi »

effektiv allerdings nur 12, viele sind "ähnlich" bzw. "alternativen",
Wuerde vorab schonmal alle korrelieren rauswerfen, da sie sowieso die gleiche Information beinhalten.
Oder wie wäre es mit LASSO oder Ridge regression...
ich komme nicht an die Zwischenschritte heran, sondern nur an das lezte Modell welches mit die step()-Funktion ausspuckt. Gibt es eine Funktion, um an die zwischenschritte ranzukommen?
Es gibt das argument 'keep', dem du eine Funktion uebergeben kannst, dass die Teile die du brauchts extrahiert. Schau dir dazu auch vielleicht das broom package an...
1.2) die step()-Funktion überspringt manche Variable... ganz extrem ist das bei backward....
1.2.1. warum? wie "tickt" die step()-Funktion überhaupt?
1.2.2. wie kann ich das unterbinden?
Was meinst du denn genau...
Was sollte die Funktion deiner Auffasung nach machen...
[Meine Fragezeichen ist kaputt, deshalb....
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.
blue_thunder

Re: stepwise Regression

Beitrag von blue_thunder »

Wuerde vorab schonmal alle korrelieren rauswerfen, da sie sowieso die gleiche Information beinhalten.
Ja, so war mein Plan. Leider möchte mein Dozent wohl eben diese stepwise-regression mit allen Variablen...:/
Oder wie wäre es mit LASSO oder Ridge regression...
?! beides nie gehört, ich guck' mal ob mich das weiter bringt
Es gibt das argument 'keep', dem du eine Funktion uebergeben kannst, dass die Teile die du brauchts extrahiert. Schau dir dazu auch vielleicht das broom package an...
Okay, das klingt schon mal gut, werde ich mal ausprobieren. Vielen Dank:)
Was meinst du denn genau...
Was sollte die Funktion deiner Auffasung nach machen...
Nun, ich möchte untersuchen, wie sich das hinzufügen (Wegnehmen) von Variablen auf das Modell (global) auswirkt und vor allem aber auch auf die einzlenen Variablen (lokal), ob und wie sich bspw Signifikanzen (t-Test) und die BETAs ändern etc.
Mit forwardmodel=step(...) bekomme ich jedoch nur das Endmodell, also das des letzten Durchganges ausgespuckt. Würde aber auch gerne die "Zwischenmodelle" haben um eben die Änderungen festhalten zu können. Auch wie sich das AIC ändert wäre sicher nicht uninteressant zu wissen.

Und bei dem "Endmodell", in welchem theoretisch alle Variablen drin enthalten sein müssten, sind eben nicht alle Viablen drin, da step() wohlt automatisch einige Variablen entfernt? Das gleiche tritt bei meiner "manuellen" Vorgehensweise auf, in der ich mit einer For-Schleufe und der update-Funktion Variable dem Modell schrittweise hinzufüge (hier kann ich die Zwischenmodelle ausgeben lassen immerhin). Und das verstehe ich nicht; zumindest bei der manuellen Bildung via for(i in 1 :J) müssten doch beim letzten Durchgang alle J Variable im Modell enthalten sein- sind es aber nicht.

Danke für die Hilfe.

LG
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: stepwise Regression

Beitrag von bigben »

Moin.

Die Probleme mit schrittweiser Regression sind aber schon bekannt, oder? http://www.barryquinn.com/the-statistic ... selection/

Andrew Gelman, scheu-zurückhaltend wie es seine Art ist, schreibt dazu
Stepwise regression is one of these things, like outlier detection and pie charts, which appear to be popular among non-statisticans but are considered by statisticians to be a bit of a joke.
( http://andrewgelman.com/2014/06/02/hate ... egression/ )

Du tust natürlich, was Dein Betreuer verlangt, aber das musste einmal in diesem Thread stehen und vor einer etwaigen mündlichen Verteidigung Deiner Arbeit solltest Du Dich mit der Kritik an schrittweiser Regression beschäftigen.
blue_thunder hat geschrieben:1)Mein erster Ansatz war es, die step()-Funktion zu nutzen. Einmal mit direction="backward" (top-down) oder eben direction="forward" (Bottom up)

So. Folgende Probleme:
1.1) ich komme nicht an die Zwischenschritte heran, sondern nur an das lezte Modell welches mit die step()-Funktion ausspuckt. Gibt es eine Funktion, um an die zwischenschritte ranzukommen?
Vielleicht hat EDi dieses Problem schon ausreichend beantwortet. Sonst hätte ich Dich gerne auf zwei Funktionen im Package MASS hingewiesen:

addterm {MASS} "Try fitting all models that differ from the current model by adding a single term from those supplied"
dropterm {MASS} "Try fitting all models that differ from the current model by dropping a single term"

Die könnten ggf. eine große Erleichterung beim "selber machen" sein.

Viel Spaß,
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: stepwise Regression

Beitrag von EDi »

. . Mit forwardmodel=step(...) bekomme ich jedoch nur das Endmodell, also das des letzten Durchganges ausgespuckt. Würde aber auch gerne die "Zwischenmodelle" haben um eben die Änderungen festhalten zu können. Auch wie sich das AIC ändert wäre sicher nicht uninteressant zu wissen.

Dafür ist das keep Argument da, du musst dir nur ein Funktion schreiben die aus einem Model die Sachen die du brauchst extrahierst (beta, auch,...). Voll schaff ich es morgen es Beispiel zu posten.
. .müssten doch beim letzten Durchgang alle J Variable im Modell enthalten sein- sind es aber nicht.

Hast du vielleicht perfekte lineare abhängigkeiten/kollinearität? Dann könnten zb gar nicht alle Variablen rein, da nicht trennbar. Kannst du denn das volle Modell dritten und kommt was sinnvolles bei rum?
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.
blue_thunder

Re: stepwise Regression

Beitrag von blue_thunder »

@BigBen, vielen Dank für die Links! Das könnte in der Tat sehr sehr hilfreich sein in Bezug auf Thesis und vor allem bei der Verteidigung dieser.

@Edi, ich werde heute mich mal mit der keep-funktion auseinander setzen; scheint genau das zu sein was ich suche. Wenn ich nicht weiter komme, melde ich mich.

Vielen Dank für eure Hilfen, tolles Forum:)
blue_thunder

Re: stepwise Regression

Beitrag von blue_thunder »

Jetzt will der Dozent, dass ich eine Faktorenanalyse durchführe.... und die macht auch Probleme:/ erstelle diesbezüglich ein Thread im Bereich Faktorenanalyse...
Benutzeravatar
student
Beiträge: 674
Registriert: Fr Okt 07, 2016 9:52 am

Re: stepwise Regression

Beitrag von student »

Das macht ja auch Sinn: Herausfinden, was wichtig ist....! Viel Erfolg! ;)
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
blue_thunder

Re: stepwise Regression

Beitrag von blue_thunder »

Ich habe meine Modelle und Analysen soweit durch, VIELEN VIELEN DANK an das Forum! =))

Allerdings habe ich eine sehr blöde Frage und ja, die ist wahrscheinlich wirklich blöd, aber dennoch...

der F-Wert sollte ja möglichst hoch sein. Wie entscheide ich mich dann zwischen zwei Modellen, wenn Modell A höheren R^2, aber geringeren F-Wert liefert?

In meinem Konkreten Fall:
Modell A: R2adj.=0.583 F=6.4e+03
Modell B: R2adj.=0.589 F=5.34e+03
Antworten