使用Wilcoxon检验进行多组测试

3
我想运行Wilcoxon检验,以比较三个测试组(B,C和D)与对照组(A)之间的区别。
数据以以下格式组织:
Group   CustomerID  Value
A           23483   61
A           23484   54
A           23485   57
A           23486   59
A           23487   69
A           23488   69
B           23489   57
B           23490   53
B           23491   68
B           23492   59
B           23493   57
C           23494   58
C           23495   70
C           23496   69
C           23497   62
C           23498   53
D           23499   65
D           23500   62
D           23501   60
D           23502   62
D           23503   63
D           23504   68

到目前为止,我已经编写了以下代码。
#Seperate Control Data
DataControl<- Data%>%
                select(Group,Value)%>%
                filter(Group =="A")

#Filter data
Data%>%
  filter(Group!="A")%>%
  select(Group,Value)%>%
  group_by(Group)
  summarise(p_value = wilcox.test(DataControl$Value,exact =FALSE)$p.value)

但我遇到了如下错误

Error in summarise_(.data, .dots = compat_as_lazy_dots(...)) : 
  argument ".data" is missing, with no default

期望的输出应该是:
Group P-value
B     0.04
C     0.10
D     0.01

2
伙计,我觉得你在 group_by 和运行 Wilcox 测试之间漏了一个管道运算符。 - Ollie Perkins
哦,谢谢回复。抱歉。 - nba2020
但是,除了缺少的%>%之外,您只是传递了DataControl$Value,为每个组提供相同的输出。 - akrun
3个回答

5

除了 @OlliePerkins 指出的缺少管道操作符之外,你在调用 wilcox.test 时还缺少一个参数:

Data %>%
  filter(Group != "A") %>%
  group_by(Group) %>%
  summarise(p_value = wilcox.test(DataControl$Value, Value, exact = FALSE)$p.value)
# A tibble: 3 x 2
#   Group p_value
#   <fct>   <dbl>
# 1 B       0.355
# 2 C       0.782
# 3 D       0.470

请注意,select(Group, Value) 并不是必需的。

4

这里有一个内置的成对比较函数,建议从这里开始。然后只需整理一下,并选择你所需要的部分。

请注意我的代码(以及你的)没有纠正多重比较。你应该思考这是否适用于此处。

foo <- pairwise.wilcox.test(Data$Value, Data$Group, p.adjust.method="none")
foo

## Pairwise comparisons using Wilcoxon rank sum test 
## data:  Data$Value and Data$Group 

##   A     B     C    
## B 0.355 -     -    
## C 0.782 0.344 -    
## D 0.470 0.098 0.927
##
## P value adjustment method: none 

library(tidyverse)
broom::tidy(foo) %>% filter(group2=="A")
## # A tibble: 3 x 3
##   group1 group2 p.value
##   <chr>  <chr>    <dbl>
## 1 B      A        0.355
## 2 C      A        0.782
## 3 D      A        0.470

正如Aaron所指出的那样,成对的Wilcox检验没有进行多重比较校正,应该使用汇总方差。更好的测试方法是Dunn's测试,并且有这两个R包:dunn.testDescTools::DunnTest - Agile Bean
pairwise.wilcox.test函数默认使用Bonferroni-Holm方法来进行多重比较的校正;我在这里更改了它以匹配OP的问题。然而,你是正确的,Dunn检验是更好的方法。 - Aaron left Stack Overflow
多有趣啊,我不知道呢。那么,亚伦,你为什么说邓恩检验仍然更好呢? - Agile Bean
1
从记忆中,由于它使用所有组的排名而不是仅针对两个感兴趣的组重新计算排名,因此它具有更高的功率。一个过于简单的例子:一个组中的1、2、3与第二个组中的4、5、6相比,不会具有像一个组中的1、2、3(然后在其他组中是4-12)与第二个组中的13、14、15那样高的动力。 - Aaron left Stack Overflow

1
其中一个问题是被注释掉的部分(缺少%>% ),第二个问题是在wilcox.test中只提供了'x'而没有提供'y'。
Data %>% 
  filter(Group != "A") %>%
  group_by(Group) %>% 
  summarise(p_value = wilcox.test(Value, Data$Value[Data$Group == "A"] )$p.value)
# A tibble: 3 x 2
#  Group p_value
#  <chr>   <dbl>
#1 B       0.355
#2 C       0.782
#3 D       0.470

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接