如果我在回归中使用二元解释变量,如何告诉 R 使用某个水平作为参考?
它只是默认使用某个级别。
lm(x ~ y + as.factor(b))
与b {0, 1, 2, 3, 4}
. 假设我想使用 3 而不是 R 使用的零。
如果我在回归中使用二元解释变量,如何告诉 R 使用某个水平作为参考?
它只是默认使用某个级别。
lm(x ~ y + as.factor(b))
与b {0, 1, 2, 3, 4}
. 假设我想使用 3 而不是 R 使用的零。
见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
我知道这是一个老问题,但我有一个类似的问题,发现:
lm(x ~ y + relevel(b, ref = "3"))
完全按照你的要求做。
relevel
如果您想更改所有数据分析的基础级别(或愿意忍受更改数据),其他人提到了该命令是最佳解决方案。
如果您不想更改数据(这是一次性更改,但将来您希望再次使用默认行为),那么您可以使用C
(注意大写)函数的组合来设置对比度和contr.treatments
函数用于选择要作为基线的级别的基本参数。
例如:
lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )
该relevel()
命令是您问题的速记方法。它所做的是重新排序因子,以便首先是参考级别。因此,重新排序您的因子水平也会产生相同的效果,但会给您更多的控制权。也许你想有级别 3,4,0,1,2。在这种情况下...
bFactor <- factor(b, levels = c(3,4,0,1,2))
我更喜欢这种方法,因为我更容易在我的代码中看到引用的内容以及其他值的位置(而不是必须查看结果)。
注意:不要让它成为一个有序的因素。具有指定顺序的因子和有序因子不是一回事。 lm()
如果你这样做,可能会开始认为你想要多项式对比。
您还可以使用contrasts
属性手动标记列,这似乎受到回归函数的尊重:
contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
base=which(levels(df$factorcol) == 'RefLevel'))
对于那些寻找 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)