Stata:组内唯一的排序点

Stata:组内唯一的排序点,stata,Stata,我正在对200个村庄进行随机抽样的家庭调查。使用QGIS,我从我原来的村庄随机选取了一个5-10公里的点。然后,我从国家统计局获得了这200个“相邻”村庄的村庄代码,以及另外10个相邻村庄的缓冲区。所以我的总样本是: 200个原村+210个邻村=410个村,合计 我们很快就要开始实地调查了,我想给每个调查小组一张1个原始村庄+最近邻村庄的地图。因为我也在一些密集的城市地区进行调查,有时候一个相邻的村庄实际上与不止一个原始村庄非常接近 我的问题是:如果我在QGIS中运行距离矩阵,将一个旧村庄与其最

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

200个原村+210个邻村=410个村,合计

我们很快就要开始实地调查了,我想给每个调查小组一张1个原始村庄+最近邻村庄的地图。因为我也在一些密集的城市地区进行调查,有时候一个相邻的村庄实际上与不止一个原始村庄非常接近

我的问题是:如果我在QGIS中运行
距离矩阵
,将一个旧村庄与其最近的邻居村庄进行匹配,我会在后者中得到重复的。为了解决这个问题,我将每个老村庄与最近的5个相邻村庄进行了匹配。我的主要想法/目标是选择尚未选择的最近邻居。

我最终得到了一个.csv文件,如下所示:

如你所见,选择最近的五个村庄,我得到了重复-邻居村庄79显示为原始村庄1、2、3和4的附近。这很好,只要我可以将邻居村庄79指定给一个(并且只有一个)原始村庄,然后让其他村庄也唯一匹配

那么,我想做的就是将每个原始村庄与一个相邻村庄唯一地匹配起来。我尝试过很多东西,但都没有成功:我的感觉是,我需要在原始村庄组上循环,将一个变量(例如,
take==1
)分配给一个相邻村庄,然后——不知何故——让该
take==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的
take
设置为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--

这应该可以工作,但设置与您所说的有所不同。与只有五个邻居相比,你有一个不适定问题。想象一下,地理位置是这样的,你最终会有六个(或更多)原始村庄,它们都有五个邻居。你给第六个原始村庄分配了什么

有鉴于此,我将原始村庄与所有其他村庄进行比较,而不仅仅是五个村庄。然后,策略是将原始村庄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
另一个问题是,结果将取决于将哪个原始村庄设置为第一、第二等等;因为作业的顺序也会随之改变。也就是说,放弃可用选项的顺序将随设置原始村庄的顺序而变化。在开始指定之前,您可能需要随机化原始村庄的顺序

您可以提高效率,在`=`villa'+1'/L中用
&n>`villa'
替换
,但您不会注意到样本量太大

我没有资格对您的示例设计发表任何意见,因此,采用这个答案仅解决您提出的编程问题

顺便说一下,要循环递减值:

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

请参见
help numlist

最好将数据格式化为代码,而不是图像。它有助于复制/粘贴操作。在Stata中,您可以使用
列表,清理noobs
并将其复制到此处。