为什么更改对比度类型会更改 R lm 摘要中的行标签?

Jdu*_*dub 5 r contrast lm

使用 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))
Run Code Online (Sandbox Code Playgroud)

Aar*_*ica 1

我仍然不确定这是一个好主意,我认为对对比度的含义感到困惑的可能性太高了。尽管如此,我要做的是创建一个新的对比函数,该函数计算总对比,但将名称设置为等于治疗对比的默认名称。

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
}
Run Code Online (Sandbox Code Playgroud)

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

> 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
Run Code Online (Sandbox Code Playgroud)

这是该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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)