You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用gtsummary为分类变量添加事后检验P值

问题:gtsummary添加分类变量事后检验P值失败

我是R新手,若问题较为基础还请见谅。我的部分数据如下:

pathogen abnorm B_Line consolid consol_size consol_sizeAdj
1  Bacteria    Yes    Yes      Yes          59          70.66
2     Virus     No     No       No           0           0.00
3     Virus    Yes    Yes      Yes          46          98.40
4        MP    Yes    Yes      Yes          45          89.55
5     Virus    Yes    Yes      Yes          43          63.47
6        MP    Yes    Yes      Yes          39          37.96
7        MP    Yes    Yes      Yes          37          45.26
8        MP    Yes    Yes      Yes          35          43.75
9  Bacteria    Yes    Yes      Yes          35          92.11
10       MP    Yes    Yes      Yes          35          26.12
11 Bacteria     No     No       No           0           0.00
12       MP    Yes    Yes      Yes          33          54.32
13    Virus     No     No       No           0           0.00
14 Bacteria    Yes    Yes      Yes          32          55.90
15       MP    Yes    Yes      Yes          31          30.69
16    Virus    Yes    Yes      Yes          30          48.00
17    Virus     No     No       No           0           0.00
18    Virus     No     No       No           0           0.00
19    Virus     No     No       No           0           0.00
20       MP     No     No       No           0           0.00
21    Virus     No     No       No           0           0.00
22 Bacteria     No     No       No           0           0.00
23       MP    Yes    Yes      Yes          24          23.36
24       MP    Yes    Yes      Yes          24          33.68
25       MP    Yes    Yes      Yes          22          45.36
26 Bacteria    Yes    Yes      Yes          27          33.75
27       MP    Yes    Yes      Yes          20          18.69
28       MP    Yes    Yes      Yes          20          26.14
29       MP    Yes    Yes      Yes          20          22.99
30       MP    Yes    Yes      Yes          19          17.59
31       MP    Yes    Yes      Yes          18          29.63
32 Bacteria    Yes    Yes      Yes          24          43.24
33       MP    Yes    Yes      Yes          17          23.29
34       MP    Yes    Yes      Yes          19          32.20
35    Virus     No     No       No           0           0.00
36       MP    Yes    Yes      Yes          15          14.35
37 Bacteria    Yes    Yes      Yes          15          22.14
38    Virus    Yes    Yes      Yes          15          30.93
39       MP    Yes    Yes      Yes          15          25.42
40 Bacteria    Yes    Yes      Yes          17          16.27
41       MP    Yes    Yes      Yes          14          26.92
42    Virus    Yes    Yes      Yes          14          15.47
43 Bacteria    Yes    Yes      Yes          13          20.80
44 Bacteria    Yes    Yes      Yes          13          23.42
45 Bacteria    Yes    Yes      Yes          12          20.34
46    Virus    Yes    Yes      Yes          12          26.67
47       MP    Yes    Yes      Yes          12          19.20
48       MP    Yes    Yes      Yes          33          61.40
49       MP    Yes    Yes      Yes          12          11.68
50 Bacteria    Yes    Yes      Yes          40          57.55
51    Virus    Yes    Yes      Yes          11          26.51
52       MP    Yes    Yes      Yes           7           8.75
53       MP    Yes    Yes      Yes          18          33.49
54       MP    Yes    Yes      Yes           9           8.41
55 Bacteria    Yes    Yes      Yes           9          14.81
56    Virus    Yes    Yes      Yes           8          10.46
57       MP    Yes    Yes      Yes          11          21.15
58       MP    Yes    Yes      Yes           9           8.33
59 Bacteria    Yes    Yes      Yes           7          12.61
60 Bacteria    Yes    Yes      Yes           7           4.40
61 Bacteria    Yes    Yes      Yes           7          11.86
62       MP    Yes    Yes      Yes           7          11.20
63    Virus    Yes    Yes       No           0           0.00
64    Virus    Yes    Yes      Yes           5          10.31
65    Virus    Yes    Yes      Yes           7          13.46
66    Virus    Yes    Yes      Yes           6          19.35
67    Virus    Yes    Yes      Yes           2           5.52
68       MP    Yes    Yes      Yes           6           7.50
69    Virus    Yes    Yes      Yes           6          19.35
70    Virus    Yes    Yes      Yes           6          10.81
71 Bacteria    Yes    Yes      Yes          26          50.00
72    Virus    Yes    Yes       No           0           0.00
73    Virus    Yes    Yes      Yes           5          12.58
74    Virus    Yes    Yes      Yes           5           6.85
75    Virus    Yes    Yes      Yes          10          18.02

我希望使用gtsummary包的add_stat函数为基线表(Table 1)添加事后检验的P值。数值变量的实现代码已经搞定,现在尝试编写分类变量版本的代码,使用chisq.multcomp()函数,但代码运行失败。以下是我的尝试代码:

compare <- read.csv("final.csv", header = T)

add_stat_pairwise_numeric <- function(data, variable, by, ...) {
  # calculate pairwise p-values
  pw <- pairwise.t.test(data[[variable]], data[[by]], p.adj = "BH")
  
  # convert p-values to list
  index <- 0L
  p.value.list <- list()
  for (i in seq_len(nrow(pw$p.value))) {
    for (j in seq_len(nrow(pw$p.value))) {
      index <- index + 1L
      p.value.list[[index]] <-
        c(pw$p.value[i, j]) %>%
        setNames(glue::glue("**{colnames(pw$p.value)[j]} vs. {rownames(pw$p.value)[i]}**"))
    }
  }
  # convert list to data frame
  p.value.list %>%
    unlist() %>%
    purrr::discard(is.na) %>%
    t() %>%
    as.data.frame() %>%
    # formatting/roundign p-values
    dplyr::mutate(dplyr::across(everything(), style_pvalue))
}

add_stat_pairwise_categorical <- function(data, variable, by, ...) {
  # Calculate the contingency table and perform chi-squared test
  tab <- table(data[[variable]], data[[by]])
  chisq <- chisq.test(tab)

  # Extract the pairwise comparison p-values using chisq.multcomp()
  p.values <- chisq.multcomp(tab, reversed = TRUE)$pvals

  # Create a list of named p-values for each pairwise comparison
  index <- 0L
  p.value.list <- list()
  for (i in seq_along(p.values)) {
    for (j in seq_along(p.values)) {
      index <- index + 1L
      
      p.value.list[[index]] <- 
        c(p.values[i, j]) %>%
        setNames(glue::glue("**{colnames(p.values)[j]} vs. {rownames(p.values)[i]}**"))
    }
  }
  
  # Convert the list to a data frame and format the p-values
  p.value.list %>% 
    unlist() %>%
    purrr::discard(is.na) %>%
    t() %>%
    as.data.frame() %>%
    dplyr::mutate(dplyr::across(everything(), style_pvalue))
}

tbl_summary(
  data = compare, type = list(
    all_continuous() ~ "continuous2", 
    consol_size ~ "continuous2", 
    consol_sizeAdj ~ "continuous2"
  ), 
  by = pathogen, 
  statistic = list(
    all_continuous() ~ c("{mean} ({sd})", 
                         "{median} ({p25}, {p75})", 
                         "{min}, {max}"), 
    all_categorical() ~ "{n} / {N} ({p}%)"
  )
) %>% add_overall() %>%
  add_p(pvalue_fun = ~ style_pvalue(.x, digits = 2), 
        list(all_continuous() ~ "kruskal.test")) %>% 
  add_stat(list(all_continuous() ~ add_stat_pairwise_numeric, 
                all_categorical() ~ add_stat_pairwise_chisq)) %>% 
  modify_header(label = "**Severe**") %>% 
  bold_labels() %>% 
  modify_caption("**Baseline**") %>% 
  bold_p(t = 0.05)

当前使用add_p函数后的基线表已生成,但分类变量的事后检验P值始终无法添加,请求帮助解决这个问题。

内容的提问来源于stack exchange,提问作者Keal Anderson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:45:28