1

我试图在 R 中创建 wilcox.test 函数的矢量化版本。它不会返回与原始 wilcox.test 函数相同的 p 值。有谁明白为什么?

library(tidyverse)

vect_wilcox <- function(df, grouping_variable, x, y){
  df %>% 
    group_by({{grouping_variable}}) %>%  
    group_map(~ broom::tidy(wilcox.test(pull(.x[x]), pull(.x[y])), paired = TRUE)) %>%
    enframe %>%
    unnest(value) %>%
    mutate(df %>% distinct({{grouping_variable}}))
}
 
df <- tribble( 
  ~session, ~name_var, ~time_pt1, ~time_pt2,
  1,        "fio2",          90,     NA,     
  2,        "fio2",         100,     80,    
  3,        "fio2",         100,     70,   
  4,        "fio2",          90,     70,   
  1,        "ph",          7.24,     NA,   
  2,        "ph",          7.19,   7.38,  
  3,        "ph",           7.2,    7.2,   
  4,        "ph",          7.37,   7.33
)

new_wilcox <- vect_wilcox(df, grouping_variable = name_var, x= "time_pt1", y="time_pt2")

d3 <- df %>% 
  pivot_longer(col = 3:4, names_to = "time_point", values_to = "value") %>%
  pivot_wider(
    names_from = c(name_var, time_point),
    values_from = value, 
    names_sep = "_")

pval = format(wilcox.test(d3$fio2_time_pt1,d3$fio2_time_pt2,paired=T)$p.value,digits=3)
pval = c(pval,format(wilcox.test(d3$ph_time_pt1,d3$ph_time_pt2,paired=T)$p.value,digits=3))

(comp<- new_wilcox %>% 
  select(name_var, p.value) %>% 
  mutate(old_p.value = pval) %>% 
  rename(new_p.value = p.value))

dput(comp)

非常感谢 !

4

1 回答 1

2

有两个错误:

  1. group_map 中的括号错误
  2. 变量重新分配mutate(df %>% distinct({{grouping_variable}}))显然不起作用,所以我将 group_map 全部更改为 group_modify。

此功能有效:

vect_wilcox <- function(df, grouping_variable, x, y){
  df %>% 
    group_by({{grouping_variable}}) %>%  
    group_modify(~ broom::tidy(
          wilcox.test(
             x = pull(.x[x]), 
             y = pull(.x[y]), 
             paired = TRUE))) %>%
    ungroup()
}
于 2021-10-20T14:41:25.620 回答