如何在R中修正LDH统计图的显著性水平并优化X轴
问题描述
我想要绘制LDH细胞毒性(%)与吸光度归一化数据的统计图,已完成数据处理及绘图代码(如下):
# using normalised data normalised <- read_xlsx("Data.xlsx") # convert Norm column to numeric format normalised$Norm <- as.numeric(normalised$Norm) # summarise Norm_sum <- normalised %>% group_by(Condition, Experiment) %>% summarise( mean = mean(Norm), median = median(Norm), sd = sd(Norm), n = length(Norm), se = sd / sqrt(n)) # CREATE NEW COLUMN TO COMBINE CONDITION AND EXPERIMENT Norm_sum$Condition_2 <- paste(Norm_sum$Experiment, Norm_sum$Condition, sep = "_") # plot with the new column to add significance level (multiple comparison) comparing WT vs KO in their experimental condition (WT vs KO in Exp A) (WR vs KO in Exp B) etc # LDH_fig <- ggplot(Norm_sum, aes(x = Condition_2, y = mean, fill = Condition)) + geom_bar(stat = "identity", position = "dodge") + geom_errorbar(aes(ymin = mean - se, ymax = mean + se), width = 0.2, position = position_dodge(0.9)) + labs(title = "Normalised Data Comparison", x = "Experiment", y = "Cytotoxicity (%)") + theme_minimal() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + geom_signif(comparisons = list(c("Exp A_KO", "Exp A_WT")), map_signif_level = TRUE, textsize = 4) + geom_signif(comparisons = list(c("Exp B_KO", "Exp B_WT")), map_signif_level = TRUE, textsize = 4) + geom_signif(comparisons = list(c("Exp C_KO", "Exp C_WT")), map_signif_level = TRUE, textsize = 4) + geom_signif(comparisons = list(c("Exp D_KO", "Exp D_WT")), map_signif_level = TRUE, textsize = 4) + geom_signif(comparisons = list(c("Exp E_KO", "Exp E_WT")), map_signif_level = TRUE, textsize = 4)
目前遇到两个问题:
geom_signif显示的显著性为NS,与GraphPad得出的***结果不符,需要找到正确的多重比较方法以显示准确p值;- 绘制
Condition_2后X轴标签过长,需要手动修改。
解决方案
一、修正显著性检验结果
当前代码的核心问题是用汇总后的均值数据做检验,而geom_signif默认对绘图数据(均值)统计,并非原始数据,导致结果和GraphPad不一致。正确做法是基于原始数据完成统计检验,再将结果映射到图上:
1. 基于原始数据完成分组统计检验
使用rstatix包做匹配实验设计的检验(独立样本t检验/配对t检验,需和GraphPad方法一致),以独立样本t检验为例:
library(rstatix) # 按实验分组,做WT vs KO的t检验并校正多重比较 stat_test <- normalised %>% group_by(Experiment) %>% t_test(Norm ~ Condition) %>% adjust_pvalue(method = "bonferroni") %>% # 与GraphPad的校正方法对齐 add_significance("p.adj") # 生成匹配绘图x轴的分组名 stat_test <- stat_test %>% mutate( group1 = paste(Experiment, group1, sep = "_"), group2 = paste(Experiment, group2, sep = "_") )
若为配对实验,将t_test替换为paired_t_test即可。
2. 在ggplot中导入预计算的检验结果
替换重复的geom_signif调用,直接导入检验结果:
LDH_fig <- ggplot(Norm_sum, aes(x = Condition_2, y = mean, fill = Condition)) + geom_bar(stat = "identity", position = "dodge") + geom_errorbar(aes(ymin = mean - se, ymax = mean + se), width = 0.2, position = position_dodge(0.9)) + labs(title = "Normalised Data Comparison", x = "Experiment", y = "Cytotoxicity (%)") + theme_minimal() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + # 导入预计算的显著性结果 geom_signif( data = stat_test, aes(xmin = group1, xmax = group2, annotations = p.signif, y_position = mean + se + 5), # y轴位置可按需调整 manual = TRUE, textsize = 4 )
二、修改X轴标签
提供两种常用方法:
方法1:直接指定标签映射
通过scale_x_discrete手动替换长标签:
LDH_fig <- LDH_fig + scale_x_discrete( labels = c( "Exp A_KO" = "Exp A\nKO", "Exp A_WT" = "Exp A\nWT", "Exp B_KO" = "Exp B\nKO", "Exp B_WT" = "Exp B\nWT", "Exp C_KO" = "Exp C\nKO", "Exp C_WT" = "Exp C\nWT", "Exp D_KO" = "Exp D\nKO", "Exp D_WT" = "Exp D\nWT", "Exp E_KO" = "Exp E\nKO", "Exp E_WT" = "Exp E\nWT" ) )
用\n实现标签换行,也可直接改为更简洁的文本。
方法2:提前修改数据框的标签值
生成Condition_2时直接设置简洁格式:
Norm_sum$Condition_2 <- factor( paste(Norm_sum$Experiment, Norm_sum$Condition, sep = "\n"), levels = paste(rep(c("Exp A", "Exp B", "Exp C", "Exp D", "Exp E"), each = 2), rep(c("KO", "WT"), 5), sep = "\n") )
后续绘图时X轴标签会自动换行,无需额外设置。
内容的提问来源于stack exchange,提问作者Petra
相关产品推荐
相关产品推荐

