在 gtsummary 中显示和比较连续变量的正态分布与非正态分布均值的简便方法

Easy way to show and compare means of normally vs. non-normally distributed distributions for continuous variables in gtsummary

我有一个包含连续列和因子类型列的数据框。我正在尝试使用按变量分层的 gtsummary 构建摘要 table。 我的问题如下:

  1. 有没有一种方法可以使用应用族函数之一来测试所有数值变量以确定它们的分布是否正常(例如 shapiro.test())?
  2. 这样做之后,有没有办法告诉 gtsummary 将正态分布的数据显示为均值 (sd),将非正态分布的数据显示为中位数 (IQR)?
  3. gtsummary可以根据分布决定是否使用methods进行均值比较吗? (例如 t 检验与 Mann Whitney U 检验)。

谢谢!

FC.

我会尝试这样的事情。我以 Iris 数据集为例。 要回答您的第一个问题,我会使用 sapply 并使用 shapiro.test 来获取数据是否呈正态分布。我使用 p-value 来确定它是否是正态分布的,但如果有更合适的东西,你可以替换你自己的标准。在第一步之后,您有两个向量,一个指定哪些变量通常是 dist,哪些不是。然后您可以将该向量传递给 gtsmmary 以告诉它修改这些变量的测试和统计信息。您不需要为默认的 non-normally 分布式变量 bc 传递它。

library(gtsummary)
library(dplyr)

normvals <- sapply(iris[sapply(iris, is.numeric)], function(x){
    normtest <- shapiro.test(x)
    #output pvalue
    normtest$p.value
})

notnorm <-  names(normvals[normvals <.05])

norm <- names(normvals[normvals >= .05])


irisdf <- filter(iris, Species != "setosa") %>% 
          mutate(Species = as.character(Species))


    
tbl_summary(irisdf, 
          by = Species,
          statistic = list(all_of(norm) ~ "{mean} ({sd})")) %>% 
add_p(
  test = list(all_of(norm) ~ "t.test"
  ))

编辑:您可以将变量硬编码到 gtsummary 调用中,这样您就可以确保它适用于截至 2020 年 9 月 22 日在 CRAN 上的版本:

tbl_summary(irisdf, 
          by = Species,
          statistic = list(c('Sepal.Width', 'Sepal.Length') ~ "{mean} ({sd})")) %>% 
add_p(
  test = list(c('Sepal.Width', 'Sepal.Length') ~ "t.test"
  ))