73

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

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

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

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

+7

Вы должны сделать шаг обработки данных вне формулы модели/фитинга. При создании коэффициента из 'b' вы можете указать порядок уровней, используя' factor (b, levels = c (3,1,2,4,5)) '. Сделайте это на этапе обработки данных вне вызова 'lm()'. В моем ответе ниже используется функция 'libervel()', поэтому вы можете создать коэффициент, а затем смещать опорный уровень вокруг так, как вам нужно. –

+1

Я переформулировал ваш вопрос.Фактически, вы меняете контрольный уровень, не оставляя его. –

+0

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

ответ

105

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

Чтобы преподать исходную переменную, просто не используйте 'inside', а' df $ bR = relevel (df $ b, ref = 3) '. – BurninLeo

24

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

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

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

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

+2

Полиномиальные контрасты, а не полиномиальная регрессия. – hadley

+0

Есть ли способ установить опорный уровень в то же время, когда вы определяете коэффициент, а не в последующем вызове для сброса? –

28

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

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

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

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

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

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

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

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

+0

Это была большая помощь! Только решение, которое включало способ сделать это в команде lm(), было именно тем, что мне было нужно. Благодаря! – seeellayewhy

Смежные вопросы