2013-10-31 2 views
1
use "locationdata.dta", clear 
gen ring=. 
* Philly City Hall 
gen lat_center = 39.9525468 
gen lon_center = -75.1638855 
destring(INTPTLAT10), replace 
destring(INTPTLON10), replace 
vincenty INTPTLAT10 INTPTLON10 lat_center lon_center , hav(distance_km) inkm 
quietly su distance_km 
local min = r(min) 
replace ring=0 if (`min' <= distance_km < 1) 
local max = ceil(r(max)) 
* forval loop does not work 
forval i=1/`max'{ 
    local j = `i'+1 
    replace ring=`i' if (`i' <= distance_km < `j') 
} 

포인트에서 1km 씩 반지를 그립니다. 코드의 마지막 부분 (forval)이 작동하지 않습니다. 여기 뭔가 잘못 됐어?Stata : for 값의 경우 대체

편집은 다음과

forval 부분에 대한 결과가로 :

. forval i=1/`max'{ 
2.   local j = `i'+1 
3.   replace ring=`i' if `i' <= distance_km < `j' 
4. } 
(1746 real changes made) 
(0 real changes made) 
(0 real changes made) 
(0 real changes made) 
.... 

그래서, i = 2 이후 작동하지 않습니다 교체.

+0

"작동하지 않음"이란 무엇을 의미합니까? 더 자세하게 얘기해 주 시겠어요? –

+0

원본 질문에 결과를 추가했습니다. 감사. –

답변

2

이중 불평등은 수학적 규칙에 따라 의미가

(`min' <= distance_km < 1) 

로 STATA에서 명확하게 합법적이다. 그렇지 않으면 코드가 구문 오류를 유발했을 수 있습니다. 그러나 Stata는 전체 표현식이 평가 될 때까지 평가를 보유하지 않습니다. 여기서 괄호는 중요하지 않습니다. 핵심은 내용이 평가되는 방식입니다. 결과적으로 당신이 원하는 결과를 얻지 못할 것입니다.

더 자세하게 Stata는이 표현식을 왼쪽에서 오른쪽으로 다음과 같이 해석합니다. 0 또는 1이 분명 위의 불평등에 해당하는 1을 반환 등

distance_km >= `min' 

것을 및 값에 대한 값을 선택합니다으로 첫 번째 평등

`min' <= distance_km 

는 참 또는 거짓 따라서 평가입니다. STATA는 앞으로 한 결과를 가지고 상기 제 불평등 돌려

1 < 1 

(제 1 부등식의 < 1 즉 결과) 평가하지만 이러한 거짓위한 것이다 값. 반대로,

(`min' <= distance_km < 1) 

0 < 1 

로 평가 될 것입니다 - 사실 (리턴 1)이다 - 당신이 필요 의도가 무엇인지, 경우 경우에만

한마디로
`min' > distance_km 

즉,

(`min' <= distance_km) & (distance_km < 1) 

이것이 문제의 근원이라고 추측합니다.

Stata는 inrange() 기능이 있지만 여기에서 원하는 것은 아닙니다.

그러나 여러분의 코드를 보면 부등식과 루프가 모두 불필요한 것으로 보입니다.

gen ring = floor(distance_km) 

아래의 정수 결과 floor() 라운드로, vincenty에 전화 후 코드의 전체 블록을 대체 할 수 있도록 당신은 당신의 반지가 1km 간격되고 싶어요. 당신은 그 쌍둥이를 알고있는 것으로 보입니다 ceil().부수적하지만 주목할만한

일부 다른 작은 포인트 :

  1. 할 수 있습니다 한 번에 destring 여러 변수.

  2. generate으로 변수에 상수를 넣는 것은 비효율적입니다. 이 목적으로 scalar을 사용하십시오. (vincenty 입력으로 변수를 필요로한다면, 그것은이 점을 무시할 것,하지만 vincenty이 너무 엄격이라고까지 지적한다.)

  3. summarize, meanonly 그냥 최소 및 최대 값을 계산하는 것이 좋습니다. 여기서는 옵션 이름이 오도 된 것 같습니다. 토론에 대해서는 http://www.stata-journal.com/sjpdf.html?articlenum=st0135을 참조하십시오. 즉,이 경우에 매우 관련이없는 것 같다 있지만 사용자 작성 vincenty이 어디에서 오는지 일반 STATA 관행의 문제로

는 귀하의 게시물을 설명한다.

완벽을 기하기 위해 데이터를 테스트해야하지만 다음은 다시 작성합니다.

 
use "locationdata.dta", clear 
* Philly City Hall 
scalar lat_center = 39.9525468 
scalar lon_center = -75.1638855 
destring INTPTLAT10 INTPTLON10, replace 
vincenty INTPTLAT10 INTPTLON10 lat_center lon_center , hav(distance_km) inkm 
gen ring = floor(distance_km) 
+0

고맙습니다. 나는 많이 배웠다! –