在R的ggpubr中为分组箱线图添加组内模态统计检验
同一Model分组内Modality间统计检验的实现方案
问题背景
已基于ggpubr绘制出按Model分组、展示不同Modality的Accuracy箱线图,但尝试添加同一Model内EMG与IMU的Wilcoxon检验时,检验结果无法正常显示。
解决方案
核心是利用stat_compare_means的group.by参数指定按Model分组进行检验,同时确保对比组在对应Model中有有效数据。以下是完整实现代码:
library(ggpubr) library(dplyr) # 加载数据集 df <- structure(list(Modality = c("IMU", "IMU", "IMU", "IMU", "EMG", "EMG", "EMG", "EMG", "EMG", "EMG", "MULTIMODAL", "MULTIMODAL", "MULTIMODAL", "MULTIMODAL", "MULTIMODAL", "MULTIMODAL"), Accuracy = c(0.890994094, 0.932236205, 0.920874879, 0.808366656, 0.736169166, 0.727917473, 0.76442499, 0.766358025, 0.672936004, 0.544758539, 0.922476135, 0.958934517, 0.889652539, 0.878411911, 0.800769442, 0.9035499 ), Precision = c(0.910120428, 0.935881939, 0.930419589, 0.858438788, 0.783804275, 0.803642164, 0.867418091, 0.826140299, 0.651388637, 0.683146414, 0.931054424, 0.960414109, 0.913705853, 0.892099619, 0.827661119, 0.917972446), Recall = c(0.890994094, 0.932236205, 0.920874879, 0.808366656, 0.736169166, 0.727917473, 0.76442499, 0.766358025, 0.672936004, 0.544758539, 0.922476135, 0.958934517, 0.889652539, 0.878411911, 0.800769442, 0.9035499), F1_Score = c(0.895340797, 0.929767228, 0.923515392, 0.820549586, 0.740460186, 0.743306797, 0.771715283, 0.778685153, 0.654271508, 0.562382109, 0.923856378, 0.958423427, 0.894510388, 0.881315329, 0.804600327, 0.905468385 ), Model = c("CNN", "CNN", "LSTM", "CNN-LSTM", "LSTM-CNN", "CNN", "LSTM", "LSTM-CNN", "CNN-LSTM", "CNN", "CNN", "LSTM", "CNN", "LSTM-CNN", "CNN-LSTM", "CNN-LSTM")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -16L)) # 绘制基础箱线图 p <- ggboxplot(df, x = "Model", y = "Accuracy", color = "Modality", palette = "jco", add = "jitter", ylab = "Accuracy", width = 0.7, lwd = 1.35, xlab = "Model", legend = "right") + ggtitle("Boxplot of Accuracy by Model and Modality") + theme_minimal() # 添加同一Model内EMG与IMU的Wilcoxon检验 p + stat_compare_means( comparisons = list(c("EMG", "IMU")), method = "wilcox.test", label = "p.signif", group.by = "Model", # 关键:按Model分组执行检验 hide.ns = TRUE, # 可选:隐藏无显著差异的标记 label.y = 1.0 # 可选:调整检验标签的纵向位置 )
关键说明
group.by = "Model":指定统计检验在每个Model分组内独立进行,这是解决原问题的核心参数。hide.ns = TRUE:避免显示无显著性(ns)的标记,让图表更简洁。label.y:统一设置检验标签的纵向位置,也可以根据不同Model设置向量值(如label.y = c(1.0, 1.02, 1.01, 1.0))来避免标签重叠。- 注意:部分
Model可能仅包含EMG或IMU其中一种数据(如LSTM-CNN无IMU数据),这类分组会自动跳过检验,不会显示无效标记。
内容的提问来源于stack exchange,提问作者Pitone
相关产品推荐
相关产品推荐

