Regressionsgerade bei ungünstigem Datensatz



  • Hallo

    ich habe eine Punktemenge und will die Regressionsgerade berechnen. Leider klappt es nicht so richtig und ich weiß nicht genau wieso.

    Hier erstmal die Daten, kann man so zB in Matlab kopieren:

    X=[179 179 179 179 179 178 178 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 178 178 179 179 179 179 178 178 179 179 178 178 178 178 178 178 178 178 179 182];
    Y=[56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11];

    plot(X,Y,'bo')

    Matlab bekommt hier eine Steigung von ~ 3 heraus, was sich mit meiner eigenen Berechnung deckt und offensichtlich komplett falsch ist. Es sollte eine fast senkrechte Gerade herauskommen.

    Ich verwende die Formel aus Wikipedia:
    http://de.wikipedia.org/wiki/Lineare_Regression#Berechnung_der_Regressionsgeraden

    Numerische Probleme gibt es wegen dem Bruch nicht ( ~ 60/20). Aber irgend etwas läuft schief, ich weiß nur nicht was 😕



  • probiers mal ohne den ausreisser mit 182.
    trotzdem scheint mir hier eine regression problematisch, da das problem ziemlich schlecht konditioniert sein müsste.
    immerhin ist der erste eigenwert der matrix (X'X)^-1 gößer als 10^3.

    edit: mit X bezeichne ich die matrix (1|x), wobei x der vektor X bei dir ist.
    der OLS Schätzer ist dann beta.hat=(X'X)^-1X'y, und müsste mit deinem ergebnis übereinstimmen.
    ich hab (ohne ausreisser)

    [,1]
    [1,] -2504.28802
    [2,]    14.20507
    

    rausbekommen



  • Danke für die Antwort Jover.

    Dein Ergebnis sieht ziemlich gut aus, wenn man annimmt dass das erste der Achsenabschnitt und das zweite die Steigung ist.

    Leider kann ich die Rechnung nicht ganz nachvollziehen. Die Matrix (X' * X)^-1 hat bei mir nur 'inf' in allen Einträgen.
    Ist aber eigentlich auch wurscht. Ich muss die einfache Formel mit den Summen benutzen, da die Applikation sehr zeitkritisch ist. Große Matrizen invertieren geht nicht.

    Komischerweise funktioniert es bei anderen Geraden die ähnlich steil sind.



  • Zur Erklärung meiner Rechnung:

    Wenn man eine Regression rechnet, dann will man die Koeffizienten der Regressionsgerade (Hyperebene i.A.) so wählen, dass der quadratische Abstand zu den Beobachtungen y minimiert wird. Bezeichnet man die Matrix der Beobachtungen mit X (in jeder Spalte stehen die Beobachtungen einer Charakteristik die zur Erklärung der Beobachtungen y beiträgt), so ergibt das das Problem

    min S(beta)
    S(beta)=(y-X*beta)'(y-X*beta)
    

    (beta ist der Vektor der Koeffizienten der Schätzfunktion)
    Lösen wir diese Minimierungsaufgabe, so erhalten wir die Normalengleichung

    X'X*beta=X'y
    

    und beta.d ist genau dann ein Schätzer für beta, wenn er die Normalengleichung erfüllt.

    Ist X'X regulär, so hat die NGL genau eine Lösung, beta.d=(X'X)^-1X'y.

    Meine Matrix X hat zwei Spalten, in der ersten stehen lauter einsen und in die zweite Spalte schreibe ich die X-Werte von dir.
    Die 1-Spalte ist dazu da, dass die Regressionsgerade nicht durch den Nullpunkt geht, sondern entlang der y-Achse verschoben ist.

    Noch eine kurze Anmerkung: Ich glaube nicht, dass das invertieren einer 2x2-Matrix so viel Mehraufwand ist, als die Werte "direkt" zu berechnen.

    Ich hoffe, nun ist alles klar soweit.



  • Ah OK danke für die Erklärung. Ich hab vorhin nicht nur die 1-er Spalte vergessen, sonder auch noch die Matrizen falsch transponiert 🙄

    Wie auch immer, ich hab es jetzt mit einer Fallunterscheidung gelöst. Wenn die Boundingbox um alle Datenpunkte herum höher als breit ist, vertausche ich die x und y Koordinaten. Das sollte dann mit allen Steigungen funktionieren, bis auf extreme Beispiele mit einzelnen Ausreißern die die Boundingbox stark verzerren.

    PS
    Falls es noch jemanden interessiert: Wenn man Jover's Matrixoperationen auflöst kommt man (wenn ich mich nicht vertan habe) auf die Formeln der folgenden Seite
    http://mo.mathematik.uni-stuttgart.de/inhalt/aussage/aussage629/
    Das schöne daran ist, dass man keine Mittelwerte berechnen muss und man somit nur eine for Schleife über die Punkte braucht.



  • Darf ich fragen für welchen Zweck du die Regression brauchst?
    Mir scheint es, dass du kategoriale Daten hast und eine Regressionsmodell somit wenig Sinn macht.



  • Ich muss Quadrate in einem Bild finden, d.h. die vier Eckpunkte davon.
    Die Kanten der Quadrate können verrauscht und die Ecken verschliffen/abgerundet sein. Deswegen sammle ich alle Punkte ein, die ich entlang einer Kante finde und bilde davon die Ausgleichsgerade. Der Schnittpunkt je zweier solcher Geraden ist dann ein Eckpunkt des Quadrats.

    Hat in ersten Experimenten eigentlich ganz gut funktioniert.



  • Das Problem dabei ist, dass der Regressionsansatz nicht sehr robust gegenüber Ausreisser ist wie du gesehen hast.

    Aber wenns funktioniert, dann passts eh 😉


Anmelden zum Antworten