我正在进行家庭调查,随机抽样调查200个村庄。使用QGIS,我从原来的村庄中选择了一个随机点5-10公里。然后,我从国家统计局获得了那些200"邻居"村庄 - 以及另外10个邻村的缓冲区。所以我的总样本是:
200个原始村庄+ 210个邻村= 410个村庄,总数
我们很快就会开始实地考察,我想给每个调查小组一张原始村庄+最近邻村的地图。因为我也在一些密集的城市地区进行测量,有时邻居村实际上离一个以上的原始村庄非常近。
我的问题是:如果我在QGIS中运行Distance Matrix
,将旧村庄与最近的邻村匹配,我会在后者中重复。为了解决这个问题,我将每个旧村庄与最近的 5 邻居村庄进行了匹配。我的主要想法/目标是选择尚未被选中的最近邻居。
我最终得到了像这样的.csv:
正如你所看到的那样,挑选最近的五个村庄,我得到了重复 - 邻居村庄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--
?)
答案 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'"
}
。