循环不起作用

Cycle doesn't work

在 Stata 中,我有以下变量:latitudelongitudeavg_luminosity。对于每次观察(总共 1547 次),我需要找到这对特定 latitudelongitude 的 "neighbours" 的平均光度的总和(让我们称这个变量为 sum_lum) ,那些 latitudelongitude 位于 0.5 半径范围内的。我试过以下代码:

tempvar sum_temp

forvalues i=1/1547 {
    egen `sum_temp' = sum(avg_luminosity) if (latitude<latitude[_n]+0.5 & latitude>latitude[_n]-0.5 & longitude<longitude[_n]+0.5 & longitude>longitude[_n]+0.5)
    replace sum_lum[_n]= sum_temp
    drop `sum_temp'
}

但代码不起作用 (weights not allowed)。谁能帮我解决这个问题?

我们在这里没有一个很好的问题,因为没有给出 运行 代码的示例数据。有关如何提出好问题的信息,请参阅 https://whosebug.com/help/mcve。我们有 1547 是观察的数量。

但是尽管如此,此代码仍存在各种可识别的问题。

首先,考虑 if 限定符:

if (latitude<latitude[_n]+0.5 & latitude>latitude[_n]-0.5 & longitude<longitude[_n]+0.5 & longitude>longitude[_n]+0.5)

我们需要纠正那里的错别字:最后一个 +0.5 显然应该是 -0.5

要关注主要问题,请将 latitude 替换为 y,将 longitude 替换为 x

if (y < y[_n]+0.5 & y > y[_n]-0.5 & x < x[_n]+0.5 & x > x[_n]-0.5)

下标[_n]只是表示当前观察,是多余的:

if (y < y+0.5 & y > y-0.5 & x < x+0.5 & x > x-0.5)

从中可以看出限定是没有限定:总是正确的(现在使用数学符号)y - 0.5 < y < y + 0.5 和 x 类似。

这段代码的intent是比较anyyany x 与当前的 yx,但这不是它在 Stata 中的作用。

换句话说,猜测可能是 [_n] 每次循环都有不同的解释,但事实并非如此。

其次,如果代码在其他方面是正确的,那么循环 1/1547 的效果将完全 重复相同的计算 1547 次。代码的 intent 毫无疑问,但循环内部没有任何内容以任何方式使用循环索引 i

第三,这些都不是报告的问题。

replace sum_lum[_n]= sum_temp

由于下标而失败,等号前 replace 不允许这样做:有关权重的错误消息是 Stata 猜测您正在尝试指定权重。该语句也会失败(做你想做的事,或者很可能根本不会做),因为右边的变量应该是你刚刚创建的临时变量。

第四,虽然这是风格而不是语法,但使用 egen 来计算和是矫枉过正的。不需要重新创建 1547 次新变量就可以 droppred。

下面是对什么可行的猜测:

gen sum_lum = . 

local y latitude 
local x longitude 

quietly forval i = 1/1547 { 
   summarize avg_luminosity if inrange(`y', `y'[`i'] - 0.5, `y'[`i'] + 0.5) & ///
inrange(`x', `x'[`i'] - 0.5, `x'[`i'] + 0.5), meanonly 
   replace sum_lum = r(sum) in `i' 
}

该循环使用当前观测的纬度和经度。