如果我们的线性模型包含因子变量X
(级别A
,B
和C
)
y ~ factor(X) + Var2 + Var3
结果显示估算XB
和XC
,即差异B - A
和C - A
。 (假设引用为A
)。
如果我们想知道B
和C
:C - B
之间差异的p值,
我们应该将B或C指定为参考组并重新运行模型。
我们可以同时获得效果B - A
,C - A
和C - B
的p值吗?
答案 0 :(得分:2)
您正在通过检查回归系数的某些线性组合的p值来寻找线性假设检验。根据我的回答:How to conduct linear hypothesis test on regression coefficients with a clustered covariance matrix?,我们只考虑系数之和,我将扩展函数LinearCombTest
以处理更一般的情况,假设alpha
为vars
中某些变量的组合系数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|)")))
}
考虑一个简单的例子,我们对三组A
,B
和C
进行了均衡设计,其中组分别为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 - A
而xC
正在提供C - A
。假设我们现在对组B
和C
之间的区别感兴趣,即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
注意,此功能也可以方便地计算出B
和C
的群组均值,即(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
矩阵。
该函数采用公式或矩阵来描述您要测试的方程组。