R - stat_compare_means 输出的结果与 Kruskal-Wallis 检验不同

3

我希望能够通过R程序包ggpubr中的stat_compare_means函数将Kruskal-Wallis检验的p值绘制到我的ggplot图形上。

然而,绘制出来的值与简单运行该函数得到的值不同:

kruskal.test(value ~ type, data = Profile_melt)

我用于绘制p值的代码是:

ggplot(Profile_melt, aes(type, value)) + 
  geom_boxplot(aes(fill = factor(type), alpha = 0.5), 
               outlier.shape = NA, show.legend = FALSE) +
  geom_jitter(width = 0.2, size = 2, show.legend = FALSE,
              aes(colour = factor(type)), alpha = 0.5) +
  theme_bw() +
  facet_grid(Case ~ Marker, scales = 'free') +
  stat_compare_means(comparison = list(c("Real", "Binomial")),method = 'kruskal.test')+
  background_grid(major = 'y', minor = "none") + # add thin horizontal lines 
  xlab('Category') +
  ylab('Cell counts (Frequencies)')+
  theme(axis.text = element_text(size = 15), 
        axis.title = element_text(size = 20), 
        legend.text = element_text(size = 38),
        legend.title = element_text(size = 30), 
        strip.background = element_rect(colour="black", fill="white"),
        strip.text = element_text(margin = margin(10, 10, 10, 10), size = 25)) +
  panel_border()

这是我的数据示例数据

2个回答

2
有许多代码行可能与问题无关。也许,你的问题应该是:

为什么会

kruskal.test(value ~ type, data = Profile_melt)

#Kruskal-Wallis chi-squared = 4.9673, df = 1, p-value = 0.02583

产生不同的 p 值

ggboxplot(Profile_melt, x="type", y = "value") + 
  stat_compare_means(comparison = list(c("Real", "Binomial")), method = 'kruskal.test')

# p-value = 0.49

您可以通过检查原始代码找出原因。如果是问题,ggpubr的开发人员可能会更好地解释这一点,并在那里修复它。为了获得正确和一致的p值,请删除comparison = list(c("Real", "Binomial"))

ggboxplot(Profile_melt, x="type", y = "value") + 
  stat_compare_means(method = 'kruskal.test')

或者

编辑

ggboxplot(Profile_melt, x="type", y = "value") + 
  stat_compare_means(comparison = list(c("Real", "Binomial")))

使用您的其他代码,图表如下所示:

enter image description here


嗨,志强,感谢您的回复。删除此比较=...行将产生一致的结果,但是绘图的格式也会被改变,这不是我想要的。 - DigiPath
请运行我提供的完整代码。您的建议在面对问题时无效。 - DigiPath
我已经在我的端上运行了代码。它与 facet 以相同的方式工作,但由于您只有小样本,它会产生一些警告 不能计算具有绑定值的精确 p-值。正如我所说,真正的修复方法可能是更改 ggpubr - Zhiqiang Wang
嗯,这很奇怪...你能否提供你那边的完整代码(包括 facet)?谢谢。 - DigiPath
让我们在聊天中继续这个讨论 - DigiPath
显示剩余2条评论

1

ggpubr 中的 stat_compare_means 调用了默认使用 wilcox.test 的 compare_means。正如 @ZhiqiangWang 指出的那样,如果您删除方法或比较,则会返回默认值,这与您最初得到的 p 值类似,因为 wilcoxon 和 kruskal 对于 2 个样本非常相似:

kruskal.test(value ~ type, data = Profile_melt)
#Kruskal-Wallis chi-squared = 4.9673, df = 1, p-value = 0.02583
wilcox.test(value ~ type, data = Profile_melt)
#W = 1034939, p-value = 0.02583

现在,对于您拥有的数据,您最有可能希望针对每个单独的案例和标记获得一个p值,而不是使用kruskal.test(value ~ type, data = Profile_melt)进行全面比较。为所有方面打印相同的p值是没有意义的。

我们首先检查所需的p值:

compare_means(value ~ type, Profile_melt, group.by = c("Case","Marker"),
method="kruskal")
# A tibble: 30 x 8
   Case    Marker .y.            p   p.adj p.format p.signif method        
   <fct>   <fct>  <chr>      <dbl>   <dbl> <chr>    <chr>    <chr>         
 1 Case 1A CD3    value 0.000470   0.0085  0.00047  ***      Kruskal-Wallis
 2 Case 1A CD4    value 0.00000915 0.00022 9.2e-06  ****     Kruskal-Wallis
 3 Case 1A CD8    value 0.00695    0.09    0.00695  **       Kruskal-Wallis
 4 Case 1A CD20   value 0.707      1       0.70724  ns       Kruskal-Wallis
 5 Case 1A FoxP3  value 0.00102    0.014   0.00102  **       Kruskal-Wallis
 6 Case 1B CD3    value 0.0000415  0.00091 4.1e-05  ****     Kruskal-Wallis

这类似于:

Profile_melt %>% 
group_by(Case,Marker) %>% 
summarize(k_p=kruskal.test(value ~ type)$p.value)

# A tibble: 30 x 3
# Groups:   Case [6]
   Case    Marker        k_p
   <fct>   <fct>       <dbl>
 1 Case 1A CD3    0.000470  
 2 Case 1A CD4    0.00000915
 3 Case 1A CD8    0.00695   
 4 Case 1A CD20   0.707     
 5 Case 1A FoxP3  0.00102   

我们可以绘制图表,使用ggpubr包中的ggboxplot会更加简单:

p = ggboxplot(Profile_melt,x="type",y="value",add="jitter",
facet.by=c("Case","Marker"),scales="free_y",ggtheme=theme_pubclean())

p+stat_compare_means(
aes(label =paste("p=",scientific(as.numeric(..p.format..)))),
method="kruskal",size=2)

enter image description here


非常感谢!这正是我想要的。还有一个问题,我想在每个面板中添加水平比较线,并将数字格式统一为科学计数法(1.23e-3等)。我该怎么做? - DigiPath
我猜你指的是网格线,对于这个问题,你可以选择使用ggboxplot中的ggtheme选项来选择一个主题,或者使用+ theme(..)进行设置。至于科学计数法,你可以看到我上面的内容,不幸的是ggpubr已经将其设置为1个有效数字,所以我无法做太多关于它的调整。 - StupidWolf
这与您的问题范围有些偏离,因为您的问题是关于p值的。因此,如果您需要更多的调整以完善图形,我建议您将它作为一个单独的问题发布。 - StupidWolf

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