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
147 lines
5.5 KiB
Plaintext
9 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
|