Я намагаюся запустити 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створюється і зберігається дизайнерська матриця при видаленні термінів.