我有一个数据集,包含3个预测变量(P1-P3)和1个作为结果的响应变量(Response)。数据来自5个中心(共200个ID)。我将整个数据集分为训练集(70%)和测试集(30%)。
样本数据:
ID Centers P1 P2 P3 ResponseID1 Center1 12 1 1 Class1ID2 Center2 73 1 3 Class2ID3 Center3 56 2 1 Class1ID4 Center1 44 1 3 Class2ID5 Center4 33 1 1 Class1ID6 Center5 26 1 1 Class2ID7 Center2 61 1 1 Class1ID8 Center3 44 1 3 Class2ID9 Center5 45 1 1 Class1
我希望划分训练和测试数据集时考虑到中心和结果变量的类别,我可以写的代码是
library(caret)set.seed(123)train.index <- createDataPartition(data$Response, p = .7, list = FALSE)train <- data[ train.index,]test <- data[-train.index,]
如何编写代码以确保划分时从所有中心选择数据?
回答:
这可能不是完美的答案,但我遇到过类似的问题,我使用dplyr::group_by
和dplyr::sample_n
来处理。我需要按组平衡训练和测试数据,并且test
数据集是我的数据中不包含在train
数据集中的个体子集。
例如,使用著名的mtcars
数据集:
library(dplyr)mtcars %>% # 在你的情况下是你的数据 group_by(cyl) %>% # 在你的情况下是Centers sample_n(2) # 这里是每个组的样本数量
因此,变成了:
train <- data %>% group_by(Centers) %>% sample_n(28)
这意味着,如果你有200行数据和5个中心,并且每个中心的个体数量相同(我们称之为平衡),那么每个组有200/5 = 40个,因此sample_n
在不重复的情况下最大可以是40。
如果每组数据是平衡的,如果我的数学计算没错,你可以设置为28(200/100*70/5),以达到每个组70%的覆盖率。
如果各组不平衡,在不重复的情况下,你可以将参数设置为最小组的数量。
另一方面,你需要设置重复抽样。
要设置测试集,如果你希望包含不在训练集中的个体,你可以这样做:
test <- data %>% filter(!ID %in% train$ID)
希望这对你有帮助。