Ich möchte einen Vektor B für jede der Spalten in einer Matrix A regressieren. Dies ist trivial, wenn keine Daten fehlen. Wenn die Matrix A jedoch fehlende Werte enthält, darf meine Regression für A nur Zeilen enthalten, in denen alle enthalten sind Werte sind vorhanden (das Standardverhalten von na.omit ). Dies führt zu falschen Ergebnissen für Spalten ohne fehlende Daten. Ich kann die Spaltenmatrix B gegen einzelne Spalten der Matrix A regressieren, aber ich habe Tausende von Regressionen zu tun, und dies ist unerschwinglich langsam und unelegant. Die Funktion na.exclude scheint für diesen Fall entwickelt worden zu sein, aber ich kann sie nicht zum Laufen bringen. Was mache ich hier falsch? Verwenden Sie R 2.13 unter OSX, wenn es darauf ankommt.
A = matrix(1:20, nrow=10, ncol=2)
B = matrix(1:10, nrow=10, ncol=1)
dim(lm(A~B)$residuals)
# [1] 10 2 (the expected 10 residual values)
# Missing value in first column; now we have 9 residuals
A[1,1] = NA
dim(lm(A~B)$residuals)
#[1] 9 2 (the expected 9 residuals, given na.omit() is the default)
# Call lm with na.exclude; still have 9 residuals
dim(lm(A~B, na.action=na.exclude)$residuals)
#[1] 9 2 (was hoping to get a 10x2 matrix with a missing value here)
A.ex = na.exclude(A)
dim(lm(A.ex~B)$residuals)
# Throws an error because dim(A.ex)==9,2
#Error in model.frame.default(formula = A.ex ~ B, drop.unused.levels = TRUE) :
# variable lengths differ (found for 'B')
quelle
Antworten:
Edit: Ich habe deine Frage falsch verstanden. Es gibt zwei Aspekte:
a)
na.omit
undna.exclude
beide löschen nacheinander in Bezug auf Prädiktoren und Kriterien. Sie unterscheiden sich nur darin, dass Extraktorfunktionen ihre Ausgabe für die ausgelassenen Fälle mit s auffüllenresiduals()
oderfitted()
auffüllen und somit eine Ausgabe mit der gleichen Länge wie die Eingabevariablen haben.NA
na.exclude
b) Das eigentliche Problem liegt nicht in diesem Unterschied zwischen
na.omit
undna.exclude
. Sie möchten anscheinend keine zufällige Löschung, bei der Kriterienvariablen berücksichtigt werden, was beide tun.lm()
indem Sie folgendermaßen vorgehen:lm()
quelle
Ich kann mir zwei Möglichkeiten vorstellen. Man kombiniert die Daten mit
na.exclude
und trennt dann die Daten wieder:Eine andere Möglichkeit besteht darin, das
data
Argument zu verwenden und eine Formel zu erstellen.Wenn Sie viel Regression betreiben, sollte der erste Weg schneller sein, da weniger Hintergrundmagie ausgeführt wird. Wenn Sie jedoch nur Koeffizienten und Residuen benötigen, empfehle ich die Verwendung von
lsfit
, die viel schneller ist alslm
. Der zweite Weg ist ein bisschen netter, aber der Versuch, auf meinem Laptop eine Zusammenfassung der resultierenden Regression zu erstellen, löst einen Fehler aus. Ich werde versuchen zu sehen, ob dies ein Fehler ist.quelle
Das folgende Beispiel zeigt, wie Vorhersagen und Residuen erstellt werden, die dem ursprünglichen Datenrahmen entsprechen (unter Verwendung der Option "na.action = na.exclude" in lm (), um anzugeben, dass NAs in den Residuen- und Vorhersagevektoren platziert werden sollen, in denen sich der ursprüngliche Datenrahmen befindet Es wird auch gezeigt, wie angegeben werden kann, ob Vorhersagen nur Beobachtungen enthalten sollten, bei denen sowohl erklärende als auch abhängige Variablen vollständig waren (dh ausschließlich Vorhersagen in der Stichprobe), oder Beobachtungen, bei denen die erklärenden Variablen vollständig waren und daher eine Xb-Vorhersage möglich ist ( dh einschließlich einer Vorhersage außerhalb der Stichprobe für Beobachtungen mit vollständigen erklärenden Variablen, denen jedoch die abhängige Variable fehlte).
Ich benutze cbind, um die vorhergesagten und verbleibenden Variablen zum ursprünglichen Datensatz hinzuzufügen.
quelle