У нас нет очень хорошего вопроса, поскольку данные образца не приводятся для запуска кода. См. https://stackoverflow.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.
намерение этого кода сравнить любойy
и любойx
с текущим y
и x
, но это не то, что он делает в Stata.
В противном случае предположим, что [_n]
имеет различную интерпретацию каждый раз по кругу, но это не тот случай.
Во-вторых, эффект цикла 1/1547
был бы, если бы код был в противном случае правильным, состоял бы в том, чтобы повторить точно тот же расчет 1547 раз. умысел кода, без сомнения, в противном случае, но ничто внутри цикла не использует индекс цикла i
.
В-третьих, ни одна из этих проблем не сообщается.
replace sum_lum[_n]= sum_temp
не удается из-за подстрочные, что не допускаются с replace
до знака равенства: сообщение об ошибке о весах догадка STATA, что вы пытаетесь указать веса. Заявление также потерпит неудачу (делать то, что вы хотите, или, скорее всего, вообще работать), потому что переменная с правой стороны должна быть временной переменной, которую вы только что создали.
В-четвертых, хотя это стиль не синтаксис, используя egen
для вычисления суммы является излишним. Никакая новая переменная не требуется воссоздавать 1547 раз только для того, чтобы быть drop
пред.
Вот догадка, что будет работать:
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'
}
Этот цикл использует широту текущего Наблюдательные и долготу.
Код, который вы предоставили, работает правильно! Большое спасибо за ваши комментарии. –