You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用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() vs ggwithinstats()
    • ggbetweenstats():针对独立样本(组间)设计,用于比较不同组别间的差异,每个观测仅属于一个组别。
    • ggwithinstats():针对重复测量/配对样本(组内)设计,用于分析同一个体在不同时间点/条件下的测量值变化,必须有个体标识变量。
  • grouped_ggbetweenstats() vs grouped_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:45:39