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

#r #dataframe #glm

Вопрос:

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

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

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

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

Комментарии:

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

2. Я переформулировал ваш вопрос. На самом деле вы хотите изменить базовый уровень, а не оставить его без внимания.

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

Ответ №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
 

Комментарии:

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

2. Вы можете использовать функцию relevel() внутри своей формулы, это не повлияет на исходный набор данных…

3. Можно ли использовать этот подход для построения всех уровней факторов вместе на графике коэффициентов?

Ответ №2:

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

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

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

Комментарии:

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

2. Это очень гибкий способ работы с факторами. Мне нравится тот факт, что я могу as.factor() при необходимости комбинировать его, например, с помощью ... relevel(as.factor(mycol), ref = "myref") ...

3. Это, безусловно, лучшее решение здесь! Я люблю это.

Ответ №3:

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

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

Например:

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

Ответ №4:

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

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

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

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

Комментарии:

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

2. Есть ли способ установить базовый уровень одновременно с определением фактора, а не при последующем вызове relevel?

3. По какой-то причине R рассматривает мою переменную как упорядоченную (это просто набор строк), есть идеи, как это исправить?

4. Лучше всего задавать новые вопросы отдельно. Вы можете сослаться на это и сказать, что тратите его, но лучше не скрывать новые материалы в комментариях.

Ответ №5:

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

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

Ответ №6:

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

Комментарии:

1. Я в замешательстве, почему вы поставили «Если переменная является фактором» там, где вы это сделали… это необходимо независимо от того, используете ли вы relevel() или forcats::fct_relevel()

2. Вы правы, спасибо! Я добавил «вы также можете использовать», потому что, afaik, уровень fct_rel работает только с факторами.

3. relevel работает только с факторами. fct_relevel работает только с факторами. Между функциями нет никакой разницы, кроме имени, AFAIK. Выражение «Если переменная является фактором , вы также можете использовать fct_relevel » подразумевает, что если переменная не является фактором , вы могли бы использовать relevel , но это неверно.