Seite 1 von 2
Kleinste Quadrate Schätzer
Verfasst: Mi Jun 03, 2020 2:33 pm
von Gwinzy
Hallo,
ich soll eine kleinste-Quadrate Schätzung programmieren.
Meine Funktion ist die folgende:
Code: Alles auswählen
attach(swiss)
meinlogit <- function (x,y)
{
(solve(t(x)%*%x)[1,1]*t(x))%*%y
}
meinlogit(Education, Fertility)
Allerdings ist meine Ergebnis nicht das gleiche wie das von
Kann mir da vielleicht jemand helfen?
Liebe Grüße
Gwinzy
Re: Kleinste Quadrate Schätzer
Verfasst: Mi Jun 03, 2020 2:55 pm
von ruedi_br
etwas output - der beiden Funktionen und z.B. "str" des Datensatzes - wäre als Input hilfreich.
VG
Ruedi
Re: Kleinste Quadrate Schätzer
Verfasst: Mi Jun 03, 2020 3:34 pm
von jogo
Hallo GwinZy,
Gwinzy hat geschrieben: Mi Jun 03, 2020 2:33 pm
Code: Alles auswählen
attach(swiss)
meinlogit <- function (x,y)
{
(solve(t(x)%*%x)[1,1]*t(x))%*%y
}
meinlogit(Education, Fertility)
Allerdings ist meine Ergebnis nicht das gleiche wie das von
Der Teil
[1,1] ist falsch. Richtig muss es heißen:
Code: Alles auswählen
meinlogit <- function (x,y)
{
(solve(t(x)%*%x)*t(x))%*%y
}
Dies kann noch verkürzt werden zu:
Code: Alles auswählen
meinlogit <- function (x,y) solve( t(x)%*%x, t(x)%*%y )
bzw.
Code: Alles auswählen
meinlogit <- function (x,y) solve( crossprod(x), crossprod(x, y))
Diese händische Berechnung ist von der numerischen Stabilität viel schlechter als der Algorithmus, der bei
lm() eingesetzt wird.
Gruß, Jörg
Re: Kleinste Quadrate Schätzer
Verfasst: Mi Jun 03, 2020 4:16 pm
von Gwinzy
Hallo Ruedi und Jörg,
danke, aber ich habe jetzt eine andere Formel benutzt, mit der ich auf das richtige Ergebnis gekommen bin.
Re: Kleinste Quadrate Schätzer
Verfasst: Mi Jun 03, 2020 7:19 pm
von jogo
Hallo Gwinzy,
die Formel interessiert mich.
Vielleicht kenne ich sie noch nicht.
Zeig doch mal bitte!
Gruß, Jörg
Re: Kleinste Quadrate Schätzer
Verfasst: Fr Jun 05, 2020 4:03 pm
von Gwinzy
Code: Alles auswählen
attach(swiss)
meinlogit <- function (x,y)
{ idx <- (1:length(x))
nenner <- 0
zaehler <- 0
for(i in idx){
zaehler <- zaehler + (x[i]-mean(x))*(y[i]-mean(y))
nenner <- nenner + (x[i]-mean(x))^2
}
zaehler/nenner
}
/code]
Re: Kleinste Quadrate Schätzer
Verfasst: Fr Jun 05, 2020 9:39 pm
von jogo
Hallo Gwinzy,
vielen Dank!
Kannst Du mir trotzdem zeigen, wie diese Funktion jetzt die gleichen Ergebnisse liefert wie
(wenigstens bezüglich der Koeffizienten der Regression).
Wie rufst Du diese Funktion im Zusammenhang mit den Daten auf?
Bei mir sieht es so aus mit meiner Variante:
Code: Alles auswählen
X <- cbind(1, swiss$Education)
Y <- swiss$Fertility
solve( crossprod(X), crossprod(X, Y))
lm(Fertility ~ Education, data=swiss)
Gruß, Jörg
Re: Kleinste Quadrate Schätzer
Verfasst: Sa Jun 06, 2020 7:43 pm
von Gwinzy
Code: Alles auswählen
attach(swiss)
meinlogit <- function (x,y)
{ idx <- (1:length(x))
nenner <- 0
zaehler <- 0
beta <- 0
for(i in idx){
zaehler <- zaehler + (x[i]-mean(x))*(y[i]-mean(y))
nenner <- nenner + (x[i]-mean(x))^2
}
beta[2] <- zaehler/nenner
beta[1] <- mean(y)-beta[2]*mean(x)
return (list(beta[1], beta[2]))
}
meinlogit(Education, Fertility)
summary(lm(Fertility ~ Education))
meinlogit gibt dann das beta0 und beta1 (oder alpha und beta, je nach Definition) für den KQS zurück.
Die Werte stimmen mit den "Estimate" Werten von summary(lm()) überein:
Aber deine Lösung ist natürlich deutlich eleganter
Re: Kleinste Quadrate Schätzer
Verfasst: So Jun 07, 2020 10:03 am
von jogo
Hallo Gwinzy,
klar - jetzt sehe ich es auch.
Du hast die beiden Normalgleichungen für die einfache lineare Regression für die Lösung genommen.
Soweit ist alles ok.
Allerdings machst Du nicht von vektorisiertem Rechnen Gebrauch. Es geht auch ohne for-Schleife:
Code: Alles auswählen
zaehler <- sum((x-mean(x))*(y-mean(y)))
nenner <- sum( (x-mean(x))^2)
... und
attach() ist Teufelszeug. Bitte nicht verwenden!
viewtopic.php?f=7&t=5
Gruß, Jörg
Re: Kleinste Quadrate Schätzer
Verfasst: So Jun 07, 2020 2:05 pm
von Gwinzy
Danke für die Tipps, so schaut es echt gleich viel schöner aus
