如何根据中心划分 train/test 数据集?

How to partition train/test data set based on the centers?

我有一个数据集,其中包含 3 个预测变量 (P1-P3) 和 1 个响应变量作为结果(响应)。数据是从 5 个中心(200 个 ID)收集的。我将整个数据拆分为 Train(70%) 和 Test(30%)。

Sample data:

ID  Centers   P1    P2  P3  Response
ID1 Center1   12    1   1   Class1
ID2 Center2   73    1   3   Class2
ID3 Center3   56    2   1   Class1
ID4 Center1   44    1   3   Class2
ID5 Center4   33    1   1   Class1
ID6 Center5   26    1   1   Class2
ID7 Center2   61    1   1   Class1
ID8 Center3   44    1   3   Class2
ID9 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_bydplyr::sanple_n 来管理它。我需要按组平衡训练和测试,以及一个 test 数据集,它是我数据的一个子集,不在 train 数据集中的个人。

例如,使用著名的 mtcars 数据集:

library(dplyr)
mtcars %>%              # in your case your data
    group_by(cyl) %>%   # in your case Centers
    sample_n(2)         # here the numbers of the sample for each group

所以变成:

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)

希望对您有所帮助。