Я намагаюся запустити 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=
реалізовано: прапор, що контролює обробку термінів, що вводяться зі знаком "-". Якщо ПРАВИЛЬНО, умови перевіряються на скасування та інакше ігноруються. Якщо 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
створюється і зберігається дизайнерська матриця при видаленні термінів.