2017-03-19 9 views
0

: persid는 사람의 ID입니다관리 : 지난 24 개월 동안 주어진 상태에서 보낸 개월 나는 다음과 같은 형태가 주문 데이터 세트로 작업하고

clear all 

input persid start end t_start t_end spell_type year spell_number event 
    1 8 9 44 45 1 1999 1 0 
    1 12 12 60 60 1 2000 1 0 
    1 1 1 61 61 1 2001 1 0 
    1 7 11 67 71 1 2001 2 0 
    1 1 4 85 88 2 2003 1 0 
    1 5 7 89 91 1 2003 2 1 
    1 8 11 92 95 2 2003 3 0 
    1 1 1 97 97 2 2004 1 0 
    1 1 3 121 123 1 2006 1 1 
    1 4 5 124 125 2 2006 2 0 
    1 6 9 126 129 1 2006 3 1 
    1 10 11 130 131 2 2006 4 0 
    1 12 12 132 132 1 2006 5 1 
    1 1 12 157 168 1 2009 1 0 
    1 1 12 169 180 1 2010 1 0 
    1 1 12 181 192 1 2011 1 0 
    1 1 12 193 204 1 2012 1 0 
    1 1 12 205 216 1 2013 1 0 
end 

lab define lab_spelltype 1 "unemployment spell" 2 "employment spell" 
lab val spell_type lab_spelltype 

을; startend은 연간 실업/고용 주문이 각각 시작 및 종료되는 달입니다. t_startt_end은 동일한 조치이지만 1996 년 1 월 1 일부터 계산되기 시작합니다. event은 이전 행이 실업 주문 인 취업 항목의 경우 1과 같습니다.

데이터는 주어진 해에 중복 주문이없고 매년 동일한 유형의 연속 주문이 병합되었습니다.

나의 목표는 event이 각 행에 대해 지난 6 개월 및 24 개월 동안 근무한 달의 수를 계산하는 것입니다. 이 특정 예에서, 제가 좀하고 싶습니다 것은 :

clear all 
input persid start end t_start t_end spell_type year spell_number event empl_6 empl_24 
    1 8 9 44 45 1 1999 1 0 . . 
    1 12 12 60 60 1 2000 1 0 . . 
    1 1 1 61 61 1 2001 1 0 . . 
    1 7 11 67 71 1 2001 2 0 . . 
    1 1 4 85 88 2 2003 1 0 . . 
    1 5 7 89 91 1 2003 2 1 0 5 
    1 8 11 92 95 2 2003 3 0 . . 
    1 1 1 97 97 2 2004 1 0 . . 
    1 1 3 121 123 1 2006 1 1 0 0 
    1 4 5 124 125 2 2006 2 0 . . 
    1 6 9 126 129 1 2006 3 1 3 3 
    1 10 11 130 131 2 2006 4 0 . . 
    1 12 12 132 132 1 2006 5 1 4 7 
    1 1 12 157 168 1 2009 1 0 . . 
    1 1 12 169 180 1 2010 1 0 . . 
    1 1 12 181 192 1 2011 1 0 . . 
    1 1 12 193 204 1 2012 1 0 . . 
    1 1 12 205 216 1 2013 1 0 . . 
end 

그래서 생각 나는 각 event==1 항목을 이전 행으로 돌아가 개인이 사용되었다 몇 개월 계산해야한다는 것입니다.

최종 결과를 얻는 방법을 제안 할 수 있습니까? 일부 사람들은 데이터 세트 expand을 제안했지만 데이터 세트가 상당히 크기 때문에 문제를 해결할 수있는 더 나은 방법이있을 수 있습니다.

편집

고용 상태의 정확한 표시는 다음과 같습니다

lab define lab_spelltype 1 "employment spell" 2 "unemployment spell" 

고용 (empl_6empl_24)에서 보낸 지난 달의 수와 event의 정의이와 지금 올바른지 상표.

답변

1

게시 된 예제는 솔루션을 개발하고 테스트하는 데 거의 유용하지 않으므로 동일한 속성을 가진 가짜 데이터를 만들었습니다. 지표의 값으로 1과 2를 사용하는 것은 나쁜 습관이므로 고용 된 지표를 사용 된 1 개의 의미로, 그렇지 않으면 0으로 대체했습니다. 별도로 월과 연도를 사용하면 Stata 월별 날짜가 사용되므로 쓸모가 없습니다.

첫 번째 해결 방법은 각 맞춤법을 한 달에 한 번씩 확장 한 후 tsegen (SSC에서)을 사용합니다. 패널 데이터를 통해 원하는 작업 시간대에 고용 지표를 합산하면됩니다.

두 번째 솔루션은 rangestat (또한 SSC에서 제공)을 사용하며 데이터를 전혀 확장하지 않고 동일한 계산을 수행합니다. 아이디어는 간단합니다. 철자의 끝이 원하는 창 내에 있으면 이전 고용 기간의 지속 시간을 추가하십시오. 물론 마법의 끝이 창 안에 있지만 시작이 아니라면 창 밖에있는 날을 빼야합니다.

* fake data for 100 persons, up to 10 spells with no overlap 
clear 
set seed 123423 
set obs 100 
gen long persid = _n 
gen spell_start = ym(runiformint(1990,2013),1) 
expand runiformint(1,10) 
bysort persid: gen spellid = _n 
by persid: gen employed = runiformint(0,1) 
by persid: gen spell_avg = int((ym(2015,12) - spell_start)/_N) + 1 
by persid: replace spell_start = spell_start[_n-1] + /// 
    runiformint(1,spell_avg) if _n > 1 
by persid: gen spell_end = runiformint(spell_start, spell_start[_n+1]-1) 
replace spell_end = spell_start + runiformint(1,12) if mi(spell_end) 
format %tm spell_start spell_end 

* an event is an employment spell that immediately follow an unemployment spell 
by persid: gen event = employed & employed[_n-1] == 0 

* expand to one obs per month and declare as panel data 
expand spell_end - spell_start + 1 
bysort persid spellid: gen ym = spell_start + _n - 1 
format %tm ym 
tsset persid ym 

* only count employement months; limit results to first month event obs 
tsegen m6 = rowtotal(L(1/6).employed) 
tsegen m24 = rowtotal(L(1/24).employed) 
bysort persid spellid (ym): replace m6 = . if _n > 1 | !event 
bysort persid spellid (ym): replace m24 = . if _n > 1 | !event 

* --------- redo using rangestat, without any monthly expansion ---------------- 

* return to original obs but keep first month results 
bysort persid spellid: keep if _n == 1 

* employment end and duration for employed observations only 
gen e_end = spell_end if employed 
gen e_len = spell_end - spell_start + 1 if employed 

foreach target in 6 24 { 

    // define interval bounds but only for event observations 
    // an out-of-sample [0,0] interval will yield no results for non-events 
    gen low`target' = cond(event, spell_start-`target', 0) 
    gen high`target' = cond(event, spell_start-1, 0) 

    // sum employment lengths and save earliest employment spell info 
    rangestat (sum) empl`target'=e_len /// 
     (firstnm) firste`target'=e_end firste`target'len=e_len, /// 
     by(persid) interval(spell_end low`target' high`target') 

    // remove from the count months that occur before lower bound 
    gen e_start = firste`target' - firste`target'len + 1 
    gen outside = low`target' - e_start 
    gen empl`target'final = cond(outside > 0, empl`target'-outside, empl`target') 
    replace empl`target'final = 0 if mi(empl`target'final) & event 
    drop e_start outside 
} 

* confirm that we match the -tsegen- results 
assert m24 == empl24final 
assert m6 == empl6final 
+0

답장을 보내 주셔서 감사합니다. 불행히도 내 질문에 오타가있었습니다. 실업자가 아닌 1 명이 고용되어 있습니다. 그렇지 않으면 흥미있는 사건이 아니라 지난 몇 달 동안 고용 된 상태에서 질문을 마치고보고합니다. 질문을 수정하고 답장을 기반으로 부분적으로 해결책을 제안했습니다. – Stezzo

+0

또한, 새로운 "사건"이 이전 사건으로부터 6 (24) 개월 이내에 발생한다면, 이는 고용 된 지난 달의 계산에서 고려되지 않았다고 생각합니다. – Stezzo

+0

예를 수정하여이 것이 더 명확 해지기를 바랍니다. . –

0

문제에 대한 해결책은에 있습니다 :

  • 가, 마침내 tsfill과 함께 갭 개월,
  • 채우기 때문에 데이터를 확장 매달 그것을 가지고
  • 사용 sum() 및 지연 운영자는 지난 6 개월과 24 개월 동안 누적 합계를 계산합니다.

내가 빌린 아이디어에 대한 로버트 솔루션도 참조하십시오.

중요 : 특히 데이터가 큰 경우 (예 : 내 경우) 문제를 해결하는 데는 효율적인 방법이 아닙니다. 그러나 플러스는 실제로 최종 결과가 원하는 결과인지 확인하기 위해 백그라운드에서 발생하는 것을 "보는"것입니다.

또한이 솔루션은 서로 6 개월 (또는 24 개월) 내에 2 건 이상의 이벤트가 발생하는 경우를 고려합니다.

clear all 

input persid start end t_start t_end spell_type year spell_number event 
    1 8 9 44 45 1 1999 1 0 
    1 12 12 60 60 1 2000 1 0 
    1 1 1 61 61 1 2001 1 0 
    1 7 11 67 71 1 2001 2 0 
    1 1 4 85 88 2 2003 1 0 
    1 5 7 89 91 1 2003 2 1 
    1 8 11 92 95 2 2003 3 0 
    1 1 1 97 97 2 2004 1 0 
    1 1 3 121 123 1 2006 1 1 
    1 4 5 124 125 2 2006 2 0 
    1 6 9 126 129 1 2006 3 1 
    1 10 11 130 131 2 2006 4 0 
    1 12 12 132 132 1 2006 5 1 
    1 1 12 157 168 1 2009 1 0 
    1 1 12 169 180 1 2010 1 0 
    1 1 12 181 192 1 2011 1 0 
    1 1 12 193 204 1 2012 1 0 
    1 1 12 205 216 1 2013 1 0 
end 

lab define lab_spelltype 1 "employment" 2 "unemployment" 
lab val spell_type lab_spelltype 
list 

* generate Stata monthly dates 
gen spell_start = ym(year,start) 
gen spell_end = ym(year,end) 
format %tm spell_start spell_end 
list 

* expand to monthly data 
gen n = spell_end - spell_start + 1 
expand n, gen(expanded) 
sort persid year spell_number (expanded) 
bysort persid year spell_number: gen month = spell_start + _n - 1 
by persid year spell_number: replace event = 0 if _n > 1 
format %tm month 

* xtset, fill months gaps with "empty" rows, use lags and cumsum to count past months in employment 
xtset persid month, monthly // %tm format 
tsfill 
bysort persid (month): gen cumsum = sum(spell_type) if spell_type==1 
bysort persid (month): replace cumsum = cumsum[_n-1] if cumsum==. 
bysort persid (month): gen m6 = cumsum-1 - L7.cumsum if event==1 // "-1" otherwise it sums also current empl month 
bysort persid (month): gen m24 = cumsum-1 - L25.cumsum if event==1 
drop if event==. 
list persid start end year m* if event