Ich versuche, lm () nur für eine Teilmenge meiner Daten auszuführen und stoße auf ein Problem.
dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data
lm( y ~ ., dt) # Use all x: Works
lm( y ~ ., dt[x3 == 'men']) # Use all x, limit to men: doesn't work (as expected)
Dies funktioniert nicht, da der Datensatz nur noch Männer enthält und wir daher x3, die Geschlechtsvariable, nicht in das Modell aufnehmen können. ABER...
lm( y ~ . -x3, dt[x3 == 'men']) # Exclude x3, limit to men: STILL doesn't work
lm( y ~ x1 + x2, dt[x3 == 'men']) # Exclude x3, with different notation: works great
Dies ist ein Problem mit der "Minuszeichen" -Notation in der Formel? Bitte beraten. Hinweis: Natürlich kann ich es auch anders machen. Zum Beispiel könnte ich die Variablen ausschließen, bevor ich sie in lm () setze. Aber ich unterrichte eine Klasse über dieses Zeug, und ich möchte die Schüler nicht verwirren, da ich ihnen bereits gesagt habe, dass sie Variablen mit einem Minuszeichen in der Formel ausschließen können.
.
, um eine vereinfachte Formel zu erhalten, terms(y ~ . -x3, data=dt, simplify=TRUE)
aber seltsamerweise bleibt es immer noch x3
im Variablenattribut, das lm
neg.out=
Option " Nicht implementiert in R" verwandt sein könnte. Aus den S-Hilfedateien für terms
, wo neg.out=
implementiert: Flag, das die Behandlung von Begriffen steuert, die mit dem Zeichen "-" eingegeben werden. Wenn TRUE, werden die Bedingungen auf Stornierung überprüft und ansonsten ignoriert. Bei FALSE bleiben negative Begriffe erhalten (mit negativer Reihenfolge).
lm
Anrufe model.matrix
auf einer modifizierten Version der Daten. lm
Verfasst und bewertet zu Beginn den folgenden Ausdruck : mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )
. Dies führt x3
zu einem einstufigen Faktor. model.matrix()
wird dann aufgerufen mf
, nicht die Originaldaten, was zu dem Fehler führt, den wir beobachten.
model.matrix(y ~ . - x3, data = dt[x3 == "men"])
undmodel.matrix(y ~ x1 + x2, data = dt[x3 == "men"])
arbeiten (lm
Anrufemodel.matrix
intern). Der einzige Unterschied zwischen beiden Modellmatrizen besteht in einem"contrasts"
Attribut (das noch enthältx3
), das später in derlm
Routine erfasst wird und wahrscheinlich den angezeigten Fehler verursacht. Mein Gefühl ist also, dass das Problem damit zu tun hat, wiemodel.matrix
die Designmatrix beim Entfernen von Begriffen erstellt und gespeichert wird.