You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
5.5 KiB
Plaintext

7 months ago
*! version 17feb09
program define icc23, rclass
version 9
syntax varlist(min=3 max=3) [if] [, MOdel(integer 2) LEvel(real .95)]
tokenize "`varlist'"
marksample touse
local dv `1'
local rater `2'
local id `3'
capture assert `model'==2 |`model'==3
if _rc~=0 {
di
di in re "The ICC model must be specified as either 2 or 3"
exit 198
}
capture assert `level'>0 & `level'<1.0
if _rc~=0 {
di
di in re "The CI level must be a value between 0 and 1.0"
exit 198
}
qui anova `dv' `rater' `id' `if', repeated(`rater')
local f1 e(F_1)
local ss2 e(ss_2)
local df2 e(df_2)
local rss e(rss)
local dfr e(df_r)
local df1 e(df_1)
local ss1 e(ss_1)
local n e(N_bse) /* the number of subjects tested */
local k = `df1'+1 /* the number of raters */
*Compute F-test for rater
local p_rater=Ftail(`df1',`dfr',`f1')
*Compute components of ICC
local bms = `ss2'/`df2'
local ems = `rss'/`dfr'
local jms = `ss1'/`df1'
local Fj = `jms'/`ems'
local alpha2 =1-((1-`level')/2)
local cilevel = `level'*100
if `model' == 2 {
*Compute ICC Model 2 for single observations (ICC21) and for means (ICC2k)
local num21 = `bms'-`ems'
local dentmp = (`k'*(`jms'-`ems'))/`n' /* the ratio within the denominator */
local den21 = `bms'+(`k'-1)*`ems'+`dentmp'
local icc21 = `num21'/`den21'
*Compute ICC21 confidence intervals (values will be used for ICC2k confidence intervals)
local nu_num21 = (`k'-1)*(`n'-1)*(`k'*`icc21'*`Fj'+`n'*(1+(`k'-1)*`icc21')-`k'*`icc21')^2
local nu_den21 = (`n'-1)*(`k'^2)*((`icc21')^2)*((`Fj')^2)+(`n'*(1+(`k'-1)*`icc21')-`k'*`icc21')^2
local nu21 = `nu_num21'/`nu_den21'
local Fsuper = invF(`df2',`nu21',`alpha2')
local Fsub = invF(`nu21',`df2',`alpha2')
local cilower = (`n'*(`bms'-`Fsuper'*`ems'))/(`Fsuper'*(`k'*`jms'+(`k'*`n'-`k'-`n')*`ems')+`n'*`bms')
local ciupper = (`n'*(`Fsub'*`bms'-`ems'))/(`k'*`jms'+(`k'*`n'-`k'-`n')*`ems'+`n'*`Fsub'*`bms')
*Compute ICC2k and its confidence intervals
local num2k = `bms'-`ems'
local dentmp1 = (`jms'-`ems')/`n' /* the ratio within the denominator */
local den2k = `bms'+`dentmp1'
local icc2k = `num2k'/`den2k'
local cilowerK = (`k'*`cilower')/(1+(`k'-1)*`cilower')
local ciupperK = (`k'*`ciupper')/(1+(`k'-1)*`ciupper')
di
di in gr " **************************************************************************"
di in ye " Two-Way Random Effects Models: ICC[2,1] and ICC[2,k]"
di in gr " **************************************************************************"
di
di in gr " The total number of subjects is: " in ye %3.0f `n'
di in gr " The total number of raters is: " in ye %3.0f `k'
di
di in gr " Reliability of observations: ICC[2,1] = " in ye %4.3f `icc21' ", (" `cilevel' "% CI: " %5.3f `cilower' ", " %5.3f `ciupper' ")"
di
di in gr " Reliability of the mean: ICC[2,`k'] = " in ye %4.3f `icc2k' ", (" `cilevel' "% CI: " %5.3f `cilowerK' ", " %5.3f `ciupperK' ")"
di
di in gr " **************************************************************************"
di
if `p_rater' <= .05 {
di in red " Note: There is a significant `rater' effect: p = " %5.4f `p_rater'
}
}
if `model' == 3 {
* Compute ICC31
local num31 = `bms'-`ems'
local den31 = `bms'+(`k'-1)*`ems'
local icc31 = `num31'/`den31'
*Compute ICC Model 3 Confidence Interval (Single Observations)
local fzero = `bms'/`ems'
local fdistL = invF(`n'-1,(`n'-1)*(`k'-1),`alpha2')
local fdistU = invF((`n'-1)*(`k'-1),`n'-1,`alpha2')
local FL = `fzero'/`fdistL'
local FU = `fzero'*`fdistU'
local cilower = (`FL'-1)/(`FL'+(`k'-1))
local ciupper = (`FU'-1)/(`FU'+(`k'-1))
*Compute ICC3k
local num3k = `bms'-`ems'
local den3k = `bms'
local icc3k = `num3k'/`den3k'
*Compute ICC3k confidence intervals
local cilowerK = 1-(1/`FL')
local ciupperK = 1-(1/`FU')
di
di in gr " **************************************************************************"
di in ye " Two-Way Mixed Effects Models: ICC[3,1] and ICC[3,k]"
di in gr " **************************************************************************"
di
di in gr " The total number of subjects is: " in ye %3.0f `n'
di in gr " The total number of raters is: " in ye %3.0f `k'
di
di in gr " Reliability of observations: ICC[3,1] = " in ye %4.3f `icc31' ", (" `cilevel' "% CI: " %5.3f `cilower' ", " %5.3f `ciupper' ")"
di
di in gr " Reliability of the mean: ICC[3,`k'] = " in ye %4.3f `icc3k' ", (" `cilevel' "% CI: " %5.3f `cilowerK' ", " %5.3f `ciupperK' ")"
di
di in gr " **************************************************************************"
di
if `p_rater' <= .05 {
di in red " Note: There is a significant `rater' effect: p = " %5.4f `p_rater'
}
}
end