使用 gtsummary 进行弗里德曼测试

问题描述 投票:0回答:1

我正在尝试在内部执行 frideman 测试并将 add_p() 函数添加到 tbl_summary() 问题是 frideman 测试假设完整的块

所以我将其添加为排除不完整块的函数

library(tidyverse)
library(gtsummary)
library(rstatix)

set.seed(123)
df <- data.frame(
  patient = c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10),
  round = c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
  q1 = rnorm(30, mean = 10, sd = 2),
  q3 = c(rnorm(25, mean = 10, sd = 2), NA, NA, NA, NA, NA)
)

df1_clean %>%
  select(patient, round, q1, q3) %>%
  tbl_summary(
    by = round,
    type = list(
      q1 ~ "continuous2",
      q3 ~ "continuous2"
    ),
    include = - patient
  ) %>%
  add_p(
    all_continuous2() ~ function(x) {
        df1_clean %>%
            group_by(patient) %>%  
            filter(!any(is.na(x))) %>%  
            mutate(patient = factor(patient)) %>% 
            ungroup() %>% 
            friedman_test(
                formula = as.formula(as.formula(paste0(x, " ~ round | patient")))
            ) %>% tidy() 
    }
  )

` 所以我得到了这个错误:

The following errors were returned during 
add_p()
: ✖ For variable 
q1
 (
圆形
) and "p.value" statistic: unused arguments (data = list(c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10), c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3), c(9.33132389566044, 9.78888018241105, 8.53898065438434, 13.8100871698174, 10.6652434629408, 10.4612672809989, 6.61627517023187, 11.3195837990987, 7.95275282224058, 8.21695685129141, 11.8366823420433, 9.09459870698354, 6.50325543999364, 13.5398082197787, 5.24518614921496, 11.1456230597192, 12.0344984981692, 8.73806426667893, 10.8885741028231, 10.8782607767771, 12.081246305829, 10.968198775905, 9.51023244181495, 11.8319841158804, 11.6012447130195, 8.12686193172842, 7.19842513200854, 10.3205550799864, 9.45207525044964, 8.02892177487541), c(10.1678613590301, 7.36000694702619, 10.3224527026524, 8.75014322491616, 11.914328548385, 14.8489782823231, 8.16804151262642, 12.115328341886, 11.6502994555366, 9.85961155138928, 9.09270725188597, 13.150615413675, 5.98908436352751, 8.71361041681267, 7.12631311268445, 12.7906268778922, 9.61859313471029, 8.95065760106066, 16.3680889481327, 9.89992546422474, 9.11250137626695, 10.5997305002723, 6.86315075849006, 10.9806052853441, 9.80767359784007, NA, NA, NA, NA, NA)), variable = "q1", by = "round", group = character(0), type = "continuous2", test.args = NULL, adj.vars = character(0), conf.level = 0.95, continuous_variable = NULL) ✖ For variable 
q3
 (
圆形
) and "p.value" statistic: unused arguments (data = list(c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10), c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3), c(9.33132389566044, 9.78888018241105, 8.53898065438434, 13.8100871698174, 10.6652434629408, 10.4612672809989, 6.61627517023187, 11.3195837990987, 7.95275282224058, 8.21695685129141, 11.8366823420433, 9.09459870698354, 6.50325543999364, 13.5398082197787, 5.24518614921496, 11.1456230597192, 12.0344984981692, 8.73806426667893, 10.8885741028231, 10.8782607767771, 12.081246305829, 10.968198775905, 9.51023244181495, 11.8319841158804, 11.6012447130195, 8.12686193172842, 7.19842513200854, 10.3205550799864, 9.45207525044964, 8.02892177487541), c(10.1678613590301, 7.36000694702619, 10.3224527026524, 8.75014322491616, 11.914328548385, 14.8489782823231, 8.16804151262642, 12.115328341886, 11.6502994555366, 9.85961155138928, 9.09270725188597, 13.150615413675, 5.98908436352751, 8.71361041681267, 7.12631311268445, 12.7906268778922, 9.61859313471029, 8.95065760106066, 16.3680889481327, 9.89992546422474, 9.11250137626695, 10.5997305002723, 6.86315075849006, 10.9806052853441, 9.80767359784007, NA, NA, NA, NA, NA)), variable = "q3", by = "round", group = character(0), type = "continuous2", test.args = NULL, adj.vars = character(0), conf.level = 0.95, continuous_variable = NULL)

r stat gtsummary gt rstatix
1个回答
0
投票

您的代码存在几个问题。首先,默认情况下

gtsummary
会将一堆参数传递给自定义测试函数(参见 here)。因此,您必须包含
...
作为函数参数,以防止出现 unusedarguments 错误。其次,即使在修复之后,您也会收到错误参数“x”丢失,因为变量的名称是通过参数
variable=
传递的。但随后会出现第三个错误,最后是第四个错误。

这里是一个可行的解决方案,我将自定义测试函数移到

gtsummary
管道之外以便于调试,并使用
friedman.test
中的
stats
函数而不是
rstatix::friedman_test
(您可以使用后者,但随后您不需要调用
tidy
并重命名返回的 df 的列名,以便它们与
add_p
期望的列名相对应):

library(tidyverse)
library(gtsummary)

fried_test <- function(data, variable, by, ...) {
  data %>%
    group_by(patient) %>%
    filter(!any(is.na(.data[[variable]]))) %>%
    mutate(patient = factor(patient)) %>%
    ungroup() %>%
    friedman.test(
      formula = reformulate(
        response = variable,
        termlabels = paste0(by, "| patient")
      ),
      data = .
    ) |>
    tidy()
}

df1_clean %>%
  select(patient, round, q1, q3) %>%
  tbl_summary(
    by = round,
    type = list(
      q1 ~ "continuous2",
      q3 ~ "continuous2"
    ),
    include = -patient
  ) %>%
  add_p(
    all_continuous2() ~ "fried_test"
  )

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.