我正在尝试使用 data.table/tidyverse 在两个级别上进行有效采样:
1 级是医院 ID(hospital_id
)
2 级是医生 ID(doctor_id
)
我需要首先从 $N$ 总额中对替换 $N$ 医院进行抽样。
然后我需要从 $M_i$ 总数中抽取为 $i$ 医院工作的替代 $M_i$ 医生进行抽样。
现在,我按如下方式进行操作:我对具有替换的唯一医院 ID 的数据框进行采样。然后我和医生一起去他们工作的医院。然后我由医院集团进行替换采样。
但这会导致连接速度缓慢。有没有一种方法可以更有效地做到这一点?这是我的 data.table 实现,但很乐意以任何方式执行此操作。
# We have a data.frame with one row for every hospital
unique_hospitals_df <- unique(hospital_df[, c("hospital_id")])
# We sample hospitals with replacement at level 1
r_sampled_hospital_ids <- unique_hospitals_df[sample(nrow(unique_hospitals_df),
floor(length(unique_hospitals_df) * sample_frac), replace=T), ]
# Now that we have the resampled ID's, we join to the doctors data.frame at level 2
r_df_full <- r_sampled_hospital_ids[,c("hospital_id", "doctor_id")][DT, on = c("hospital_id", "doctor_id"), nomatch = NULL, allow.cartesian = T]
# Now we resample the doctors within each hospital with replacement (level 2)
r_DT_resampled <- r_df_full[, .SD[sample(.N, .N, replace=T)], keyby = hospital_id]
更新:Mnist 要求进一步解释。
dt <- data.table(HOSP = rep(LETTERS[1:5], 1:5), DOC = letters[15:1], value = 1:15)
这给了我们这些数据:
HOSP DOC value
1: A o 1
2: B n 2
3: B m 3
4: C l 4
5: C k 5
6: C j 6
7: D i 7
8: D h 8
9: D g 9
10: D f 10
11: E e 11
12: E d 12
13: E c 13
14: E b 14
15: E a 15
所以我们有两个步骤。
- 我们从 HOSP 中 SWR N 次(其中 N 是数据集中的项目数)。所以我们会得到长度为 15 的 A、B、C、D、E 的混合。
- 我们对每个 HOSP ID 内的每组 DOC 进行 SWR M 次(其中 M 是医院中 doc 的数量)。因此对于 B,我们将 SWR n 和 m 乘以 2 倍。对于 Hosp C,我们将 SWR l,k,j 3 次等等。
- 行中的所有其他列最终都应包含在 SWR 操作中。