2016-05-22 2 views
0

В Stata у меня есть следующие переменные: latitude, longitude, avg_luminosity. Для каждого наблюдения (всего 1547) мне нужно найти сумму (назовем эту переменную sum_lum) средних светимостей «соседей» этой конкретной пары latitude и longitude, те, которые и 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). Может ли кто-нибудь помочь мне в этом вопросе?

ответ

0

У нас нет очень хорошего вопроса, поскольку данные образца не приводятся для запуска кода. См. 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' 
} 

Этот цикл использует широту текущего Наблюдательные и долготу.

+0

Код, который вы предоставили, работает правильно! Большое спасибо за ваши комментарии. –

Смежные вопросы