2013-03-12 58 views
1

我正在运行一些人口普查数据的抽样模拟,我想分两个阶段抽样。R分段采样

  • 首先,我想在每个村庄内采样25户。
  • 第二我想从每个家庭抽样1人。

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

但是,我想从每个村庄的25个抽样家庭中采样1个人。我无法弄清楚。

Here is the link to my data:

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) 
} 
+1

很确定,但如果您提供样本数据,则会更容易向您显示。 :) – 2013-03-12 19:22:00

+0

我刚刚更新了它 - 我应该包含一个链接到我的数据,或者这将足以离开? – David 2013-03-12 19:31:16

+0

链接会很好。 – 2013-03-12 19:34:40

回答

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) 
    } 
+0

但是,您正在第一步做第二步。 – Arun 2013-03-12 22:54:35

+0

我很好。它让我想要什么。它仍然是一个两阶段样本,抽样了25户住户,每个抽样住户抽样了1人。 – David 2013-03-12 23:03:24

+0

我很高兴它为您提供正确的解决方案。但是,如果您向我们提供正确的数据/方法并*正确解释,那么这很重要。您在这里也使用两个数据集,并绑定第二个数据。 – Arun 2013-03-13 06:55:05

1

这个怎么样?

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

lapply(村,样品,25) - >给25户全部177个村
sapply(,样品,1。) - >这25人的样本1人从每个177个村
总和() - >求和采样值
复制 - >重复相同的功能3000倍

+0

我不认为这样做。谢谢你。 – David 2013-03-12 22:44:07

+0

你是什么意思?请详细说明。 – Arun 2013-03-12 22:44:39

+0

我不完全确定它做了什么,但是当我运行“sum(sapply(lapply(villages,sample,25),sample,1))”部分代码时,我得到了“9”的结果。对我来说,这表明它为每个村庄抽出了一个样本而不是样本。 – David 2013-03-12 23:02:36