【问题标题】:How to force R to use a specified factor level as reference in a regression?如何强制 R 在回归中使用指定的因子水平作为参考?
【发布时间】:2011-04-21 18:52:45
【问题描述】:

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

默认情况下它只是使用一些级别。

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

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

【问题讨论】:

  • 您应该在模型公式/拟合之外进行数据处理步骤。从b 创建因子时,您可以使用factor(b, levels = c(3,1,2,4,5)) 指定级别的顺序。不过,请在 lm() 调用之外的数据处理步骤中执行此操作。我在下面的答案使用relevel() 函数,因此您可以创建一个因子,然后根据需要调整参考水平。
  • 我改写了你的问题。您实际上是在更改参考水平之后,而不是遗漏一个。
  • 感谢重新措辞我的问题。事实上, relevel() 是我正在寻找的。感谢详细的答案和示例。我不确定线性回归标签是否有点误导,因为这适用于使用虚拟解释的各种回归......

标签: r regression linear-regression categorical-data dummy-variable


【解决方案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)

【讨论】:

  • 我很困惑为什么你把“如果变量是一个因素”放在你做的地方......无论你使用relevel()还是forcats::fct_relevel(),这都是必要的
  • 你是对的,谢谢!我添加了“你也可以使用”,因为,afaik,fct_relevel 仅适用于因子。
  • relevel 仅适用于因子。 fct_relevel 仅适用于因子。除了名称AFAIK之外,功能之间没有任何区别。说“如果变量是一个因素,你也可以使用fct_relevel”意味着如果变量不是一个因素,你可以使用relevel,但事实并非如此。
【解决方案2】:

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

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

例如:

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

【讨论】:

    【解决方案3】:

    relevel() 命令是您问题的速记方法。它所做的是重新排序因子,以便首先是参考级别。因此,重新排序您的因子水平也会产生相同的效果,但会给您更多的控制权。也许你想有级别 3,4,0,1,2。那样的话……

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

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

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

    【讨论】:

    • 多项式对比,而不是多项式回归。
    • 有没有办法在定义因子的同时设置参考水平,而不是在随后调用 relevel 时?
    • 由于某种原因,R 将我的变量视为有序(它只是一堆字符串),知道如何解决这个问题吗?
    • 最好单独提出新问题。您可以链接到这个并说您正在使用它,但最好不要在 cmets 中隐藏新内容。
    【解决方案4】:

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

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

    完全按照你的要求去做。

    【讨论】:

    • 这是一个很大的帮助!只有包含在 lm() 命令中执行此操作的方法的解决方案,这正是我所需要的。谢谢!
    • 这是一种非常灵活的因子处理方式。我喜欢这样一个事实,如果需要,我可以将它与 as.factor() 结合使用,例如使用 ...+relevel(as.factor(mycol), ref = "myref")+...
    • 这是迄今为止最好的解决方案!我喜欢它。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      请参阅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
      

      【讨论】:

      • 要保留原始变量,不要使用within,而是使用df$bR = relevel(df$b, ref=3)
      • 您可以在公式中使用 relevel(),不会影响原始数据集...
      • 可以使用这种方法在系数图中将所有因子水平一起绘制吗?
      猜你喜欢
      • 2020-09-18
      • 1970-01-01
      • 2014-06-10
      • 2015-12-22
      • 2022-06-15
      • 2018-01-18
      • 2023-04-01
      相关资源
      最近更新 更多