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

如何在R中生成重复测量模型用的临床试验数据集?

生成重复测量试验数据集的R代码

核心参数设定

先明确所有预设条件,统一定义参数方便后续调整:

  • 每组样本量:n_per_group <- 309
  • 试验分组:groups <- c("a", "b")
  • 评估次数(基线+26次随访):time_points <- 0:26 # 0代表基线,1-26对应每两周一次,共27次
  • 结局变量标准差:sd_outcome <- 11
  • 失访比例:dropout_rate <- 0.3
  • 单评估随机缺失概率:miss_single_rate <- 0.05 # 可按需调整

步骤1:构建受试者-时间基础框架

用tidyr生成每个受试者在所有时间点的记录,并分配分组:

library(tidyverse)

# 生成受试者ID与分组信息
subjects <- tibble(
  subject_id = 1:(2*n_per_group),
  group = rep(groups, each = n_per_group)
)

# 扩展为长格式的受试者-时间点数据集
data_long <- subjects %>%
  crossing(time = time_points) %>%
  arrange(subject_id, time)

步骤2:定义时间依赖均值趋势+基线关联

假设两组有不同的时间趋势,且受试者得分与自身基线值强相关(通过随机截距实现关联):

# 设定组水平的时间趋势参数
# 组a:基线均值50,每两周上升0.1;组b:基线均值52,每两周上升0.2
mean_params <- tibble(
  group = groups,
  baseline_mean = c(50, 52),
  time_slope = c(0.1, 0.2)
)

# 合并趋势参数到数据集
data_long <- data_long %>%
  left_join(mean_params, by = "group")

# 生成受试者随机截距(围绕组基线均值波动,控制基线值与后续测量的关联强度)
set.seed(123) # 设种子保证结果可重复
subjects <- subjects %>%
  left_join(mean_params, by = "group") %>%
  mutate(subject_intercept = rnorm(n(), mean = baseline_mean, sd = sqrt(8)))

# 合并随机截距到长数据
data_long <- data_long %>%
  left_join(subjects %>% select(subject_id, subject_intercept), by = "subject_id")

# 计算每个时间点的预期得分
data_long <- data_long %>%
  mutate(expected_value = subject_intercept + time_slope * time)

步骤3:加入随机误差并截断到0-100范围

set.seed(456)
data_long <- data_long %>%
  mutate(
    outcome = rnorm(n(), mean = expected_value, sd = sd_outcome),
    # 将结局变量限制在0-100范围内
    outcome = pmax(pmin(outcome, 100), 0)
  )

步骤4:处理失访与随机缺失

4.1 处理30%受试者提前失访

随机选择30%的受试者,设定他们的最后观察时间:

set.seed(789)
dropout_subjects <- subjects %>%
  sample_frac(dropout_rate) %>%
  mutate(
    # 失访时间设为基线后1-25之间的随机值(确保至少完成1次随访)
    last_time = sample(1:25, size = n(), replace = TRUE)
  )

# 标记失访后的记录为缺失
data_long <- data_long %>%
  left_join(dropout_subjects %>% select(subject_id, last_time), by = "subject_id") %>%
  mutate(
    outcome = ifelse(!is.na(last_time) & time > last_time, NA, outcome)
  ) %>%
  select(-last_time)

4.2 处理随机缺失个别评估

在未失访的记录中,随机标记部分评估为缺失:

set.seed(101)
data_long <- data_long %>%
  mutate(
    outcome = ifelse(
      !is.na(outcome) & runif(n()) < miss_single_rate,
      NA,
      outcome
    )
  )

步骤5:整理最终数据集

# 转换为宽格式(可选,适配部分重复测量分析方法)
data_wide <- data_long %>%
  select(subject_id, group, time, outcome) %>%
  pivot_wider(names_from = time, values_from = outcome, names_prefix = "time_")

# 查看长格式数据结构
glimpse(data_long %>% select(subject_id, group, time, outcome))

可调参数说明

  • 时间趋势可替换为二次项(time_slope2 * time^2)或分段线性趋势,适配不同研究假设
  • 随机截距的标准差可调整,控制基线值与后续测量的关联强度
  • 单评估随机缺失概率miss_single_rate可根据实际场景修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:35:42