GLS Regression

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
luckynele
Beiträge: 11
Registriert: Fr Mai 17, 2019 11:39 am

GLS Regression

Beitrag von luckynele » Fr Jun 14, 2019 12:16 pm

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?
Zuletzt geändert von luckynele am Fr Jun 21, 2019 2:35 pm, insgesamt 3-mal geändert.

jogo
Beiträge: 1523
Registriert: Fr Okt 07, 2016 8:25 am

Re: GLS Regression

Beitrag von jogo » Fr Jun 14, 2019 12:55 pm

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

luckynele
Beiträge: 11
Registriert: Fr Mai 17, 2019 11:39 am

Re: GLS Regression

Beitrag von luckynele » Fr Jun 14, 2019 2:12 pm

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)

jogo
Beiträge: 1523
Registriert: Fr Okt 07, 2016 8:25 am

Re: GLS Regression

Beitrag von jogo » Fr Jun 14, 2019 3:09 pm

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

luckynele
Beiträge: 11
Registriert: Fr Mai 17, 2019 11:39 am

Re: GLS Regression

Beitrag von luckynele » Fr Jun 14, 2019 7:14 pm

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?

jogo
Beiträge: 1523
Registriert: Fr Okt 07, 2016 8:25 am

Re: GLS Regression

Beitrag von jogo » Fr Jun 14, 2019 8:57 pm

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

Antworten