본문 바로가기

MySTATA/활용팁

날짜다루기 I

* 오늘은 STATA에서 날짜를 다루어 본다. 대부분의 통계프로그램은 각 날짜에 대해 고유의 상수를 정의하고 사용한다. 

* 이때,  STATA에서는 1960년 1월을 '0'으로 정의한다. 즉, 1960년 2월은 2, 1961년 1월은 12가 된다. 

* 아래의 행렬은 국민연금 수급자에게 지급하는 부양가족 연금액과 적용기간을 입력하는 내용이다. 

* 1열: 적용 시작연도, 2열은 적용시작 월

* 3열: 적용 끝 연도, 4열은 적용 끝 월

* 5열: 피부양자가 배우자인 경우 지급하는 연간 부양가족 연금액

* 6열: 피부양자가 자녀 혹은 부모인 경우 지급하는 연간 부양가족 연금액


clear 

mat DepMat =  (1988, 1, 1990, 3, 60000, 36000 /*

*/  \1990, 4, 1992, 3, 67920, 40750 /*

*/  \1992, 4, 1994, 3, 80890, 48530 /*

*/  \1994, 4, 1996, 3, 90030, 54010 /*

*/  \1996, 4, 1998, 12, 99930, 59950 /*

*/  \1999, 1, 1999, 3, 150000, 100000 /*

*/  \1999, 4, 2000, 3, 161250, 107500 /*

*/  \2000, 4, 2001, 3, 162540, 108360 /*

*/  \2001, 4, 2002, 3, 166270, 110850 /*

*/  \2002, 4, 2003, 3, 173080, 115390 /*

*/  \2003, 4, 2004, 3, 177750, 118500 /*

*/  \2004, 4, 2005, 3, 184140, 122760 /*

*/  \2005, 4, 2006, 3, 190760, 127170 /*

*/  \2006, 4, 2007, 3, 195910, 130600 /*

*/  \2007, 4, 2008, 3, 200220, 133470 /*

*/  \2008, 4, 2009, 3, 205220, 136800 /*

*/  \2009, 4, 2010, 3, 214860, 143220 /*

*/  \2010, 4, 2011, 3, 220870, 147230 /*

*/  \2011, 4, 2012, 3, 227270, 151490 /*

*/  \2012, 4, 2013, 3, 236360, 157540 /*

*/  \2013, 4, 2014, 3, 241550, 161000 /*

*/  \2014, 4, 2015, 3, 244690, 163090 /*

*/  \2015, 4, 2016, 3, 247870, 165210 /*

*/  \2016, 4, 2017, 3, 249600, 166360 /*

*/  \2017, 4, 2018, 3, 252090, 168020 )



svmat2 DepMat  // 행렬을 데이터셋으로 


rename (DepMat1-DepMat6) (ap_y ap_m ed_y ed_m dep_y_spo dep_y_chpa)


gen ap_ym = ym(ap_y,ap_m)  // 특정 연월에 해당하는 상수 

gen ed_ym = ym(ed_y,ed_m)

gen dif_ym = ed_ym-ap_ym + 1 

expand dif_ym , gen(dupo)  // 데이터에 없는 월 생성 

sort ap_y dupo

by ap_y (dupo),sort: replace ap_ym = ap_ym[_n-1] + 1 if dupo==1  // 생성된 관측치에 월 상수 지정


keep ap_ym dep_y_spo dep_y_chpa

gen dep_m_spo = dep_y_spo/12        

gen dep_m_chpa = dep_y_chpa/12

gen year = year(dofm(ap_ym))      // 월 상수가 의미하는 연도 추출

gen mon = month(dofm(ap_ym))  // 월 상수가 의미하는 월 추출 

order ap_ym year mon dep_y_spo dep_y_chpa dep_m_chpa 

mat drop DepMat 

mkmat ap_ym year mon dep_y_spo dep_y_chpa dep_m_spo dep_m_chpa , matrix(mymat_dep)   // 데이터셋을 행렬로..




clear 

* 입력하고자 하는 데이터셋 부르고


gen temp_ym = ym(year,mon) if bwon!=.   // 데이터셋에 있는 연월을 상수로 

gen dep_m_spo = .

gen dep_m_chpa = . 


levelsof temp_ym , loc(myses)  // 데이터셋에 있는 연월의 종류를 로컬로 지정 

foreach mym of loc myses {

replace dep_m_spo = mymat_dep[`mym'-335,6] if temp_ym==`mym'

replace dep_m_chpa = mymat_dep[`mym'-335,7] if temp_ym==`mym'

}











// STATA에서는 1960년 1월 == 0  으로 설정되어 있음. 따라서 1988년1월을 1행으로 지정하고자 한다면, 여기에 335를 빼주면 된다. 



// 이를 통해 생성되는 매트릭스, mymat_dep

// ap_ym year mon dep_y_spo dep_y_chpa dep_m_spo dep_m_chpa 

// 1988년1월(336)~2018년3월(698)이 1행부터 363행까지 있음.