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

如何在R中对含缺失单元格的贝叶斯重复测量ANOVA进行分析?

解决方案:R中贝叶斯重复测量ANOVA及事后检验

1. 安装并加载所需包

首先安装分析需要的工具包:

install.packages(c("tidyverse", "brms", "emmeans"))

加载包:

library(tidyverse)
library(brms)
library(emmeans)

2. 数据准备

2.1 创建数据框

将提供的数据导入R:

data_wide <- tibble(
  id = 1:12,
  group = c("B", "A", "A", "C", "B", "C", "A", "B", "C", "B", "A", "C"),
  m_c = c(NA, 1.15, 6.92, NA, NA, NA, 5.38, NA, NA, NA, 5.88, NA),
  m_s = c(NA, NA, NA, 4.38, NA, 2.42, NA, NA, 6.2, NA, NA, 2.21),
  m_v = c(4.97, NA, NA, NA, 2.71, NA, NA, 5.1, NA, 6.73, NA, NA),
  a_c = c(2.58, NA, NA, NA, 3.98, NA, NA, 1.37, NA, 1.76, NA, NA),
  a_s = c(NA, 2.26, 1.24, NA, NA, NA, 3.06, NA, NA, NA, 3.45, NA),
  a_v = c(NA, NA, NA, 5.43, NA, 5.64, NA, NA, 6.15, NA, NA, 5.65),
  e_c = c(NA, NA, NA, 6.83, NA, 6.15, NA, NA, 5.97, NA, NA, 5.95),
  e_s = c(2.9, NA, NA, NA, 5.72, NA, NA, 6.26, NA, 6.93, NA, NA),
  e_v = c(NA, 6.18, 4.14, NA, NA, NA, 6.85, NA, NA, NA, 5.01, NA)
)

2.2 转换为长格式

贝叶斯重复测量模型需要长格式数据,将宽格式转换为长格式:

data_long <- data_wide %>%
  pivot_longer(
    cols = m_c:e_v,
    names_to = "condition",
    values_to = "happiness"
  ) %>%
  separate(condition, into = c("time_abbr", "flavor_abbr"), sep = "_") %>%
  mutate(
    time_of_day = recode(time_abbr, m = "Morning", a = "Afternoon", e = "Evening"),
    flavor = recode(flavor_abbr, c = "Chocolate", s = "Strawberry", v = "Vanilla")
  ) %>%
  select(id, group, time_of_day, flavor, happiness)

3. 拟合贝叶斯重复测量ANOVA模型

使用brms包拟合包含组、时间段、口味及其交互项的模型,同时包含参与者的随机效应以控制重复测量:

full_model <- brm(
  formula = happiness ~ group + time_of_day * flavor + (1 | id),
  data = data_long,
  family = gaussian(),
  chains = 4,
  iter = 2000,
  warmup = 1000,
  cores = 4,
  seed = 123
)

查看模型摘要:

summary(full_model)

4. 检验各效应的显著性(贝叶斯因子)

通过比较不同模型的贝叶斯因子来检验时间段、口味及交互项的效应:

4.1 检验时间段效应

拟合不含时间段的模型并计算贝叶斯因子:

no_time_model <- brm(
  formula = happiness ~ group + flavor + (1 | id),
  data = data_long,
  family = gaussian(),
  chains = 4,
  iter = 2000,
  warmup = 1000,
  cores = 4,
  seed = 123
)

bf_time <- bayes_factor(full_model, no_time_model)
print(bf_time)

贝叶斯因子>3表示中等强度支持包含时间段的模型,即时间段对幸福感有显著影响;>10表示强支持。

4.2 检验口味效应

拟合不含口味的模型并计算贝叶斯因子:

no_flavor_model <- brm(
  formula = happiness ~ group + time_of_day + (1 | id),
  data = data_long,
  family = gaussian(),
  chains = 4,
  iter = 2000,
  warmup = 1000,
  cores = 4,
  seed = 123
)

bf_flavor <- bayes_factor(full_model, no_flavor_model)
print(bf_flavor)

4.3 检验交互效应

拟合不含交互项的模型并计算贝叶斯因子:

no_interaction_model <- brm(
  formula = happiness ~ group + time_of_day + flavor + (1 | id),
  data = data_long,
  family = gaussian(),
  chains = 4,
  iter = 2000,
  warmup = 1000,
  cores = 4,
  seed = 123
)

bf_interaction <- bayes_factor(full_model, no_interaction_model)
print(bf_interaction)

5. 事后检验

使用emmeans包进行事后 pairwise 比较,结果包含后验均值和95%可信区间:

5.1 时间段的事后检验

posthoc_time <- emmeans(full_model, pairwise ~ time_of_day, adjust = "holm")
print(posthoc_time, digits = 3)

5.2 口味的事后检验

posthoc_flavor <- emmeans(full_model, pairwise ~ flavor, adjust = "holm")
print(posthoc_flavor, digits = 3)

5.3 交互项的事后检验

posthoc_interaction <- emmeans(full_model, pairwise ~ time_of_day:flavor, adjust = "holm")
print(posthoc_interaction, digits = 3)

说明

  • brms包通过MCMC自然处理缺失数据,无需额外插补,解决了JASP中遇到的缺失数据问题。
  • 事后检验使用Holm方法调整多重比较,可信区间不包含0表示两组差异显著。

内容的提问来源于stack exchange,提问作者justAnewbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:31:00