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

Code: Alles auswählen

summary(lm(Fertility ~ Education))
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

Code: Alles auswählen

summary(lm(Fertility ~ Education))
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

Code: Alles auswählen

summary(lm(Fertility ~ Education, data=swiss))
(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 :)