我有一个纵向数据集,其中包含所有个人的每个观察的一行。每次观察都有几个测量值,其中一些可能会丢失。个人的观察数量变化很大,并且有大量的辍学。这是数据集的一部分
> 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 的整个观察集都会进入引导样本。当然,一个人可能会被多次采样,在这种情况下,它应该输入重新采样的数据适当的次数,并且理想情况下会收到一个更改的 ID 号,例如 10056.1、10056.2。
现在,我将尽力解决这个问题,但如果有人对我如何快速做到这一点有任何想法,我将不胜感激。
编辑:我最终使用了什么
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]), ]