Я пытаюсь запустить 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 (). Но я преподаю урок по этому вопросу, и я не хочу вводить студентов в заблуждение, уже сказав им, что они могут исключить переменную, используя знак минус в формуле.
.
чтобы получить упрощенную формулу, 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
, а не исходные данные, что приводит к ошибке, которую мы наблюдаем.
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
создается и сохраняется матрица дизайна при удалении терминов.