Я пытаюсь запустить 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 (). Но я преподаю урок по этому вопросу, и я не хочу вводить студентов в заблуждение, уже сказав им, что они могут исключить переменную, используя знак минус в формуле.
model.matrix(y ~ . - x3, data = dt[x3 == "men"])
иmodel.matrix(y ~ x1 + x2, data = dt[x3 == "men"])
работает (lm
звонитmodel.matrix
внутри). Единственное различие между обеими модельными матрицами заключается в"contrasts"
атрибуте (который все еще содержитсяx3
), который позже будет обнаружен в рамкахlm
подпрограммы, что, вероятно, приведет к появившейся ошибке. Поэтому я чувствую, что проблема связана с тем, какmodel.matrix
создается и сохраняется матрица дизайна при удалении терминов..
чтобы получить упрощенную формулу,terms(y ~ . -x3, data=dt, simplify=TRUE)
но, как ни странно, она все еще остаетсяx3
в атрибуте переменных, который срабатываетlm
neg.out=
может быть связана. Из справочных файлов S дляterms
, гдеneg.out=
реализовано: флаг, управляющий обработкой терминов, вводимых со знаком «-». Если TRUE, условия будут проверены на отмену и в противном случае проигнорированы. Если FALSE, отрицательные условия будут сохранены (с отрицательным порядком).lm
вызываетmodel.matrix
измененную версию данных. В самом начале,lm
состовляющие и оценивает следующие выражения:mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )
. Это заставляетx3
стать одноуровневым фактором.model.matrix()
затем вызываетсяmf
, а не исходные данные, что приводит к ошибке, которую мы наблюдаем.Ответы:
Ошибка, которую вы получаете, заключается в том, что x3 в модели только с одним значением =
"men"
(см. Комментарий ниже от @Artem Sokolov)Один из способов решить эту проблему заключается в подмножестве заранее:
Или вы можете сделать оба в одном шаге:
источник
-x3
в формуле вовсе не вызываетlm
думать , что вы пытаетесь вычесть столбец. «Не использовать x3 в модели» намерение передается правильно, но проблема в том , чтоlm
вызовыmodel.frame( ..., drop.unused.levels=TRUE )
вызываяx3
стать фактором одноуровневый, что приводит к проблемам в нижнем теченииmodel.matrix()
.