Sto provando a eseguire lm () solo su un sottoinsieme dei miei dati e ho riscontrato un problema.
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)
Quanto sopra non funziona perché il set di dati ora ha solo uomini e quindi non possiamo includere x3, la variabile di genere, nel modello. MA...
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
Questo è un problema con la notazione "segno meno" nella formula? Per favore, consiglio. Nota: certo che posso farlo in un modo diverso; per esempio, potrei escludere le variabili prima di metterle in lm (). Ma sto insegnando un corso su queste cose e non voglio confondere gli studenti, avendo già detto loro che possono escludere le variabili usando un segno meno nella formula.
.
per ottenere una formula semplificata, terms(y ~ . -x3, data=dt, simplify=TRUE)
ma stranamente mantiene ancora x3
l'attributo variabili che inciampalm
neg.out=
opzione non implementata in R potrebbe essere correlata. Dai file della guida S per terms
, dove neg.out=
è implementato: flag che controlla il trattamento dei termini che entrano con il segno "-". Se TRUE, i termini verranno controllati per la cancellazione e altrimenti ignorati. Se FALSO, i termini negativi verranno mantenuti (con ordine negativo).
lm
chiama model.matrix
una versione modificata dei dati. All'inizio, lm
compone e valuta l'espressione seguenti: mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )
. Questo fa x3
diventare un fattore a livello singolo. model.matrix()
viene quindi chiamato mf
, non i dati originali, causando l'errore che stiamo osservando.
model.matrix(y ~ . - x3, data = dt[x3 == "men"])
emodel.matrix(y ~ x1 + x2, data = dt[x3 == "men"])
di lavoro (lm
chiamatemodel.matrix
internamente). L'unica differenza tra le due matrici del modello è un"contrasts"
attributo (che contiene ancorax3
) e che viene raccolto più avanti nellalm
routine, probabilmente causando l'errore che stai vedendo. Quindi la mia sensazione è che il problema abbia a che fare con il modo in cuimodel.matrix
crea e memorizza la matrice del design quando si rimuovono i termini.