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

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

只是默认使用了某个级别。

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

假设我想使用3而不是 R 使用的0。

281838 次浏览

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

现在通过使用 relevel()函数改变 DF中的因子 b:

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

relevel()命令是对您的问题的一种速记方法。它所做的就是对因子重新排序,这样无论什么是引用级别都是第一个。因此,重新排序你的因素水平也将有相同的效果,但给你更多的控制。也许你想要3,4,0,1,2级。这样的话..。

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

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

注意: 不要使它成为一个有序因素。具有指定顺序的因子和具有指定顺序的因子不是一回事。如果你这样做,lm()可能会开始认为你需要多项式对比度。

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

如果你不想改变数据(这只是一次性的改变,但是将来你还是想要默认的行为) ,那么你可以使用 C(注意大写)函数的组合来设置对比度,使用 contr.treatments函数和基本参数来选择你想要成为基线的级别。

例如:

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

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

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

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

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

完全按你说的做。

对于那些寻找 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)