Випадання змінної у формулі lm все ще викликає помилку контрасту


9

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


3
Цікаво, що обидва 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
вимикається

1
@MrFlick - схоже, що параметр без виконання в R neg.out=може бути пов'язаний. З файлів довідки S для terms, де neg.out=реалізовано: прапор, що контролює обробку термінів, що вводяться зі знаком "-". Якщо ПРАВИЛЬНО, умови перевіряються на скасування та інакше ігноруються. Якщо FALSE, негативні терміни будуть збережені (з негативним порядком).
thelatemail

1
@MauritsEvers: lmвикликає model.matrixмодифіковану версію даних. На самому початку, lmсостовляющие і оцінює такі вирази: mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE ). Це x3стає причиною однорівневого чинника. model.matrix()Тоді викликається mf, а не вихідні дані, що призводить до помилки, яку ми спостерігаємо.
Артем Соколов

Відповіді:


2

Помилка, яку ви отримуєте, полягає в тому, що 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"])

Загалом, це приємне рішення. Одне, що слід виправити, - це те, що -x3у формулі не виникає lmдумки, що ви намагаєтесь відняти стовпчик. Намір "не використовувати x3 в моделі" повідомляється правильно, але проблема полягає в тому, що lmдзвінки, що model.frame( ..., drop.unused.levels=TRUE )викликають x3перетворення в однорівневий фактор, призводять до проблем у низці потоку в model.matrix().
Артем Соколов

Дякую за роз’яснення Артему Соколову, я взяв це неправильне пояснення із своєї відповіді.
Dylan_Gomes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.