Как заставить R использовать заданный уровень фактора в качестве эталона в регрессии? - PullRequest
93 голосов
/ 06 октября 2010

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

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

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

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

Ответы [ 5 ]

131 голосов
/ 06 октября 2010

См. Функцию 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
33 голосов
/ 06 октября 2010

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

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

Например:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )
27 голосов
/ 06 октября 2010

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

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

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

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

22 голосов
/ 14 декабря 2017

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

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

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

11 голосов
/ 06 октября 2010

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

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...