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
相关产品推荐
相关产品推荐

