Як змусити R використовувати заданий рівень коефіцієнта як еталон у регресії?


112

Як я можу сказати R використовувати певний рівень як опорний, якщо я використовую бінарні пояснювальні змінні в регресії?

Це просто використання деякого рівня за замовчуванням.

lm(x ~ y + as.factor(b)) 

з b {0, 1, 2, 3, 4}. Скажімо, я хочу використовувати 3 замість нуля, який використовується Р.


9
Вам слід зробити крок обробки даних поза формулою / приміркою моделі. Створюючи коефіцієнт, bможна вказати впорядкування рівнів за допомогою factor(b, levels = c(3,1,2,4,5)). lm()Однак це зробити на кроці обробки даних поза викликом. У моїй відповіді нижче використовується relevel()функція, щоб ви могли створити коефіцієнт, а потім змістити базовий рівень навколо, як вам потрібно.
Гевін Сімпсон

1
Я переформулював ваше запитання. Ви насправді змінюєте еталонний рівень, не залишаючи його осторонь.
Йоріс Мейс

THX для переформулювання мого питання. Справді, я шукав relevel (). Thx для детальної відповіді та прикладу, хоча. Я не впевнений, що тег лінійної регресії трохи вводить в оману, оскільки це стосується всіх видів регресії з використанням фіктивних пояснень ...
Метт Баннерт

Відповіді:


152

Дивіться relevel()функцію. Ось приклад:

set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))
head(DF)
str(DF)

m1 <- lm(y ~ x + b, data = DF)
summary(m1)

Тепер змінити коефіцієнт bу DF, використовуючи relevel()функцію:

DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)

Моделі оцінювали різні рівні відліку.

> coef(m1)
(Intercept)           x          b2          b3          b4          b5 
  3.2903239   1.4358520   0.6296896   0.3698343   1.0357633   0.4666219 
> coef(m2)
(Intercept)           x          b1          b2          b4          b5 
 3.66015826  1.43585196 -0.36983433  0.25985529  0.66592898  0.09678759

9
Щоб встановити початкову змінну, просто не використовуйте within, але df$bR = relevel(df$b, ref=3).
BurninLeo

1
Ви можете використовувати relevel () у своїй формулі, це не вплине на початковий набір даних ...
Mehdi Zare

36

Інші згадали relevelкоманду, яка є найкращим рішенням, якщо ви хочете змінити базовий рівень для всіх аналізів своїх даних (або готові жити зі зміною даних).

Якщо ви не хочете змінювати дані (це одноразова зміна, але в майбутньому ви хочете знову поведінку за замовчуванням), тоді ви можете використовувати комбінацію функції C(замість верхнього регістру) для встановлення контрастів і contr.treatmentsфункції з базовий аргумент для вибору рівня, який ви бажаєте бути базовим.

Наприклад:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )

33

relevel()Команда є методом стенографії на ваше запитання. Що потрібно зробити, це змінити порядок фактора, щоб на першому місці був рівень реф. Таким чином, упорядкування рівнів фактора також матиме такий же ефект, але дає більше контролю. Можливо, ви хотіли мати рівні 3,4,0,1,2. В такому разі...

bFactor <- factor(b, levels = c(3,4,0,1,2))

Я вважаю за краще цей метод, тому що мені простіше бачити в своєму коді не тільки те, що було посиланням, але і позицію інших значень (а не для того, щоб шукати результати для цього).

ПРИМІТКА: НЕ робіть це впорядкованим фактором. Коефіцієнт із заданим порядком та упорядкованим коефіцієнтом - це не одне і те ж. lm()може почати думати, що ви хочете поліноміальних контрастів, якщо це зробите.


2
Поліноміальні контрасти, а не поліноміальна регресія.
хадлі

Чи є спосіб встановити контрольний рівень одночасно, коли ви визначаєте коефіцієнт, а не в наступному дзвінку на повторний рівень?
Девід Брюс Боренштейн

31

Я знаю, що це давнє питання, але у мене виникло подібне питання, і я виявив, що:

lm(x ~ y + relevel(b, ref = "3")) 

робить саме те, що ви просили.


3
Це була велика допомога! Єдине рішення, яке включало спосіб зробити це в команді lm (), саме це мені було потрібно. Дякую!
cparmstrong

3
Це дуже гнучкий спосіб роботи з факторами. Мені подобається те, що я можу комбінувати його з as.factor()потребою, наприклад, використовуючи...+relevel(as.factor(mycol), ref = "myref")+...
Петро

12

Ви також можете вручну позначити стовпчик за contrastsатрибутом, який, здається, виконується функціями регресії:

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))

1

Для тих, хто шукає версію dplyr / tidyverse. Спираючись на рішення Гевіна Сімпсона:

# Create DF
set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))

# Change reference level
DF = DF %>% mutate(b = relevel(b, 3))

m2 <- lm(y ~ x + b, data = DF)
summary(m2)

Я заплутався , чому ви поклали «Якщо змінна є фактором» , де ви зробили ... це необхідно використовувати ви relevel()абоforcats::fct_relevel()
Грегор Томас

Ви праві, дякую! Я додав "ви також можете використовувати", тому що, afaik, fct_relevel працює лише з факторами.
Горка

2
relevelпрацює лише з факторами. fct_relevelпрацює лише з факторами. Немає різниці між функціями, крім назви, AFAIK. "Якщо змінна є фактором, який ви також можете використовувати fct_relevel", це означає, що якщо ця зміна не є фактором, який ви можете використовувати relevel, але це неправда.
Грегор Томас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.