J'essaie d'exécuter lm () uniquement sur un sous-ensemble de mes données et je rencontre un problème.
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)
Ce qui précède ne fonctionne pas car l'ensemble de données ne contient plus que des hommes, et nous ne pouvons donc pas inclure x3, la variable de genre, dans le modèle. MAIS...
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
C'est un problème avec la notation "signe moins" dans la formule? Veuillez conseiller. Remarque: bien sûr, je peux le faire d'une manière différente; par exemple, je pourrais exclure les variables avant de les mettre dans lm (). Mais j'enseigne une classe sur ce genre de choses, et je ne veux pas dérouter les élèves, leur ayant déjà dit qu'ils pouvaient exclure une variable en utilisant un signe moins dans la formule.
.
pour obtenir une formule simplifiée avec terms(y ~ . -x3, data=dt, simplify=TRUE)
mais curieusement, elle conserve toujours x3
l'attribut variables qui se déclenchelm
neg.out=
option non implémentée en R puisse être liée. A partir des fichiers d'aide S pour terms
, où neg.out=
est implémenté: indicateur contrôlant le traitement des termes entrant avec le signe "-". Si VRAI, les conditions seront vérifiées pour annulation et sinon ignorées. Si FAUX, les termes négatifs seront conservés (avec ordre négatif).
lm
appel model.matrix
à une version modifiée des données. Au tout début, lm
COMPOSES et évalue l'expression suivante: mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )
. Cela x3
devient un facteur à un niveau. model.matrix()
est ensuite appelé mf
, pas les données d'origine, ce qui entraîne l'erreur que nous observons.
model.matrix(y ~ . - x3, data = dt[x3 == "men"])
et lemodel.matrix(y ~ x1 + x2, data = dt[x3 == "men"])
travail (lm
appelsmodel.matrix
internes). La seule différence entre les deux matrices de modèle est un"contrasts"
attribut (qui contient toujoursx3
) et qui est récupéré plus tard dans lalm
routine, provoquant probablement l'erreur que vous voyez. Mon sentiment est donc que le problème est lié à la façon demodel.matrix
créer et de stocker la matrice de conception lors de la suppression des termes.