如何用ggplot2在纵向数据上添加两因素ANOVA组间显著性结果?
多时间点性别与肿瘤负荷的组间差异分析问题解决
问题背景
需要探究时间、性别对肿瘤负荷的潜在影响,计划在已绘制的折线图每个时间点上方添加男女组间的显著性标记,但运行anova_test代码时出现ID被标记为NA的报错。
原始实验数据
ID Sex Tumor.Burden Time.Point Cage3 female 1270800 1 Cage3 female 1237600 2 Cage3 female 1288760 3 Cage3 female 775220 4 Cage4 female 1768400 1 Cage4 female 1630200 2 Cage4 female 1606900 3 Cage4 female 1134220 4 Cage5 male 1441500 1 Cage5 male 3000750 2 Cage5 male 5930500 3 Cage5 male 6944225 4 Cage6 male 2063640 1 Cage6 male 7067600 2 Cage6 male 10460400 3 Cage6 male 18764800 4
已使用的折线图代码
ggplot(Data, aes(x = Time.Point, y = Tumor.Burden, color = Sex)) + geom_line() + theme_minimal() + labs(title = "Weekly Follow-up of Tumor-Bearing Mice", x = "Time points (weeks)", y="Log(Tumor Burden)") + theme(plot.title = element_text(size = 10, hjust = 0.5))
报错代码及问题
运行以下代码时,ID变量被标记为NA并报错:
Data %>% group_by(Time.Point) %>% anova_test(dv = Tumor.Burden, wid = ID, within = Sex)
问题原因
你误用了重复测量ANOVA的参数设置:
- 性别是组间变量(每个小鼠ID只对应一种性别),不能设为
within(组内变量); - 按时间点分组后,每个分组内的ID分属不同性别,不符合重复测量ANOVA“同一对象重复测量”的设计要求,导致ID被识别为无效值(NA)。
解决方案
要实现每个时间点男女组间的差异检验,应该用独立样本t检验(每个时间点的男女样本是独立个体),步骤如下:
1. 计算每个时间点的组间差异及显著性
library(rstatix) library(dplyr) # 按时间点分组做t检验,校正多比较的p值 stat_results <- Data %>% group_by(Time.Point) %>% t_test(Tumor.Burden ~ Sex, var.equal = TRUE) %>% # 若方差不齐,改为var.equal=FALSE adjust_pvalue(method = "bonferroni") %>% add_significance("p.adj")
2. 将显著性标记添加到折线图
使用ggsignif包在图上标注显著性:
library(ggsignif) ggplot(Data, aes(x = Time.Point, y = Tumor.Burden, color = Sex)) + geom_line(aes(group = ID)) + # 新增group=ID,确保每个小鼠的折线独立显示 theme_minimal() + labs(title = "Weekly Follow-up of Tumor-Bearing Mice", x = "Time points (weeks)", y = "Tumor Burden") + # 注意:原代码y轴标注为Log,但数据未取对数,若需要对数轴可添加scale_y_log10() theme(plot.title = element_text(size = 10, hjust = 0.5)) + geom_signif( data = stat_results, aes(xmin = Time.Point - 0.2, xmax = Time.Point + 0.2, annotations = p.adj.signif, y_position = max(Data$Tumor.Burden)*1.1), manual = TRUE )
补充:整体两因素混合ANOVA分析
如果需要分析时间、性别及其交互作用的整体效应,可使用混合ANOVA(时间为组内变量,性别为组间变量):
mixed_anova <- Data %>% anova_test(dv = Tumor.Burden, wid = ID, between = Sex, within = Time.Point)
该分析能得到主效应和交互效应的结果,若交互效应显著,还可进一步做简单效应分析来探究不同时间点的性别差异。
内容的提问来源于stack exchange,提问作者Allen Schweickart
相关产品推荐
相关产品推荐

