Seite 1 von 1

GLS Regression

Verfasst: Fr Jun 14, 2019 12:16 pm
von luckynele
Hallo zusammen,

ich möchte neben der OLS Regression noch die GLS Regression auf meinen Datensatz anwenden. Leider klappt das nicht so ganz, wenn ich es mit einer Schleife schreibe.
Wenn ich die GLS Regression für die Zeilen 451:570 anwende gibt es mir die Koeffizienten aus:

Code: Alles auswählen

gls(y ~ .+0, data=data 

möchte ich jetzt aber immer mehr Zeilen hinzufügen, also erst 0, dann 1, 2 etc.

Code: Alles auswählen

Gewichte.GLS <- sapply(data), function(i) gls(y ~ .+0, data=data))
bekomme ich die Fehlermeldung:

Code: Alles auswählen

 Error in model.frame.default(formula = ~y +  : 
  Variablenlängen sind unterschiedlich  

Weiß jemand woran das liegen könnte?

Re: GLS Regression

Verfasst: Fr Jun 14, 2019 12:55 pm
von jogo
Hallo Nele,
luckynele hat geschrieben: Fr Jun 14, 2019 12:16 pm möchte ich jetzt aber immer mehr Zeilen hinzufügen, also erst 451:570, dann 451:571, 451:572 etc.

Code: Alles auswählen

Gewichte.GLS <- sapply(570:nrow(famafrench), function(i) gls(rep(1, times = i-450) ~ .+0, data=famafrench[451:i,]))
bekomme ich die Fehlermeldung:

Code: Alles auswählen

 Error in model.frame.default(formula = ~i + NoDur + Durbl + Manuf + Enrgy +  : 
  Variablenlängen sind unterschiedlich (gefunden für 'NoDur') 
anhand des Quelltextes würde ich sagen, das sollte so funktionieren.
Etwas irritiert mich die Fehlermeldung:

Code: Alles auswählen

 Error in model.frame.default(formula = ~i + NoDur + Durbl + Manuf + Enrgy +  : 
  Variablenlängen sind unterschiedlich (gefunden für 'NoDur') 
Dort taucht auf einmal in der Formel ein i auf:

Code: Alles auswählen

formula = ~i + NoDur + 
           |
Ich vermute, wenn wir herausfinden, wie dort das i hinkommt, dann ist die Frage geklärt.
Ich stelle mir das so vor, wenn R die Formal analysiert und die Längen prüft:
1. schaue nach i und bestimme die Länge (in dem Dataframe gibt es keine Spalte i), vielleicht kommt hier bei der Länge auch 0 raus.
2. schaue nach NoDur (ok, ist eine Spalte im Dataframe und hat die Länge entsprechend der Anzahl der Zeilen des Dataframes)
3. ups, das ist eine andere Länge als die von i, also EndeGelände

Beispiel:

Code: Alles auswählen

lm(demand ~ Time, data=BOD)
n <- 5
lm(demand ~ n+Time, data=BOD)
lm(demand ~ nichtVorhanden +Time, data=BOD)
Momentan bin ich der Meinung, dass die Fehlermeldung nicht zu dem von Dir angegebenen Code passt.

Gruß, Jörg

Re: GLS Regression

Verfasst: Fr Jun 14, 2019 2:12 pm
von luckynele
Hallo Nele,

aus welchem Paket ist die Funktion gls() :?:
ist es das Paket nlme :?:

Gruß, Jörg
p.s.:
Das passiert mir selten, aber diesmal ist es wieder passiert. Statt Deine Nachricht zu zitieren bin ich auf den Knopf "Editieren" gekommen ...
Das tut mir leid. Ich bitte um Entschuldigung.

als Ausgleich habe ich ein reproduzierbares Beispiel entwickelt:

Code: Alles auswählen

library("nlme")
sapply(126:nrow(iris), function(i) lm( rep(1, i-5) ~ . + 0, data=iris[6:i, -5])$coef)
sapply(126:nrow(iris), function(i) gls( rep(1, i-5) ~ . + 0, data=iris[6:i, -5])$coef)

Re: GLS Regression

Verfasst: Fr Jun 14, 2019 3:09 pm
von jogo
Hallo Nele,

hier kommt die Auflösung:

Code: Alles auswählen

library("nlme")
# sapply(126:nrow(iris), function(i) lm( rep(1, i-5) ~ . + 0, data=iris[6:i, -5])$coef)
mygls <-  function(i) { 
  D <- iris[6:i, -5]
  D$iii <- 1
  gls( iii ~ 0 + . , data=D)$coef
}
sapply(126:nrow(iris), mygls)
Es scheint so zu sein: bei gls() sind nur Variablen zulässig, die auch im Dataframe data= enthalten sind.

Wenn Du es genauer ergründen willst, musst Du Dich mit dem Code von gls() beschäftigen, also

Code: Alles auswählen

print(gls)
Falls Du dies vorhast, viel Spaß und gute Nerven!

Bei Dir könnte das so aussehen:

Code: Alles auswählen

GLSi <- function(i) {
  D <- famafrench[451:i,]
  D$eins <- 1
  gls(eins ~ . +0, data=famafrench[451:i,])
}
Gewichte.GLS <- sapply(570:nrow(famafrench), GLSi)
Gruß, Jörg

Re: GLS Regression

Verfasst: Fr Jun 14, 2019 7:14 pm
von luckynele
Dann werde ich mich daran mal versuchen :roll:
Ich habe auch ein ähnliches Problem, wenn ich die Schleife für die Ridge Regression verwenden möchte.
Wenn ich mal dein iris Beipiel verwende:

Code: Alles auswählen

sapply(126:nrow(iris), function(i) lm( rep(1, i-5) ~ . + 0, data=iris[6:i, -5])$coef)
müsste mir das mit lambda = 0 für die Ridge-Regression die gleichen Ergebnisse liefern:

Code: Alles auswählen

install.packages("MASS")
library(MASS)
sapply(126:nrow(iris), function(i) lm.ridge( rep(1, i-5) ~ . + 0,lambda = 0, data=iris[6:i, -5])$coef)
allerdings bekomme ich unterschiedliche Ergebnisse. Weißt du vielleicht was der Grund dafür sein könnte?

Re: GLS Regression

Verfasst: Fr Jun 14, 2019 8:57 pm
von jogo
Nein, das weiß ich leider nicht.

Bei dem anderen (schon gelösten) Problem habe ich noch eine Vereinfachung:

Code: Alles auswählen

library("nlme")
# sapply(126:nrow(iris), function(i) lm( rep(1, i-5) ~ . + 0, data=iris[6:i, -5])$coef)
myIris <- iris[-5]
myIris$eins <- 1
mygls <-  function(i)   gls(eins ~ 0 + . , data=myIris[6:i, ])$coef
sapply(126:nrow(iris), mygls)
Gruß, Jörg