すべての個人の観測ごとに 1 つの行で構成される縦方向のデータセットがあります。各観測にはいくつかの測定値があり、一部は欠落している可能性があります。個人の観測数にはばらつきがあり、大量の脱落者がいます。ここにデータセットのセクションがあります
> head(mydata,33)
id obstime agebase cd4 rna hem
1 10056 1 59 25.17936 3.611298 15.0
3 10056 3 59 21.33073 4.044030 15.4
4 10082 1 35 23.64318 5.275298 14.9
12 10082 9 35 22.31591 5.493349 14.4
22 10082 19 35 NA 5.875061 13.8
26 10082 23 35 18.84144 5.462503 13.9
28 10082 25 35 23.36664 2.397940 13.7
31 10082 28 35 26.55184 NA 15.3
34 10082 31 35 24.91987 NA 14.8
37 10082 34 35 24.08319 NA 15.5
41 10082 38 35 24.49490 NA 15.2
44 10082 41 35 26.00000 NA 15.5
48 10082 45 35 26.79552 NA 15.6
51 10082 48 35 24.53569 NA 14.9
55 10082 52 35 27.25803 NA 16.2
58 10082 55 35 26.47640 NA 15.4
61 10082 58 35 30.31501 NA 15.6
64 10082 61 35 27.01851 NA 15.8
67 10082 64 35 27.00000 NA NA
70 10082 67 35 28.37252 NA 16.2
73 10082 70 35 27.20294 NA 14.9
77 10082 74 35 25.23886 NA 14.7
79 10082 76 35 28.65310 NA 15.8
82 10082 79 35 28.17801 NA NA
85 10082 82 35 29.52965 NA 15.5
88 10082 85 35 29.52965 2.397940 15.5
89 10143 1 46 20.97618 4.361728 13.2
94 10143 6 46 22.00000 4.173507 14.0
98 10143 10 46 22.00000 4.173507 14.0
99 10215 1 33 20.49390 4.144605 16.0
......
> dim(mydata)
[1] 19793 6
> length(unique(mydata$id))
[1] 2161
必要なのは、このデータセットからブートストラップ サンプルを生成することです。ここでは、個々のクラスターが保存されます。これにより、個人がサンプリングされた場合、その ID の観測セット全体がブートストラップ サンプルに入ります。もちろん、個人は複数回サンプリングされる可能性があります。その場合、再サンプリングされたデータを適切な回数入力し、理想的には、たとえば 10056.1、10056.2 などの変更された ID 番号を受け取る必要があります。
今のところ、私はできる限り力ずくで問題を解決しようとしていますが、これをすばやく行う方法について誰かがアイデアを持っている場合は、大いに感謝します.
編集:私が最終的に使用したもの
dat <- mydata
indiv <- unique(dat[, 1])
smp <- sort(sample(indiv, length(indiv), replace=TRUE))
smp.df <- data.frame(id=smp)
dat.b = merge(smp.df, dat, all.x=TRUE)
# Number of observations for all IDs in original dataset
n.obs <- table(dat[, 1])
# Unique ids in the bootstrap sample
smpU <- unique(smp)
# Number of replicates sampled
reps <- as.vector(table(smp))
# Number of observations in the sampled IDs observation sets
obs <- as.vector(n.obs[match(smpU, names(n.obs))])
# Hacking the names
id.rep.obs <- cbind(smpU, reps, obs)
NameFun <- function(info) {
names <- as.numeric(paste0(rep(info[1], info[2]), ".", seq(1, info[2])))
names.long <- sort(rep(names, info[3]))
}
dat.b[, 1] <- do.call("c", apply(id.rep.obs, 1, NameFun))
dat.b <- dat.b[order(dat.b[, 1], dat.b[, 2]), ]