Stataでイベントヒストリー.例によって俺用.

ロングデータを作るには,reshape long でフィルターかける方法と,リスク観測期間分だけ expand する方法があるんだけど,どっちがいいんだろうね.結局,どっちにしても細かいところは brow しながら試行錯誤しないとだめですね.リスクの基底時間が単純な初婚とか初交だったらいいんだけど,離職や離婚はカウントするのがめんどいですね.

// JGSS-2009LCSの.csvを用意する
// ワイドデータを作る

set more off

// 従属変数をつくる

// 問57 2「同居期間なし」と9無回答をドロップ
tab ptlvtgl
drop if ptlvtgl > 1
tab ptlvtgl
// ここで2674人

// 1回目の同居期間終了年月に2「現在まで」と9無回答をドロップ
tab plv01ong
drop if plv01ong > 1
tab plv01ong
// ここで2106人

//離家年齢を特定する
generate leaving_home_age = 0
replace leaving_home_age = plv01eny – dobyear
tab leaving_home_age
// 13歳で離家しているidをドロップする
drop if leaving_home_age == 13
tab leaving_home_age
// これたぶんちゃんとクリーニングされてないよな…….

// センサリングの処理
// 左センサー欠損
// 親との同居期間の終了年(俺的離家)に
// 具体的に答えてない9999をドロップ(4人)
tab plv01eny
drop if plv01eny == 9999
tab plv01eny
// ここで2102人

// 右センサー欠損
// 親との2回目の同居期間の開始年(俺的帰家)に
// 具体的に答えてない9999をドロップ(13人)
tab plv02sty
drop if plv02sty == 9999
tab plv02sty
// ここで2089人

// 帰家イベント生起ダミーを作る
gen returning_home = plv02
recode returning_home 2 = 0
tab returning_home
// ここで464人が帰家経験者

// 生存時間を作る
// リスク終了年 – リスク開始年
tab plv02sty
gen lisk_end = plv02sty
// 2回目の同居開始8888非該当のひとたちは
// 調査時点においても「実家に帰ってきてない」人たちなので,
// この人たちを右センサーする
recode lisk_end 8888 = 2009
tab lisk_end
gen survival_time = lisk_end – plv01eny
tab survival_time
// 0になってる人たちを1年以内にする
recode survival_time 0 = 1
tab survival_time

// 独立変数
tab sexa
gen male_dummy = 0
recode male_dummy 0 = 1 if sexa == 1
tab male_dummy

tab dobyear
gen cohort = 0
recode cohort 0 = 1 if dobyear > 1972
tab cohort

tab tp5loc15
generate urban_scale = tp5loc15
recode urban_scale 9 = .
tab urban_scale

tab opffix15
generate household_income = opffix15
recode household_income 9 = .
tab household_income
recode household_income (1 = 1) (2 = 1) (3 = 2) (4 = 3) (5 = 3)
tab household_income

// ダミー変数つくっとく
drop household_income_rich
gen household_income_rich = 0
gen household_income_avarage = 0
gen household_income_poor = 0
replace household_income_rich = 1 if household_income==3
replace household_income_avarage = 1 if household_income==2
replace household_income_poor = 1 if household_income==1
tab household_income_rich household_income
tab household_income_avarage household_income
tab household_income_poor household_income

gen siblings = xnumbroe + xnumsise + xnumbroy + xnumsisy + 1
recode siblings 397 = .
tab siblings
recode siblings (1=1) (2=2) (3=3) (4=4) (5=4) (6=4) (7=4) (8=4) (9=4)
tab siblings

// 離家理由をつくる
// 進学離家 高等教育在学開始年と離家年が一致していれば1
tab plv01eny
tab sch01sty
gen leaving_home_reason_school = 0
recode leaving_home_reason_school 0 = 1 if plv01eny == sch01sty
tab leaving_home_reason_school

// 就職離家 働きはじめた時期と離家年が一致していれば1
// tab plv01eny
// tab jb01sty
// gen leaving_home_reason_job = 0
// recode leaving_home_reason_job 0 = 1 if plv01eny == jb01sty | plv01eny == jb02sty | plv01eny == jb03sty
// tab leaving_home_reason_job
// tab leaving_home_reason_job plv01eny
// 闇を感じる

// 結婚離家
tab plv01eny
tab mrg01sty
gen leaving_home_reason_marriage = 0
recode leaving_home_reason_marriage 0 = 1 if plv01eny == mrg01sty
tab leaving_home_reason_marriage

gen lhr = 0
recode lhr 0 = 1 if leaving_home_reason_school == 1
recode lhr 0 = 2 if leaving_home_reason_marriage == 1

// ラベル
label define male_dummy 1 “male” 0 “female”
label values male_dummy male_dummy

label define cohort 1 “1973-1980” 0 “1966-1972”
label values cohort cohort

label define urban_scale 1 “metropolis” 2 “city” 3 “town” 4 “village”
label values urban_scale urban_scale

label define household_income 1 “less than the average” 2 “average” 3 “more than the average”
label values household_income household_income

label define siblings 4 “4 or more”
label values siblings siblings

label define lhr 1 “school” 2 “marriage” 0 “others”
label values lhr lhr
// 記述的分析
stset survival_time, failure(returning_home == 1) id(id)
stsum

sts list
sts graph, failure

sts graph, failure by(male_dummy)
sts graph, failure by(cohort)
sts graph, failure by(edu)
sts graph, failure by(household_income)
sts graph, failure by(urban_scale)
sts graph, failure by(siblings)
sts graph, failure by(lhr)
// ここからロングにする作業
expand survival_time
sort id
by id: generate t = _n
generate event = 0
by id: replace event = returning_home if _n==_N
tab t

// 年齢をぶち込む必要
tab leaving_home_age
generate age = 0
replace age = leaving_home_age if t==1
replace age = leaving_home_age+t-1 if t~=1
tab age

// リスク観測期間ダミーをつくる
gen t1 = 0
replace t1 = 1 if t==1
gen t2 = 0
replace t2 = 1 if t==2
gen t3 = 0
replace t3 = 1 if t==3
gen t4 = 0
replace t4 = 1 if t==4
gen t5 = 0
replace t5 = 1 if t==5
gen t6 = 0
replace t6 = 1 if t==6
gen t7 = 0
replace t7 = 1 if t==7
gen t8 = 0
replace t8 = 1 if t==8
gen t9 = 0
replace t9 = 1 if t==9
gen t10_14 = 0
replace t10_14 = 1 if t>=10 & t<=14
gen t15_19 = 0
replace t15_19 = 1 if t>=15 & t<=19
gen t20_26 = 0
replace t20_26 = 1 if t>=20 & t<=26

/*
forvalues i = 1/26 {
gen t`i’=t
replace t`i’=1 if t`i’==t
replace t`i’=0 if t`i’~=t
}

forvalues i = 1/26 {
drop t`i’
}
*/

logit event t2 t3 t4 t5 t6 t7 t8 t9 t10_14 t15_19 t20_26 ///
male_dummy age dobyear siblings household_income_rich household_income_poor urban_scale

// 離散時間ロジットモデル
logit event t2 t3 t4 t5 t6 t7 t8 t9 t10_14 t15_19 t20_26 ///
leaving_home_reason_school leaving_home_reason_marriage male_dummy age dobyear siblings household_income_rich household_income_poor urban_scale