【问题标题】:Why does changing contrast type change row labels in R lm summary?为什么更改对比度类型会更改 R lm 摘要中的行标签?
【发布时间】:2012-06-04 05:59:18
【问题描述】:

使用 R (contr.treatment) 中的默认对比,线性模型对象的摘要根据级别名称给出行名称。当我将对比度更改为 contr.sum 时,线性模型对象的摘要会根据组成的数字给出行名称。

对于下面的示例代码,处理对比的行名称是 xa xb xc xd xe,对于总对比,它们是 x1 x2 x3 x4 x5。

除了手动重命名行之外,还有其他方法可以使它们的行为方式相同吗?

示例:

y <- rnorm(10, 0, 1)
x <- factor(rep(letters[1:5], each = 2))

options(contrasts = c("contr.treatment", "contr.poly"))
summary(lm(y ~ x))

options(contrasts = c("contr.sum", "contr.poly"))
summary(lm(y ~ x))

【问题讨论】:

  • 但它们不一样,不是吗?使用不同的对比意味着系数有不同的解释,那么为什么要给它们贴上相同的标签呢?
  • @joran,如果行标有组名,会改变您的解释吗?
  • 嗯,解释是不同的,不管它们在 R 的输出中是如何标记的。如果您只是想给它们贴上不同的标签,那么我认为您会在事后进行更改。我只是担心你解释总和对比的方式与你解释治疗对比的方式相同,但它们并不完全相同。
  • 我在这上面花了一点时间,并将其追溯到model.matrix。它仅适用于将对比度设置为默认值以外的其他值的情况。我同意@joran,我认为你被卡住了。 (您也可以明确设置对比并命名它们的列,然后将它们分配给特定的因素。)
  • 查看car 包中的contr.Treatment,了解如何使用不同名称的对比创建对比函数。

标签: r lm contrast


【解决方案1】:

我仍然不确定这是一个好主意,我认为对对比度的含义感到困惑的可能性太高了。不过,我要做的是创建一个新的 contrasts 函数来计算总对比,但将名称设置为与处理对比中的默认名称相同。

set.seed(5)
n <- 5
y <- c(10 + rnorm(n, 0, 1), 20 + rnorm(n, 0, 1), 30 + rnorm(n, 0, 1))
wFactor <- as.factor(c(rep("A", n), rep("B", n), rep("C", n)))

contr.sumX <- function(...) {
  conT <- contr.treatment(...)
  conS <- contr.sum(...)
  colnames(conS) <- colnames(conT)
  conS
}

作为参考,这是通常的输出:

> m1 <- lm(y ~ wFactor, contrasts = list(wFactor=contr.sum(n = levels(wFactor))))
> coef(summary(m1))
              Estimate Std. Error     t value     Pr(>|t|)
(Intercept) 19.8218432  0.2481727  79.8711599 9.889455e-18
wFactor1    -9.6079241  0.3509692 -27.3754029 3.480430e-12
wFactor2    -0.1934654  0.3509692  -0.5512319 5.915907e-01

这是contr.sumX 函数的输出。

> m2 <- lm(y ~ wFactor, contrasts = list(wFactor=contr.sumX(n = levels(wFactor))))
> coef(summary(m2))
              Estimate Std. Error     t value     Pr(>|t|)
(Intercept) 19.8218432  0.2481727  79.8711599 9.889455e-18
wFactorB    -9.6079241  0.3509692 -27.3754029 3.480430e-12
wFactorC    -0.1934654  0.3509692  -0.5512319 5.915907e-01

或者,您可以提前为特定因素设置对比度:

contrasts(wFactor) <- "contr.sumX"
m3 <- lm(y ~ wFactor)
> coef(summary(m3))
              Estimate Std. Error     t value     Pr(>|t|)
(Intercept) 19.8218432  0.2481727  79.8711599 9.889455e-18
wFactorB    -9.6079241  0.3509692 -27.3754029 3.480430e-12
wFactorC    -0.1934654  0.3509692  -0.5512319 5.915907e-01

【讨论】:

    【解决方案2】:

    我喜欢你的解决方案@Aaron,并且已经实现了它,但我认为它包含一个危险的错误。总和对比为您提供了 first n-1 个因子和总平均值之间的差异,而不是 last n-1 个因子之间的差异,这是您的命名算法返回的结果。请参阅 Crawley 的 R Book 第 2 版第 442-443 页。

    因此,我认为正确的函数应该是:

    contr.sum.keepnames <- function(...) {
        conS <- contr.sum(...)
        colnames(conS) = rownames(conS)[-length(rownames(conS))]
        conS
    }
    

    顺便说一句,我尝试将此添加为评论,但在评论中添加代码块时遇到了困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多