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

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

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

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

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

Ответ 1

См. функцию 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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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