2013-03-12 79 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