Stata:在群组中对点进行独特排序

时间:2014-11-14 07:50:28

标签: stata

我正在进行家庭调查,随机抽样调查200个村庄。使用QGIS,我从原来的村庄中选择了一个随机点5-10公里。然后,我从国家统计局获得了那些200"邻居"村庄 - 以及另外10个邻村的缓冲区。所以我的总样本是:

200个原始村庄+ 210个邻村= 410个村庄,总数

我们很快就会开始实地考察,我想给每个调查小组一张原始村庄+最近邻村的地图。因为我也在一些密集的城市地区进行测量,有时邻居村实际上离一个以上的原始村庄非常近。

我的问题是:如果我在QGIS中运行Distance Matrix,将旧村庄与最近的邻村匹配,我会在后者中重复。为了解决这个问题,我将每个旧村庄与最近的 5 邻居村庄进行了匹配。我的主要想法/目标是选择尚未被选中的最近邻居。

我最终得到了像这样的.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

这也不起作用;它只是将taken设置为1为所有obs:

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

我认为,我需要做的是循环_N_n,并且可能使用if/else。但我不确定如何把它们放在一起。

(切线,是否有更好的方法在Stata中循环减少值?类似于其他编程语言中的i--?)

1 个答案:

答案 0 :(得分:1)

这应该可行,但设置与您所说的有所不同。通过与只有五个邻居的比较,你会遇到一个不适定的问题。想象一下,地理位置是这样的,你最终得到六个(或更多)原始村庄,这些村庄拥有五个邻居的所有相同列表。你怎么分配第六个原始村庄?

鉴于此,我将原来的村庄与所有其他村庄进行比较,而不仅仅是五个。然后策略是指定原始村庄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

另一个问题是结果将取决于哪个原始村庄设置为第一,第二等等;因为作业的顺序会根据那个而改变。也就是说,丢弃可用选项的顺序会随着您设置原始村庄的顺序而变化。在开始作业之前,您可能希望随机化原始村庄的顺序。

您可以提高[{1}}代替& _n > `villa'的效率,但您不会注意到样本数量。

我没有资格对您的样本设计说些什么,所以请回答这个问题,只解决您提出的编程问题。

顺便说一下,循环减少值:

in `=`villa'+1'/L

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