如何在回归中强制R使用指定的因子水平作为参考?


112

如果我在回归中使用二进制解释变量,如何告诉R使用某个级别作为参考?

默认情况下,它仅使用某个级别。

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

b {0, 1, 2, 3, 4}。假设我要使用3而不是R使用的零。


9
您应该在模型公式/拟合之外执行数据处理步骤。从中创建因子时,b可以使用来指定级别的顺序factor(b, levels = c(3,1,2,4,5))。但是,在lm()调用之外的数据处理步骤中执行此操作。我在下面的回答中使用该relevel()函数,因此您可以创建一个因子,然后根据需要调整参考水平。
加文·辛普森

1
我改写了你的问题。实际上,您是在更改参考水平,没有遗漏任何参考。
Joris Meys 2010年

重述我的问题。确实,relevel()是我想要的。谢谢你的详细答案和示例。我不确定线性回归标签是否会引起误解,因为这适用于使用虚拟解释器进行的所有回归...
Matt Bannert 2010年

Answers:


152

参见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)

现在改变的因素bDF通过使用的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

9
要预设原始变量,只需不使用within,而是df$bR = relevel(df$b, ref=3)
BurninLeo

1
您可以在公式中使用relevel(),而不会影响原始数据集...
Mehdi Zare

36

其他人提到的relevel命令是最好的解决方案,如果您想更改数据上所有分析的基本级别(或者愿意更改数据)。

如果您不想更改数据(这是一次更改,但是将来又希望再次使用默认行为),则可以结合使用C(请注意大写)功能设置对比度,并contr.treatments使用选择您要作为基准的级别的基本参数。

例如:

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

33

relevel()命令是您提出问题的简便方法。它的作用是对因子进行重新排序,以便使参考电平成为第一。因此,重新排序您的因子水平也将具有相同的效果,但可以为您提供更多控制。也许您想拥有3,4,0,1,2级。在这种情况下...

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

我更喜欢这种方法,因为它不仅使我更容易在代码中看到引用是什么,而且还更容易看到其他值的位置(而不是必须查看结果)。

注意:请勿使其成为有序因素。具有指定顺序的因子和有序因子不是同一件事。 lm()可能会开始认为您想要多项式对比。


2
多项式对比,而不是多项式回归。
哈德利2010年

有没有一种方法可以在定义因子的同时设置参考水平,而不是在随后的重新调整水平时调用?
大卫·布鲁斯·波伦斯坦

31

我知道这是一个老问题,但是我遇到了类似的问题,发现:

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

完全符合您的要求。


3
这是一个很大的帮助!唯一包含在lm()命令中执行此操作的方法的解决方案正是我所需要的。谢谢!
cparmstrong '18年

3
这是处理因素的非常灵活的方式。我喜欢这样的事实,as.factor()如果需要的话,我可以将其与之结合,例如使用...+relevel(as.factor(mycol), ref = "myref")+...
Peter

12

您还可以使用contrasts属性手动标记列,该属性似乎受到回归函数的尊重:

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

1

对于那些寻找dplyr / tidyverse版本的人。基于Gavin Simpson解决方案:

# 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)

我很困惑为什么您将“ If the variable is a factor”放置在了您的位置……无论您使用relevel()还是forcats::fct_relevel()
Gregor Thomas

您是正确的,谢谢!我添加了“您也可以使用”,因为afaik,fct_relevel仅适用于因子。
Gorka

2
relevel仅适用于因素。fct_relevel仅适用于因素。除了名称AFAIK外,其他功能之间没有其他区别。说“如果变量是一个因素,您也可以使用fct_relevel”,则表示如果变量不是一个因素,则可以使用relevel,但这不是事实。
格雷戈尔·托马斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.