1

曾经使用lmerTest::lmer()重复测量数据执行线性回归,我想调整多重比较。
我运行了几个模型并使用 Bonferroni-Holm 来调整每个模型,请参阅下面的方法。
最终,我想生成一个带有模型摘要的回归表,其中应包括调整后的 p 值和额外的拟合优度统计信息(就像在这个 SO 帖子中一样)。

– 也许还有一种更简单的方法modelsummary()来调整我还不知道的 p 值? (既适用于单独的模型,也适用于/跨一组模型)

MWE

library("modelsummary")
library("lmerTest") 
library("parameters")
library("performance")

mod1  <- lmer(mpg ~ hp + (1 | cyl), data = mtcars) 
mod2  <- lmer(mpg ~ hp + (1 | gear), data = mtcars) 

l_mod <- list("mod1" = mod1, "mod2" = mod2)
# msummary(l_mod) # works well

adjMC <- function( model ) {
model_glht <- glht(model)
model_mc_adj <- summary(model_glht, test = adjusted('holm')) # Bonferroni-Holm is less conservative and uniformly more powerful than Bonferroni
return(model_mc_adj)
}
mod1_adj <- adjMC(mod1)
mod2_adj <- adjMC(mod2)

l_mod_adj <- list("mod1_adj" = mod1_adj, "mod2_adj" = mod2_adj)
 

但是,在调整 p 值后,模型中的类从“lmerModLmerTest”变为“summary.glht”

class(mod1) # => "lmerModLmerTest"
class(mod1_adj) # => "summary.glht"

“summary.glht”是modelsummary 支持的模型列表之一,我成功获得了估计值和 p 值:

parameters::model_parameters(mod1_adj)
# Parameter        | Coefficient |   SE |         95% CI | Statistic | df |      p
# --------------------------------------------------------------------------------
# (Intercept) == 0 |       24.71 | 3.13 | [17.84, 31.57] |      7.89 |  0 | < .001
# hp == 0          |       -0.03 | 0.01 | [-0.06,  0.00] |     -2.09 |  0 | 0.064
# e.g. with modelsummary:
modelsummary::get_estimates(mod1_adj) # gives more info than broom::tidy(mod1_adj)

但是,获得拟合优度统计数据没有成功:

performance::model_performance(mod1_adj)
# 'r2()' does not support models of class 'summary.glht'.
# Can't extract residuals from model.
# no 'nobs' method is availableModels of class 'summary.glht' are not yet supported.NULL

broom::glance(mod1_adj) # and also for broom.mixed::glance(mod1_adj)
# => Error: No glance method for objects of class summary.glht

# e.g. with modelsummary:
modelsummary::get_gof(mod1_adj) 
# => Cannot extract information from models of class "summary.glht".

为了能够在最终回归表中包含调整后的 p 值,我尝试使用自定义函数为“summary.glht”生成一个自定义类,以提取估计值和拟合优度信息。我扫描summary(mod1_adj)了所需的信息,例如,summary(mod1_adj)$coef但没有找到创建 fcts 所需的所有信息。

names(mod1_adj$test)
# [1] "pfunction"    "qfunction"    "coefficients" "sigma"        "tstat"        "pvalues"      "type" 

tidy.summary.glht <- function(x, ...) {
    s <- summary(x, ...)
    ret <- tibble::tibble(term = ...,
                          estimate = s$test$coefficients,
                          ...      = ... ,
                          p-values = s$test$pvalues)
    ret
}

glance.summary.glht <- function(x, ...) {
  data.frame(
    "Model" = "summary.glht",
    ... = ...,
    "nobs" = stats::nobs(x)
  )
}
4

1 回答 1

1

问题是该broom包确实有模型的tidy方法glht,但没有这种模型的glance方法。由于它只是部分支持,modelsummary只能提取估计值,而不能提取拟合优度统计信息,因此它会中断。要看到这一点,您可以在对象上尝试get_gofand get_estimatesfrom 。modelsummaryghlt

相比之下,可以轻松地从模型modelsummary中提取估计值和拟合优度。lmerModLmerTest因此,一种方法是将lmerModLmerTest对象传递给modelsummary,但通过定义文档tidy_custom.CLASSNAME中描述的方法来动态修改 p 值。modelsummary

估计型号:

library(modelsummary)
library(lmerTest) 
library(multcomp)

mod  <- lmer(mpg ~ hp + (1 | cyl), data = mtcars) 

然后,我们定义一个tidy_custom适合您的模型类的方法(同样,有关详细信息,请参阅上面链接的文档)。

请注意,由于某种原因,在从glht对象而不是lmerModLmerTest模型中提取结果时,术语名称会稍作修改。这是上游包中的一个问题,因此您可能想在那里报告它(不确定是broom还是performance,但很容易检查)。无论如何,这很容易解决我们的目的,只需添加gsub对我们新方法的调用即可:

tidy_custom.lmerModLmerTest <- function(x, ...) {
  new <- multcomp::glht(x)
  new <- summary(new, test = adjusted('holm'))
  out <- get_estimates(new)
  out$term <- gsub(" == 0", "", out$term)
  out
}

modelsummary(mod, statistic = "p.value")
模型 1
(截距) 24.708
(0.000)
生命值 -0.030
(0.064)
数量。 32
R2 玛格。 0.143
R2 条件。 0.674
AIC 181.9
BIC 187.8
国际商会 0.6
于 2021-01-15T21:19:38.330 回答