获得组平均差异的p值,而无需使用新的参考水平重新组合线性模型

时间:2016-10-19 23:58:56

标签: r regression linear-regression lm hypothesis-test

如果我们的线性模型包含因子变量X(级别ABC

y ~ factor(X) + Var2 + Var3 

结果显示估算XBXC,即差异B - AC - A。 (假设引用为A)。

如果我们想知道BCC - B之间差异的p值, 我们应该将B或C指定为参考组并重新运行模型。

我们可以同时获得效果B - AC - AC - B的p值吗?

3 个答案:

答案 0 :(得分:2)

您正在通过检查回归系数的某些线性组合的p值来寻找线性假设检验。根据我的回答:How to conduct linear hypothesis test on regression coefficients with a clustered covariance matrix?,我们只考虑系数之和,我将扩展函数LinearCombTest以处理更一般的情况,假设alphavars中某些变量的组合系数1}}:

LinearCombTest <- function (lmObject, vars, alpha, .vcov = NULL) {
  ## if `.vcov` missing, use the one returned by `lm`
  if (is.null(.vcov)) .vcov <- vcov(lmObject)
  ## estimated coefficients
  beta <- coef(lmObject)
  ## linear combination of `vars` with combination coefficients `alpha`
  LinearComb <- sum(beta[vars] * alpha)
  ## get standard errors for sum of `LinearComb`
  LinearComb_se <- sum(alpha * crossprod(.vcov[vars, vars], alpha)) ^ 0.5
  ## perform t-test on `sumvars`
  tscore <- LinearComb / LinearComb_se
  pvalue <- 2 * pt(abs(tscore), lmObject$df.residual, lower.tail = FALSE)
  ## return a matrix
  form <- paste0("(", paste(alpha, vars, sep = " * "), ")")
  form <- paste0(paste0(form, collapse = " + "), " = 0")
  matrix(c(LinearComb, LinearComb_se, tscore, pvalue), nrow = 1L,
         dimnames = list(form, c("Estimate", "Std. Error", "t value", "Pr(>|t|)")))
  }

考虑一个简单的例子,我们对三组ABC进行了均衡设计,其中组分别为0,1,2。

x <- gl(3,100,labels = LETTERS[1:3])
set.seed(0)
y <- c(rnorm(100, 0), rnorm(100, 1), rnorm(100, 2)) + 0.1

fit <- lm(y ~ x)
coef(summary(fit))

#             Estimate Std. Error   t value     Pr(>|t|)
#(Intercept) 0.1226684 0.09692277  1.265631 2.066372e-01
#xB          0.9317800 0.13706949  6.797866 5.823987e-11
#xC          2.0445528 0.13706949 14.916177 6.141008e-38

由于A是参考级别,xB正在提供B - AxC正在提供C - A。假设我们现在对组BC之间的区别感兴趣,即C - B,我们可以使用

LinearCombTest(fit, c("xC", "xB"), c(1, -1))

#                         Estimate Std. Error  t value     Pr(>|t|)
#(1 * xC) + (-1 * xB) = 0 1.112773  0.1370695 8.118312 1.270686e-14

注意,此功能也可以方便地计算出BC的群组均值,即(Intercept) + xB(Intercept) + xC

LinearCombTest(fit, c("(Intercept)", "xB"), c(1, 1))

#                                 Estimate Std. Error  t value     Pr(>|t|)
#(1 * (Intercept)) + (1 * xB) = 0 1.054448 0.09692277 10.87926 2.007956e-23

LinearCombTest(fit, c("(Intercept)", "xC"), c(1, 1))

#                                 Estimate Std. Error  t value     Pr(>|t|)
#(1 * (Intercept)) + (1 * xC) = 0 2.167221 0.09692277 22.36029 1.272811e-65

使用lsmeans

的替代解决方案

再次考虑上面的玩具示例:

library(lsmeans)
lsmeans(fit, spec = "x", contr = "revpairwise")

#$lsmeans
# x    lsmean         SE  df    lower.CL  upper.CL
# A 0.1226684 0.09692277 297 -0.06807396 0.3134109
# B 1.0544484 0.09692277 297  0.86370603 1.2451909
# C 2.1672213 0.09692277 297  1.97647888 2.3579637
#
#Confidence level used: 0.95 
#
#$contrasts
# contrast estimate        SE  df t.ratio p.value
# B - A    0.931780 0.1370695 297   6.798  <.0001
# C - A    2.044553 0.1370695 297  14.916  <.0001
# C - B    1.112773 0.1370695 297   8.118  <.0001
#
#P value adjustment: tukey method for comparing a family of 3 estimates

$lsmeans域返回边际组均值,而$contrasts返回成对组均值差,因为我们使用了“revpairwise”对比度。阅读lsmeans的第32页,了解"pairwise""revpairwise"之间的差异。

这当然很有趣,因为我们可以与LinearCombTest的结果进行比较。我们看到LinearCombTest正在正确运行。

答案 1 :(得分:1)

来自multcomp包的

x <- gl(3,100,labels = LETTERS[1:3]) set.seed(0) y <- c(rnorm(100, 0), rnorm(100, 1), rnorm(100, 2)) + 0.1 fit <- lm(y ~ x) library(multcomp) my_ht <- glht(fit, linfct = mcp(x = c("B-A = 0", "C-A = 0", "C-B = 0"))) (一般线性假设检验)使得这种多重假设检验变得容易,而无需重新运行一堆单独的模型。它基本上是根据您定义的感兴趣的比较来制作定制的对比矩阵。

使用您的示例比较并构建@ZheyuanLi提供的数据:

summary(my_ht)

#Linear Hypotheses: # Estimate Std. Error t value Pr(>|t|) #B - A == 0 0.9318 0.1371 6.798 1.11e-10 *** #C - A == 0 2.0446 0.1371 14.916 < 1e-10 *** #C - B == 0 1.1128 0.1371 8.118 < 1e-10 *** 会为您提供有关比较的调整后的p值。

{{1}}

答案 2 :(得分:0)

您可以使用库car,并使用函数linearHypothesis和参数vcov

将此设置为模型的variance-covariance矩阵。

该函数采用公式或矩阵来描述您要测试的方程组。