2014-11-14 30 views
0

我正在對200個村莊進行隨機抽樣調查。使用QGIS,我從原來的村莊中挑選了一個5-10公里的隨機點。然後,我從國家統計局獲得了200個「鄰居」村莊的村代碼以及另外10個鄰居村莊的緩衝區。所以我總樣本爲:Stata:組內的唯一排序點

200原村+ 210個鄰居村莊= 410個自然村,總

我們馬上就要開始了實地考察,我想給每個調查小組的地圖1個原村+最近的鄰居村莊。因爲我也在一些密集的城市地區進行調查,有時候一個鄰居村莊實際上離一個以上的原始村莊非常近。

我的問題是這樣的:如果我在QGIS中運行Distance Matrix,將一個老村落與最近的鄰居村莊相匹配,我會在後者中得到重複。爲了解決這個問題,我將每個老村落與最近的鄰居村莊進行了匹配。我的主要想法/目標是挑選尚未挑選的最近鄰居。

我結束了一個.csv像這樣:

enter image description here

正如你可以看到,採摘五個最近的村莊,我得到重複 - 鄰國村79爲附近的顯示最多原來的村莊1,2,3,4。這很好,只要我可以指定鄰居村79至一個(且只有一個)原始村莊,然後剩下的唯一匹配。

然後,我想要做的就是將每個原始村莊與一個鄰居村莊進行唯一匹配。我嘗試了一堆東西,其中沒有一個能夠起作用:我的感覺是,我需要循環訪問原始村莊組,將一個變量(例如taken==1)分配給其中一個鄰居村莊,然後 - 以某種方式 - 讓每個實例那taken==1適用於所有例如說,鄰居村79.

下面是一些示例代碼,我在想什麼。注意:這與我鄰居的163個唯一匹配。

 gen taken = 0 
     so ea distance 

     by ea: replace taken=1 if _n==1 

     keep if taken==1 

     codebook FID ea 

這也行不通;它只是設置所有OBS taken 1:

 foreach i in 5 4 3 2 1 { 
      by ea: replace taken=1 if _n==`i' & taken==0 
     } 

我需要做什麼,我想,是循環在兩個_N_n,也許使用if/else。但我不知道如何把它放在一起。

(四角切圓,是有循環更好的辦法了在Stata減少值?在其他編程語言類似i--?)

+0

最好將數據格式化爲代碼而不是圖像。它有利於複製/粘貼操作。在Stata中,你可以使用'list,clean noobs'並在這裏複製。 –

回答

1

這應該工作,但其設置比你說你什麼略有不同需要。通過與只有五個鄰居比較,你有一個不適合的問題。想象一下,地理是這樣的,你最終有六個(或更多)原來的村莊,有五個鄰居的所有相同的名單。你分配第六個原始村莊是什麼?

鑑於此,筆者比較了原村莊全部其他村莊,不僅有5個。該策略然後將其最近的鄰居分配給原始村莊1;到原來的村莊2丟棄之前分配的最近鄰居,依此類推。這假定原始和鄰居村莊數量相等,但你有10個額外的,所以你需要給出一個想法。

clear 
set more off 

*----- example data ----- 

local numvilla = 4 // change to test 
local numobs = `numvilla'^2 

set obs `numobs' 

egen origv = seq(), from(1) to(`numvilla') block(`numvilla') 
bysort origv: gen neigh = _n 

set seed 1956 
gen dist = runiform()*10 

*----- what you want ? ----- 

sort origv dist 

list, sepby(origv) 

quietly forvalues villa = 1/`numvilla' { 

    drop if origv == `villa' & _n > `villa' 
    drop if neigh == neigh[`villa'] & _n > `villa' 

} 

list 

的另一個問題是,結果將取決於原村設置爲第一,第二,依此類推;因爲任務的順序會根據這個改變。也就是說,可用選項被放棄的順序隨着您設置原始村莊的順序而變化。在開始任務之前,您可能需要隨機化原始村莊的順序。

您可以用& _n > `villa'代替in `=`villa'+1'/L來提高效率,但您不會注意到樣本量太大。

我沒有資格對您的樣本設計進行任何說明,因此請僅回答您提出的編程問題。

順便說一句,遍歷遞減值:

forvalues obs = 5(-1)1 { 
    display "`obs'" 
} 

help numlist