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

Mat*_*ert 100 regression r linear-regression categorical-data dummy-variable

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

它只是默认使用某个级别.

lm(x ~ y + as.factor(b)) 
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*son 140

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)
Run Code Online (Sandbox Code Playgroud)

现在改变的因素bDF通过使用的relevel()功能:

DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)
Run Code Online (Sandbox Code Playgroud)

模型估计了不同的参考水平.

> 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
Run Code Online (Sandbox Code Playgroud)

  • 要预先设置原始变量,只需不要使用`within`,但是`df $ bR = relevel(df $ b,ref = 3)`. (7认同)

Gre*_*now 34

其他人提到了relevel命令,如果您想要更改数据上所有分析的基本级别(或者愿意改变数据),那么该命令是最佳解决方案.

如果您不想更改数据(这是一次性更改,但将来又需要默认行为),那么您可以使用C(注释大写)函数的组合来设置对比度和contr.treatments函数用于选择要作为基线的级别的基本参数.

例如:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 30

relevel()命令是您问题的简写方法.它的作用是对因子进行重新排序,以便首先是参考水平.因此,重新排序您的因子水平也会产生相同的效果,但会给您更多的控制.也许你想要等级3,4,0,1,2.在这种情况下...

bFactor <- factor(b, levels = c(3,4,0,1,2))
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方法,因为我更容易在代码中看到引用的内容,以及其他值的位置(而不是必须查看结果).

注意:请勿使其成为有序因子.具有指定顺序和有序因子的因子不是一回事. lm()如果你这样做,可能会开始认为你想要多项式对比.

  • 多项式对比,而不是多项式回归. (2认同)

小智 25

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

lm(x ~ y + relevel(b, ref = "3")) 
Run Code Online (Sandbox Code Playgroud)

完全按照你的要求行事.

  • 这是一个很大的帮助!只有解决方案包含了在lm()命令中执行此操作的方法,这正是我所需要的.谢谢! (3认同)
  • 这是一种非常灵活的处理因素的方法.我喜欢这样的事实:如果需要,我可以将它与`as.factor()`结合起来,例如使用`... + relevel(as.factor(mycol),ref ="myref")+ ...` (2认同)

Har*_*lan 11

您还可以使用contrasts属性手动标记列,这似乎是回归函数所遵循的:

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))
Run Code Online (Sandbox Code Playgroud)