Als Vorbemerkung zu einer Frage zu linear gemischten Modellen in R und als Referenz für Kenner der Statistik für Anfänger und Fortgeschrittene entschied ich mich, die Schritte, die bei der "manuellen" Berechnung der R-Werte erforderlich sind, als unabhängigen "Q & A-Stil" zu veröffentlichen Koeffizienten und vorhergesagte Werte einer einfachen linearen Regression.
Das Beispiel bezieht sich auf den in R eingebauten Datensatz mtcars
und wird als Meilen pro Gallone festgelegt, die von einem Fahrzeug verbraucht werden, das als unabhängige Variable fungiert, die über das Gewicht des Fahrzeugs (kontinuierliche Variable) und die Anzahl der Zylinder als a zurückgegangen ist Faktor mit drei Ebenen (4, 6 oder 8) ohne Wechselwirkungen.
BEARBEITEN: Wenn Sie an dieser Frage interessiert sind, werden Sie in diesem Beitrag von Matthew Drury außerhalb des Lebenslaufs definitiv eine ausführliche und zufriedenstellende Antwort finden .
quelle
Antworten:
Hinweis : Ich habe eine erweiterte Version dieser Antwort auf meiner Website veröffentlicht .
Sicher! Das Kaninchenloch runter gehen wir.
Die erste Schicht ist
lm
die Schnittstelle, die dem R-Programmierer ausgesetzt ist. Sie können die Quelle dafür anzeigen, indem Sie einfachlm
an der R-Konsole tippen. Der größte Teil davon (wie der größte Teil des Codes auf Produktionsebene) ist damit beschäftigt, Eingaben zu überprüfen, Objektattribute festzulegen und Fehler zu werfen. aber diese Linie ragt herauslm.fit
ist eine andere R-Funktion, die Sie selbst aufrufen können. Funktioniert zwarlm
bequem mit Formeln und Datenrahmen,lm.fit
möchte aber Matrizen, so dass eine Abstraktionsebene entfernt wird.lm.fit
Suchen Sie nach der Quelle , nach mehr Arbeit und nach der folgenden wirklich interessanten ZeileJetzt kommen wir voran.
.Call
ist Rs Art, C-Code aufzurufen. Es gibt eine C-Funktion, C_Cdqrls, irgendwo in der R-Quelle, und wir müssen sie finden. Hier ist es .Wenn wir uns die C-Funktion noch einmal ansehen, finden wir meistens eine Überprüfung der Grenzen, eine Fehlerbereinigung und viel Arbeit. Aber diese Linie ist anders
Jetzt sind wir in unserer dritten Sprache, R hat C gerufen, was fortran anruft. Hier ist der Fortran-Code .
Der erste Kommentar sagt alles
(Interessanterweise wurde der Name dieser Routine irgendwann geändert, aber jemand hat vergessen, den Kommentar zu aktualisieren). Damit sind wir endlich an dem Punkt angelangt, an dem wir eine lineare Algebra erstellen und das Gleichungssystem tatsächlich lösen können. Dies ist die Art von Dingen, in denen Fortran wirklich gut ist, was erklärt, warum wir so viele Schichten durchlaufen haben, um hierher zu gelangen.
Der Kommentar erklärt auch, was der Code tun wird
Also wird fortran das System lösen, indem es die Zerlegung findet.Q R
Das Erste, was passiert, und bei weitem das Wichtigste, ist
Dies ruft die fortran -Funktion
dqrdc2
in unserer Eingabematrix aufx
. Was ist das?Also haben wir es endlich geschafft, Linpack zu machen . Linpack ist eine Fortran-Bibliothek für lineare Algebra, die es seit den 70er Jahren gibt. Die schwerste lineare Algebra findet schließlich ihren Weg zum Linpack. In unserem Fall verwenden wir die Funktion dqrdc2
Hier wird die eigentliche Arbeit erledigt. Es würde einen guten ganzen Tag dauern, bis ich herausgefunden hätte, was dieser Code tut. Er ist so niedrig wie er kommt. Aber im Allgemeinen haben wir eine Matrix und wollen sie in ein Produkt zerlegen, wobei eine orthogonale Matrix und eine obere Dreiecksmatrix ist. Dies ist eine kluge Sache, denn sobald Sie und , können Sie die linearen Gleichungen für die Regression lösenX = Q R Q R Q RX X= Q R Q. R Q. R
sehr leicht. Tatsächlich
so wird das ganze system
aber ist das obere Dreieck und hat den gleichen Rang wie , solange unser Problem gut gestellt ist, ist es der volle Rang, und wir können das reduzierte System genauso gut lösenX t XR XtX
Aber hier ist die tolle Sache. ist das obere Dreieck, also ist die letzte lineare Gleichung gerade , also ist das Auflösen nach trivial. Sie können dann die Zeilen nacheinander durchlaufen und die bereits bekannten Werte ersetzen , wobei Sie jedes Mal eine einfache lineare Gleichung mit einer Variablen zur Lösung erhalten. Sobald Sie also und , kollabiert das Ganze zu einer so genannten Rückwärtssubstitution , was einfach ist. Sie können hier ausführlicher darüber lesen , wo ein explizites kleines Beispiel vollständig ausgearbeitet ist.β n β Q RR βn β Q. R
constant * beta_n = constant
quelle
Die tatsächlichen schrittweisen Berechnungen in R werden in der Antwort von Matthew Drury in diesem Thread sehr schön beschrieben. In dieser Antwort möchte ich durch den Prozess des Beweises gehen, dass die Ergebnisse in R mit einem einfachen Beispiel erreicht werden können, indem man der linearen Algebra von Projektionen auf den Spaltenraum und dem Konzept der senkrechten (Skalarprodukt-) Fehler folgt, die in verschiedenen Beiträgen dargestellt werden und erklärte schön Dr. Strang in Lineare Algebra und ihre Anwendungen und leicht zugänglich hier .
lm
Identisch mit:
coef(lm(mpg ~ wt + as.factor(cyl)-1))
.y_hat <- HAT %*% mpg
cyl <- as.factor(cyl); OLS <- lm(mpg ~ wt + cyl); predict(OLS)
:quelle
beta = solve(t(X) %*% X, t(X) %*% y)
ist in der Praxis genauer alssolve(t(X) %*% X) %*% t(X) %*% y
.R
für wichtige Berechnungen von Nutzen ist , möchte ich Sie bitten, ihn in einen Beitrag zu unserem Blog zu