본문 바로가기

방법론 공부/계량통계 방법론

[STATA] STATA에서의 매크로(2) - foreach, forvalue, levelsof

매크로는 동일한 것을 반복해야 할 때 유용하게 쓰인다고 했지요. local 및 global command는 동일한 변수 반복과 조건을 정의할 때에 쓸 수 있었는데, for command는 동일한 command를 반복하는 것을 피하게 해줍니다.즉,


 for varlist kc ki kg: egen mean_X=mean(X)


는 다음의 command들을 입력한 것과 동일합니다.


egen mean_kc=mean(kc)

egen mean_ki=mean(ki) 

egen mean_kg=mean(kg)  


varlist에서 지정된 모든 변수들이 X로 인식되어 egen command가 실행된 것을 볼 수 있습니다. 이를 확인하는 display command과 개별 command가 표시되지 않게하는 noheader option을 통해 다음과 같은 결과를 확인할 수 있습니다.


for varlist kc ki kg, noheader: display "Mean of X = " mean_X

Mean of kc = 72.536438

Mean of ki = 15.740885

Mean of kg = 20.606308


새로운 변수들에 대해 command를 실행시키고 싶을 때는 newlist를 사용하면 됩니다.


. for newlist ARG FRA USA : gen Xpop=pop if countryisocode=="X" & year==1995


numlist와 varlist를 같이 사용할 수도 있지요.


. for X in varlist kg cgdp: for Y in numlist 1990/1995: sum X if year==Y


각각은 :로 연결된 것을 볼 수 있습니다.




한편, STATA8부터는 for command가 foreach와 forvalue command로 대체되었는데요, foreach는 for varlist, forvalue는 for numlist와 동일하게 사용됩니다.


foreach var in kg cgdp {

egen mean_`var’=mean(`var’)

display “Mean of `var’ = ” mean_`var’


일 때, kg와 cgdp라는 변수에 대하여 평균값이 형성되고, 그 결과값이 창에 표시되겠지요. 


foreach 매크로이름 in 변수1 변수2 변수3...


의 형태로 command가 이루어진 것을 볼 수 있습니다.


forvalues coomand도 비슷하게 사용할 수 있는데, 다음과 같이 /를 사용하여 범위를 지정할 수 있습니다.

 

forvalues t = 1980/1983 {

qui sum pop if countryisocode == "USA" & year == `t’

di "pop of country USA in `t’ is: " r(mean)

}


또한, 해당 범위 내의 모든 년도가 아니라, 5년에 한번에 해당하는 데이터를 사용하고 싶을 때에는 (5)를 가운데에 넣어주면 됩니다.


forvalues t = 1980(5)1990 {

qui sum pop if countryisocode == "USA" & year == `t’

di "pop of country USA in `t’ is: " r(mean)

}




마지막으로 levelsof command는  

levelsof 변수

의 형태로 사용하며,해당 변수에 있는 서로 다른 모든 값들을 목록화합니다. 이후에 r(levels)를 사용하여 해당 목록을 불러올 수 있습니다. 예컨대 주어진 dataset가 1992년부터 2014년까지의 자료를 포함한다고 할때, levelsof year를 사용하면 1992~2014에 해당하는 년도 목록이 생성되겠지요. 다음의 예시를 봅시다.

levelsof countryisocode 

local ctries "`r(levels)'" 
levelsof year 
local years "`r(levels)'" 

foreach ctr in `ctries' { 

foreach yr in `years' { 

sum pop if country == "`ctr'" & year == `yr' 

local `ctr'`year' = `r(mean)' } }


해당 예시에 따른 결과창은 주어진 dataset에 있는 인구 정보를 국가와 년도에 따라 요약해서 보여줍니다. 그리고 그 인구값을 결과값으로 갖는 매크로를 정의하지요 (국가코드와 년도로 이루어진 각각의 매크로가 생성됩니다. ex.USA1990). 



이 포스팅이 마음에 드셨다면 공감 버튼을 눌러주세요

로그인 하지 않으셔도 공감하실 수 있답니다.