2014-11-14 28 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