73

如果我在回归中使用二元解释变量,我该如何告诉R使用某个级别作为参考?如何强制R在回归中使用指定的因子水平作为参考?

这只是默认使用一些级别。

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

b {0, 1, 2, 3, 4}。假设我想用3代替R使用的零。

+7

您应该执行模型公式/拟合之外的数据处理步骤。当从“b”创建因子时,可以使用因子(b,levels = c(3,1,2,4,5))'指定等级的顺序。尽管在lm()调用之外的数据处理步骤中执行此操作。我在下面的答案中使用了''''''''''''''函数,因此您可以创建一个因子,然后根据需要移动参考级别。 – 2010-10-06 12:14:31

+1

我重新提出了你的问题。你实际上是在改变参考水平之后,而不是离开一个。 – 2010-10-06 12:39:37

+0

thx重新说明我的问题。事实上,我正在寻找的是reavel()。 Thx为详细的答案和例子。我不确定线性回归标记是否有点误导,因为这适用于使用虚拟说明的各种回归... – 2010-10-07 08:52:03

回答

105

请参阅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()功能的改变因素bDF

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 
+2

为了预先存储原始变量,只是不要使用'within',而是'df $ bR =红宝石(df $ b,ref = 3)'。 – BurninLeo 2017-03-16 10:49:52

24

该命令是对你的问题的速记方法。它所做的是重新排序因子,以便首先考虑什么是参考水平。因此,重新排序因素水平也会产生相同的效果,但会给您更多的控制权。也许你想有3,4,0,1,2等级。在这种情况下...

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

我喜欢这种方法,因为它更容易对我来说,在我的代码不仅看到什么是参考,但其他值的位置以及(而不是看结果)。

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

+2

多项式对比,而不是多项式回归。 – hadley 2010-10-06 13:31:17

+0

有没有办法在定义因子的同时设置参考级别,而不是在随后的调用级别中调用? – 2016-10-18 15:11:22

28

其他人已经提到了如果你想改变你的数据的所有分析的基本级别(或愿意随着数据的改变而生活),那么最好的解决方案就是最好的解决方案。

如果您不想更改数据(这是一次性更改,但将来您希望再次使用默认行为),那么您可以使用C(注意大写)函数的组合来设置对比和控制处理功能与基本参数一起选择您想要成为基线的水平。例如:

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

您也可以手动标记与contrasts属性,它似乎是由回归函数得到尊重列:

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

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

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

完全是你问。

+0

这是一个很大的帮助!唯一的解决方案包括在lm()命令中执行它的方法,这正是我所需要的。谢谢! – seeellayewhy 2018-01-11 18:20:59