program define apctlagb, rclass     
    version 11.0      
      
syntax varlist(numeric ts) [fw aw pw iw] [if] [in], ///     
    [age(varname numeric) period(varname numeric) ///      
      offset(varname numeric) exposure(varname numeric) *]     
    
        
 marksample touse                          
    markout `touse' `age' `period' `offset' `exposure'                          
 tempname bic0  bic1  bicd  bicd0  bicd1 dbic_cohort  dbic_hyster CC HH aar ccr ppr                           
 tempvar agag pepe gaga aaa ccc coco coh end  ppp y tempa tempy tempg coeffcoh hystecoh hyst1 w2 diffea cn rgap valgap gapone gapzero ga1 ga0 alpha omega rescaage rescacoh rescaper                       
 qui {                          
       
 local varnam ""       
     
* apctlag version 1.1 / Nov 10 2016    
* this ado file quotes fractions of the Yang & colleagues apc_ie.ado (ssc install apc)      
       
di ""     
di ""     
di ""     
di ""     
di ""     
di ""     
di ""     
di ""     
di ""     
di ""     
di "************************"      
di "* apctlag version 1.1  *"      
di "************************"      
di ""     
     
     
local expb = subinstr("`exp'","=","",.)     
local expc : word count `expb'      
if (`expc'==0) {     
quietly: gen `w2'= 1     
}     
else {     
quietly: gen `w2'= `expb'     
}     
local lc : word count `varlist'     
forvalues i = 1(1)`lc' {      
local nomy`i' : word `i' of `varlist'     
   }     
local control ""    
local cntnam ""     
local nam ""    
forvalues i = 2/`lc' {      
local toto `nomy`i''     
local control "`control' `toto'"     
local nam = "`nomy`i''"    
local cntnam "`cntnam' `nam'"    
   }     
     
*quietly: gen `y' = `nomy1'   if `touse'     
quietly: gen `aaa' = `age'   if `touse'     
quietly: gen `ppp' = `period'   if `touse'     
     
     
     
quietly: tostring `aaa' `ppp'  , generate(`tempa' `tempy')     
quietly: encode `tempa'  if `touse', gen(`agag')     
quietly: encode `tempy'  if `touse', gen(`pepe')     
*drop `temp*'     
     
quietly: su `agag'     
local maag=int(r(max))     
quietly: su `pepe'     
local mape=int(r(max))     
quietly: gen `ccc' = `period' -`age'   if `touse'     
quietly: su `ccc' if `touse'     
     
quietly: gen `coco' = `pepe'-`agag'+`maag'     
quietly: su `coco'     
local maco=int(r(max))     
     
*tab `aaa' `ppp', su(`ccc') nofreq nost w     
     
quietly: su `agag' [fw=`w2']     
quietly: gen `rescaage' =2*(`agag'-r(min))/(r(max)-r(min))-1     
quietly: gen `rescaper' =(`pepe')/(r(max)-r(min))     
quietly: gen `rescacoh' =(`coco')/(r(max)-r(min))     
quietly: su `rescaper' [fw=`w2']     
quietly: replace `rescaper' =`rescaper'-(r(max)+r(min))/2     
quietly: su `rescacoh'  [fw=`w2']     
quietly: replace `rescacoh'  =`rescacoh' -(r(max)+r(min))/2     
     
quietly: replace `rescaage' =`rescaage' +runiform()*.001-.0005     
quietly: replace `rescacoh' =`rescacoh' +runiform()*.001-.0005     
quietly: replace `rescaper' =`rescaper' +runiform()*.001-.0005     
     
quietly tab `aaa' if `touse', matrow(`aar')     
quietly tab `ppp' if `touse', matrow(`ppr')     
quietly tab `ccc' if `touse', matrow(`ccr')     
local pace = `aar'[2,1]-`aar'[1,1]    
    
      
 forvalues i = 1(1)`maco' {                           
 tempvar cc`i'                        
  qui: gen `cc`i''= (`i'==`coco' )+runiform()*.001-.0005  if `touse'                          
  local ccrr=`ccr'[`i',1]     
  tempvar coh_`ccrr'     
  gen `coh_`ccrr''= `cc`i''  if `touse'      
   if `i'>1 & `i'<`maco' local varnam "`varnam' coh_`ccrr'"     
  }                          
       
 forvalues i = 1(1)`maag' {                           
 tempvar aa`i'                           
  noi: gen `aa`i''= (`i'==`agag')+runiform()*.001-.0005       
  su `aa`i''    
  local aarr=`aar'[`i',1]        
  tempvar age_00`aarr'     
  gen `age_00`aarr'' = `aa`i''    if `touse'        
  local varnam "`varnam' age_00`aarr'"     
       
  }                          
       
 forvalues i = 1(1)`mape' {                          
 tempvar pp`i'                           
  qui: gen `pp`i''= (`i'==`pepe')+runiform()*.001-.0005                          
  local pprr=`ppr'[`i',1]    
  tempvar  per_`pprr'    
  gen `per_`pprr''= `pp`i''    if `touse'        
  local varnam "`varnam' per_`pprr'"     
  }                          
      
     
    
         
 preserve     
 collapse `nomy1'  if `touse' , by(`aaa'  `ppp'  )     
 gen `cn' =`ppp' - `aaa'       
 xtset `cn' `ppp'       
 gen `diffea'=`nomy1'-L`pace'.`nomy1'     
 noi su `diffea'     
 local effage =r(mean)     
     
     
 noi di "age effect =   " `effage'     
 restore     
       
        
       
 local consg1 "0"                          
 local consg2 "0"                          
 local listcoh ""                          
 local macob=int(`maco'-1)                          
 forvalues i=2(1)`macob' {                          
 local j=int(-`maco'-1+`i'*2)                          
 local k=`ccr'[`i',1]                          
   local consg1 "`consg1'+`coh_`k''"                          
   local consg2 "`consg2'+(`j')*`coh_`k''"                          
 local listcoh "`listcoh' `coh_`k''"                          
   }                          
 local consg1 "`consg1'=0"                          
 local consg2 "`consg2'=0"                          
        
        
 local consg3 "0"                          
 local consg4 "0"                          
 local rap= 0     
 local listage ""                                              
 forvalues i=1(1)`maag' {                          
 local j=int(-`maag'-1+`i'*2)                          
 local k=`aar'[`i',1]                          
   local consg3 "`consg3'+`age_00`k''"       
   local consg4 "`consg4'+(`j')*`age_00`k''"      
   local listage "`listage' `age_00`k''"                          
   local rap = `rap'+1/2*`j'*`j'                          
  }                          
       
 local consg3 "`consg3'=0"     
 local cosi=   `rap'*`effage'                      
 local consg4 "`consg4' = `cosi' "                          
       
       
       
       
 local consg5 "0"                          
 local consg6 "0"    
 local listper ""                          
 forvalues i=1(1)`mape' {                          
 local j=int(-`mape'-1+`i'*2)                          
 local k=`ppr'[`i',1]                          
   local consg5 "`consg5'+`per_`k''"                          
   local consg6 "`consg6'+(`j')*`per_`k''"       
   local listper "`listper' `per_`k''"                          
    
   }                          
 local consg5 "`consg5'=0"                          
 local consg6 "`consg6'=0"                          
       
     
     
 quietly: compress     
 constraint 1  `consg1'     
 constraint 2  `consg2'     
 constraint 3  `consg3'     
 constraint 4  `consg4'     
 constraint 5  `consg5'     
 constraint 6  `consg6'     
     
di ""     
di "********************************************************************************"     
di "#######      APCTLAG = APC with cohort Trend based on lagged age effect ########"     
di "********************************************************************************"     
di ""     
glm  `nomy1' `listcoh' `listage' `listper'  `control'   `in' [`weight' `exp'] if `coco'!=1 & `coco'<`maco' & `touse', ///     
`options'  constraints ( 3 4 5 6)  nocons     
*predict predictedapcd, xb      
*predict residuedevapcd, deviance      
*drop alpha-omega     
     
di "*******************************************"     
di ""                          
 }      
     
 mat def V=e(b)    
     
 mat def A=V'    
     
 local varnam "`varnam' `cntnam'"    
 matrix coln A="`nomy1'"    
 matrix rown A= :    
 matrix roweq A= " "    
 local line=""    
 local rn ""    
 local lines=rowsof(A)    
 local cols=colsof(A)    
 local title " Variable:   "    
 local kav "   "    
 local names : colnames A    
 foreach v of local names {    
 local title "`title' `v'"    
 local kav "`kav'______________________"    
 }    
 di "`kav'"    
 di "`title'"    
 di "`kav'"    
 forvalues i=1(1)`lines' {    
 local line1 : word `i' of `varnam'    
 local line "    `line1'"    
 local rn "`rn' `line1'"    
 forvalues j=1(1)`cols' {    
 local b=round(A[`i',`j'],0.0005)    
     
 local c=string(`b',"%12.3f")    
    
 local line "`line' `c'"    
 }    
 di "`line'"    
 local line ""    
 }    
 di "`kav'"    
 matrix rown A=`rn'    
 return matrix table=A    
 end