1

我正在从人口普查数据中进行一些抽样模拟,我想分两个阶段进行抽样。

  • 首先,我想对每个村庄的 25 个家庭进行抽样。
  • 其次,我想从每个家庭中抽取 1 个人。

我的数据是长格式的,带有村庄标识符、家庭标识符和二进制疾病状态 ( 0 = healthy, 1 = diseased)。以下代码运行蒙特卡罗模拟,对每个村庄的 25 个人进行 3000 次抽样,并记录抽样的疟疾阳性个体的数量。

但是,我想从每个村庄的 25 个抽样家庭中抽取 1 个样本。我想不通。

这是我的数据的链接:

d = read.table("data.txt", sep=",", header=TRUE)
villages = split(d$malaria, d$villageid)
positives = vector("list", 3000)
for(i in 1:3000) {
    sampled = lapply(villages, sample, 25)
    positives[[i]] = lapply(sampled, sum)
}
4

2 回答 2

1

这个怎么样?

replicate(3000, sum(sapply(lapply(villages, sample, 25), sample, 1)))

lapply(villages, sample, 25) -> 为所有 177 个村庄提供 25 个家庭
sapply(., sample, 1) -> 从 177 个村庄的每个村庄的 25 个人中抽取 1 个人
sum(.) -> 将抽样值
相加-> 重复相同的功能 3000 次

于 2013-03-12T22:04:21.467 回答
0

我想出了一个解决方法。它非常复杂,涉及获取数据并创建另一个数据集。(我在 Stata 中这样做是因为我的 R 能力有限。)首先,我按门牌号对数据集进行排序并将其加载到 R (d.people) 中。然后我通过按门牌号折叠旧数据集来创建一个新数据集,并将其加载到 R (d.house) 中。我分两个阶段进行抽样,首先从人员数据集中的每个家庭中抽取 1 个人。然后,在将房屋数据集与从每个家庭抽样 1 人的输出相结合后,我可以从每个村庄抽样 25 个“家庭抽样人”。

d.people = read.table("people data", sep=",", header=TRUE)
d.houses = read.table("houses data", sep=",", header=TRUE)

for(i in 1:3000){
    houses = split(d.people$malaria, d.people$house)
    firststage = sapply(houses, sample, 1)
    secondstage = cbind(d.houses, firststage)
    villages = split(secondstage$firststage, secondstage$village)
    sampled = lapply(villages, sample, 25)
    positives[[i]] = lapply(sampled, sum)
    }
于 2013-03-12T22:41:23.170 回答