Как заставить R использовать указанный уровень фактора в качестве эталона в регрессии?

Как я могу сказать R использовать определенный уровень в качестве ссылки, если я использую двоичные объясняющие переменные в регрессии?

Он просто использует какой-то уровень по умолчанию.

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

с b {0, 1, 2, 3, 4}, Допустим, я хочу использовать 3 вместо нуля, который используется R.

5 ответов

Решение

Увидеть 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

Я знаю, что это старый вопрос, но у меня была похожая проблема, и я обнаружил, что:

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

делает именно то, что вы просили.

Другие упоминали relevel Команда, которая является наилучшим решением, если вы хотите изменить базовый уровень для всех анализов ваших данных (или хотите жить с изменением данных).

Если вы не хотите изменять данные (это однократное изменение, но в будущем вам снова понадобится поведение по умолчанию), тогда вы можете использовать комбинацию C (обратите внимание на верхний регистр), чтобы установить контрасты и contr.treatments Функция с базовым аргументом для выбора уровня, который вы хотите использовать в качестве базового уровня.

Например:

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

relevel() Команда является сокращенным методом для вашего вопроса. Что он делает, так это переупорядочивает фактор так, чтобы независимо от уровня реферирования он был первым. Поэтому изменение порядка уровней факторов также будет иметь тот же эффект, но даст вам больше контроля. Возможно, вы хотели иметь уровни 3,4,0,1,2. В таком случае...

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

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

ПРИМЕЧАНИЕ: НЕ делайте это упорядоченным фактором. Фактор с указанным порядком и упорядоченным фактором не одно и то же. lm() может начать думать, что вы хотите полиномиальных контрастов, если вы сделаете это.

Вы также можете вручную пометить столбец contrasts атрибут, который, кажется, учитывается функциями регрессии:

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

Для тех, кто ищет версию 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)
Другие вопросы по тегам