循环不起作用
Cycle doesn't work
在 Stata 中,我有以下变量:latitude
、longitude
、avg_luminosity
。对于每次观察(总共 1547 次),我需要找到这对特定 latitude
和 longitude
的 "neighbours" 的平均光度的总和(让我们称这个变量为 sum_lum
) ,那些 latitude
和 longitude
位于 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是比较anyy
和any x
与当前的 y
和 x
,但这不是它在 Stata 中的作用。
换句话说,猜测可能是 [_n]
每次循环都有不同的解释,但事实并非如此。
其次,如果代码在其他方面是正确的,那么循环 1/1547
的效果将完全 重复相同的计算 1547 次。代码的 intent 毫无疑问,但循环内部没有任何内容以任何方式使用循环索引 i
。
第三,这些都不是报告的问题。
replace sum_lum[_n]= sum_temp
由于下标而失败,等号前 replace
不允许这样做:有关权重的错误消息是 Stata 猜测您正在尝试指定权重。该语句也会失败(做你想做的事,或者很可能根本不会做),因为右边的变量应该是你刚刚创建的临时变量。
第四,虽然这是风格而不是语法,但使用 egen
来计算和是矫枉过正的。不需要重新创建 1547 次新变量就可以 drop
pred。
下面是对什么可行的猜测:
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'
}
该循环使用当前观测的纬度和经度。
在 Stata 中,我有以下变量:latitude
、longitude
、avg_luminosity
。对于每次观察(总共 1547 次),我需要找到这对特定 latitude
和 longitude
的 "neighbours" 的平均光度的总和(让我们称这个变量为 sum_lum
) ,那些 latitude
和 longitude
位于 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是比较anyy
和any x
与当前的 y
和 x
,但这不是它在 Stata 中的作用。
换句话说,猜测可能是 [_n]
每次循环都有不同的解释,但事实并非如此。
其次,如果代码在其他方面是正确的,那么循环 1/1547
的效果将完全 重复相同的计算 1547 次。代码的 intent 毫无疑问,但循环内部没有任何内容以任何方式使用循环索引 i
。
第三,这些都不是报告的问题。
replace sum_lum[_n]= sum_temp
由于下标而失败,等号前 replace
不允许这样做:有关权重的错误消息是 Stata 猜测您正在尝试指定权重。该语句也会失败(做你想做的事,或者很可能根本不会做),因为右边的变量应该是你刚刚创建的临时变量。
第四,虽然这是风格而不是语法,但使用 egen
来计算和是矫枉过正的。不需要重新创建 1547 次新变量就可以 drop
pred。
下面是对什么可行的猜测:
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'
}
该循环使用当前观测的纬度和经度。