*! (STB-57: sbe40) program define leecart,rclass version 6 syntax varlist(min=3 max=3) [if] [in] tokenize `varlist' local y `1' local a `2' local mort `3' tempvar touse mark `touse' `if' `in' qui keep if `touse' set matsize 600 quietly { summarize `mort' if r(M) == 0 { noisily error 2000} if r(min) == 0 { di in red `"Mortality is zero"' exit 499 } return clear gen lm=log(`mort') keep `y' `a' lm sort `a' `y' by `a': gen j=_n by `a': gen N=_N sort `y' `a' by `y': gen i=_n by `y': gen M=_N summarize M if r(M) == 0 { noisily error 2000} if r(min) != r(max) { di in red `"Unequal Observations in Age Groups"' exit 499 } local m `r(max)' return clear summarize N if r(N) == 0 { noisily error 2000} if r(min) != r(max) { di in red `"Unequal Observations in Year Groups"' exit 499 } local n `r(max)' return clear sort `a' `y' drop `y' `a' } local lm1 "lm1" local lmc "lm`n'" local a1 "a1" local ac "a`n'" local clist "1..`n'" local rlist "1..`m'" quietly { reshape wide lm, i(i) j(j) egen a=rmean(`lm1'-`lmc') for new `a1'-`ac':gen X = a } mkmat a, matrix(ax) mkmat `lm1'-`lmc',matrix(lm) mkmat `a1'-`ac',matrix(a) mat resid=lm-a if (`m'>=`n') { mat svd U w V = resid mat u = U[`rlist',1] svmat double u, name(u1) egen const1=sum(u1) scalar const2=1/const1 mat bx=u*const2 mat v=V[`clist',1] mat d = w[1,1] mat kt = (d*v)/const2 mat lmhat=a+bx*kt' } else { mat resid1=resid' mat svd U w V = resid1 mat u = V[1,`rlist']' svmat double u, name(u1) egen const1=sum(u1) scalar const2=1/const1 mat bx=u*const2 mat v=U[`clist',1]' mat d = w[1,1] mat kt = (d*v)/const2 mat lmhat=a+bx*kt mat kt = kt' mat drop resid1 } mat mhat = J(`m',`n',0) local p=1 while `p'<=`m' { local q=1 while `q'<=`n' { mat mhat[`p',`q']=exp(lmhat[`p',`q']) local q=`q'+1 } local p=`p'+1 } local arname "" local brname "" local agename "" local krname "" local tcname "" local i 1 local j 1 while `i'<=`m' { local arname "`arname' a`i'" local brname "`brname' b`i'" local agename "`agename' age`i'" local i=`i'+1 } while `j'<=`n' { local krname "`krname' k`j'" local tcname "`tcname' t`j'" local j=`j'+1 } mat rownames ax = `arname' mat colnames ax = ax mat rownames bx = `brname' mat colnames bx = bx mat rownames kt = `krname' mat colnames kt = kt mat rownames mhat = `agename' mat colnames mhat = `tcname' mat drop d w v u U V a resid lm lmhat *save results return matrix ax ax return matrix bx bx return matrix kt kt return matrix mhat mhat end