Отбрасывание переменной в формуле lm все еще вызывает ошибку контраста - PullRequest
9 голосов
/ 13 февраля 2020

Я пытаюсь запустить lm () только для подмножества моих данных и сталкиваюсь с проблемой.

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)

Выше не работает, потому что в наборе данных теперь есть только мужчины, и поэтому мы не можем включить x3, гендерную переменную, в модель. НО ...

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

Это проблема с пометкой «минус» в формуле? Пожалуйста посоветуй. Примечание: конечно, я могу сделать это по-другому; например, я мог бы исключить переменные до помещения их в lm (). Но я преподаю урок по этому вопросу, и я не хочу вводить студентов в заблуждение, уже сказав им, что они могут исключить переменную, используя знак минус в формуле.

1 Ответ

2 голосов
/ 13 февраля 2020

Ошибка, которую вы получаете, заключается в том, что x3 находится в модели только с одним значением = "men" (см. Комментарий ниже от @Artem Sokolov)

Один из способов ее решения - это поднабор заранее:

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

dmen<-dt[x3 == 'men'] # create a new subsetted dataset with just men

lm( y ~ ., dmen[,-"x3"]) # now drop the x3 column from the dataset (just for the model)

Или вы можете выполнить оба действия за один шаг:

lm( y ~ ., dt[x3 == 'men',-"x3"])
...