如何正确使用ggstatsplot的grouped_ggwithinstats()做重复方差分析?
问题:ggstatsplot重复测量分析与组间分析的差异及报错解决
数据集
df <- structure(list(time = c(0L, 1L, 2L, 3L, 0L, 1L, 2L, 3L, 0L, 1L, 2L, 3L, 0L, 1L, 2L, 3L), group1 = c("A", "A", "A", "A", "B", "B", "B", "B", "C 1", "C 1", "C 1", "C 1", "C 2", "C 2", "C 2", "C 2"), group2 = c("Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z"), value = c(100L, 60L, 30L, 32L, 100L, 2L, 3L, 1L, 100L, 17L, 17L, 8L, 100L, 35L, 36L, 22L )), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"))
数据预览:
time group1 group2 value 1 0 A Z 100 2 1 A Z 60 3 2 A Z 30 4 3 A Z 32 5 0 B Z 100 6 1 B Z 2 7 2 B Z 3 8 3 B Z 1 9 0 C 1 Z 100 10 1 C 1 Z 17 11 2 C 1 Z 17 12 3 C 1 Z 8 13 0 C 2 Z 100 14 1 C 2 Z 35 15 2 C 2 Z 36 16 3 C 2 Z 22
已尝试代码
library(ggstatsplot) # 组间分析单图 ggbetweenstats( data = df, x = time, y = value, type = "nonparametric", plot.type = "box", centrality.plotting = FALSE ) # 分组组间分析 grouped_ggbetweenstats( data = df, x = time, y = value, grouping.var = group1, type = "nonparametric", plot.type = "box", centrality.plotting = FALSE )
疑惑与报错
- 无法区分
ggwithinstats()与ggbetweenstats()、grouped_ggwithinstats()与grouped_ggbetweenstats()的差异 - 调用
grouped_ggwithinstats()时触发错误:Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 1
核心需求
对每个group1分组,通过重复方差分析检验不同time时间点(0、1、2、3)对应的value变化是否显著。
解答
一、函数差异说明
ggbetweenstats()vsggwithinstats()ggbetweenstats():针对独立样本(组间)设计,用于比较不同组别间的差异,每个观测仅属于一个组别。ggwithinstats():针对重复测量/配对样本(组内)设计,用于分析同一个体在不同时间点/条件下的测量值变化,必须有个体标识变量。
grouped_ggbetweenstats()vsgrouped_ggwithinstats()- 两者都是对分组变量批量执行分析,但前者对应组间设计,后者对应组内重复测量设计,后者要求数据具备重复测量的结构(即个体标识)。
二、报错原因与解决方法
报错的核心原因是数据集缺少个体标识变量,重复测量分析需要明确哪些观测属于同一个体,否则函数无法识别重复测量的结构。
步骤1:重构数据集,添加个体ID
在每个group1分组内,4个time对应同一个体的重复测量,需生成个体标识:
library(dplyr) df <- df %>% group_by(group1) %>% mutate(id = row_number()) %>% # 每个分组内生成1-4的个体ID ungroup()
重构后数据结构:
time group1 group2 value id <int> <chr> <chr> <int> <int> 1 0 A Z 100 1 2 1 A Z 60 2 3 2 A Z 30 3 4 3 A Z 32 4 5 0 B Z 100 1 6 1 B Z 2 2 7 2 B Z 3 3 8 3 B Z 1 4 9 0 C 1 Z 100 1 10 1 C 1 Z 17 2 11 2 C 1 Z 17 3 12 3 C 1 Z 8 4 13 0 C 2 Z 100 1 14 1 C 2 Z 35 2 15 2 C 2 Z 36 3 16 3 C 2 Z 22 4
步骤2:正确调用grouped_ggwithinstats()
添加个体ID后,指定subject.id = id即可正常运行:
grouped_ggwithinstats( data = df, x = time, y = value, grouping.var = group1, subject.id = id, # 关键:指定个体标识变量 type = "parametric", # 重复方差分析属于参数检验,数据不满足正态性可改为"nonparametric" plot.type = "box", centrality.plotting = FALSE )
三、单独提取重复测量ANOVA结果
如果需要仅获取统计结果而非绘图,可结合dplyr分组运行:
anova_results <- df %>% group_by(group1) %>% summarise( anova_model = list(aov(value ~ time + Error(id/time), data = cur_data())), anova_summary = list(summary(anova_model[[1]])) ) # 查看每个分组的结果 print(anova_results$anova_summary[[1]]) # 查看group1=A的结果
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

