* Sam Harper & Jay Kaufman May 2013 program drop _all program define hetero_lin version 12.1 args rd1 lcl1 ucl1 rd2 lcl2 ucl2 *first RD disp as text "First RD (95% CI): " as result %4.2f `rd1' " (" /// %4.2f `lcl1' ", " %4.2f `ucl1' ")" *second RD disp as text "Second RD (95% CI): " as result %4.2f `rd2' " (" /// %4.2f `lcl2' ", " %4.2f `ucl2' ")" *variances local var1 = (((`ucl1')-(`rd1'))/invnormal(0.975))^2 local var2 = (((`ucl2')-(`rd2'))/invnormal(0.975))^2 * pooled estimate local num_pool = (((`rd1')/`var1') + ((`rd2')/`var2')) local denom_pool = ((1/`var1') + (1/`var2')) local pooled = `num_pool' / `denom_pool' disp as text "Pooled RD= ", as result %4.2f (`pooled') * cochran's Q local q = ((((`rd1')-`pooled')^2)/`var1') + ((((`rd2')-`pooled')^2)/`var2') disp as text "Cochran's Q = ", as result %4.2f `q' as text " p-value = ", /// as result %5.4f chi2tail(1, `q') * altman disp " " disp " " disp as text "Altman test for interaction" disp " " local drd = (`rd1') - (`rd2') disp as text "Diff in RDs: ", as result %5.3f `drd' local serd1 = ((`lcl1') - (`ucl1')) / (2*invnormal(0.975)) local serd2 = ((`lcl2') - (`ucl2')) / (2*invnormal(0.975)) local se_drd = sqrt((`serd1'*`serd1' + `serd2'*`serd2')) disp as text "95% CI for diff: " as result "(" %4.3f `drd'-(invnormal(0.975)*`se_drd') ", " /// %4.3f `drd'+(invnormal(0.975)*`se_drd') ")" disp as text "Test of interaction: " as result "z = " %5.3f `drd'/`se_drd' /// " p = " %5.4f 2*(1-(normal(abs(`drd'/`se_drd')))) end