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

R中caret包如何将含重复测量的数据拆分为75%训练集25%测试集

重复测量数据集按受试者分组拆分训练/测试集的实现方法

核心逻辑是将受试者作为拆分单位,而非单条观测记录,可保证同一受试者的所有观测归属同一数据集。

方法1:tidyverse手动实现(灵活易调整)

library(dplyr)

# 提取所有唯一受试者ID
unique_ids <- unique(dataset$study_id)

# 设置随机种子保证结果可复现
set.seed(123)
# 随机抽取75%的受试者ID归为训练集
train_ids <- sample(unique_ids, size = round(0.75 * length(unique_ids)))

# 按ID匹配拆分数据集
train_set <- dataset %>% filter(study_id %in% train_ids)
test_set <- dataset %>% filter(!study_id %in% train_ids)

如果需要让观测行数的拆分比例更贴近75%,可按照每个受试者的观测数量加权抽样:

# 统计每个受试者的观测行数
id_obs_count <- dataset %>% count(study_id, name = "obs_n")
# 加权抽样,观测数多的ID抽样权重更高,缩小行数比例偏差
train_ids <- sample(id_obs_count$study_id, 
                    size = round(0.75 * nrow(id_obs_count)),
                    prob = id_obs_count$obs_n)

方法2:基于caret groupKFold实现(和你现有代码逻辑兼容)

将groupKFold的k值设为4,取1份作为测试集、剩余3份合并为训练集,刚好满足75%/25%的拆分比例:

library(caret)

set.seed(123)
# 按受试者ID拆分为4份,每份受试者占比25%
folds <- groupKFold(dataset$study_id, k = 4)
# 取第一份为测试集索引
test_index <- folds[[1]]
train_set <- dataset[-test_index, ]
test_set <- dataset[test_index, ]

注意:拆分完成后后续的交叉验证需仅在训练集内执行,避免引入测试集数据导致泄露。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:57:03