*! sizefx v1.3 MSOpenshaw 01Apr2010
* Program to calculate Cohen's d & Hedges' g
program define sizefx, rclass byable(recall)
version 10.1

syntax varlist(min=2 max=2 numeric) [if] [in]

*ENSURES N > 0
     marksample touse
     quietly count if `touse'
     if `r(N)' == 0 {
          error 2000
     }
    
*Define temporary variables
local res n1 s1 m1 n2 m2 s2 dfd dfg meandiff numr spd spg dvalue hedgesg d2 es_r
tempname `res'

quietly summarize `1' if `touse'
     scalar `n1' = r(N)
     scalar `m1' = r(mean)
     scalar `s1' = r(Var)

quietly summarize `2' if `touse'
     scalar `n2' = r(N)
     scalar `m2' = r(mean)
     scalar `s2' = r(Var)

*Calculate difference in means
     scalar `meandiff' = abs(`m1'-`m2')

*Calculate pooled variance for Cohen's d and Hedges' g
     scalar `numr' = ((`n1'-1)*`s1') + ((`n2'-1)*`s2')
     scalar `dfd' = `n1'+`n2'
     scalar `dfg' = `n1'+`n2'-2
     scalar `spd' = sqrt(`numr'/`dfd')
     scalar `spg' = sqrt(`numr'/`dfg')

*Calculate the statistics
     scalar `dvalue' = `meandiff'/`spd'
     scalar `hedgesg' = `meandiff'/`spg'

*Calculate effect size (ES) correlation
     scalar `d2' = `dvalue'*`dvalue'
     scalar `es_r' = `dvalue'/(sqrt(`d2'+4))

*Displays Results
di ""
display as result "Cohen's {it:d} and Hedges' {it:g} for: `1' vs. `2'"
di as txt "Cohen's {it:d} statistic (pooled variance) = " `dvalue'
di as txt "Hedges' {it:g} statistic = " `hedgesg'
di ""
di as result "Effect size correlation ({it:r}) for: `1' vs. `2'"
di as txt "ES correlation {it:r} = " `es_r'

     return scalar N = r(N)
     return scalar Cd = `dvalue'
     return scalar Hg = `hedgesg'
     return scalar ESr = `es_r'

end