*! version 1.0.0 DH 29Sep2004. program define kapssi, rclass version 8.0 syntax anything(name=k id="kappa") , P1(real) /* */ [ p2(real -1) m(integer 2) Se(real -1) Diff(real -1) /* */ Level(real $S_level) n(integer -1) round ] confirm number `k' if `k'<0 | `k'>1 { disp as error "kappa must be between 0 and 1" exit 198 } confirm number `p1' if `p1'<=0 | `p1'>=1 { disp as error "p1 must be between 0 and 1" exit 198 } if `m'<2 { disp as error "m must be at least 2" exit 198 } local nopts=(`se'==-1)+(`diff'==-1)+(`n'==-1) if `nopts'==3 { disp as error "one of se, diff and n must be specified" exit 198 } if `nopts'<2 { disp as error "only one of se, diff and n may be specified" exit 198 } if "`round'"=="" { local round "ceil" } if `m'==2 { // two raters if `p2'==-1 { local p2 `p1' } if `p2'<=0 | `p2'>=1 { disp as error "p2 must be between 0 and 1" exit 198 } if `n'==-1 { // calculate sample size if `se'==-1 { if `diff'<=0 { disp as error "diff must be greater than 0" exit 198 } if `level'<10 | `level'>99 { disp as error "level must be between 10 and 99" exit 198 } local se=`diff'/invnorm((100+`level')/200) } if `se'<=0 { disp as error "se must be greater than 0" exit 198 } local n=`round'((1-`k')*(4*`p1'*`p2'*(1-`p1')*(1-`p2')*(1+`k')+(1-2*`p1')*(1-2*`p2')*(`p1'*(1-`p2')+`p2'*(1-`p1'))*`k'*(2-`k'))/((`se'*(`p1'*(1-`p2')+`p2'*(1-`p1')))^2)) disp as text _n "Estimated sample size for kappa to achieve given standard error" disp as text _n "Assumptions:" _n(2) /* */ _col(10) "kappa = " as result %8.4f `k' _n /* */ as text _col(14) "m = " as result %8.0f `m' as text " (number of raters)" _n /* */ _col(13) "p1 = " as result %8.4f `p1' as text " (rater 1 proportion of positive ratings)" _n /* */ _col(13) "p2 = " as result %8.4f `p2' as text " (rater 2 proportion of positive ratings)" if `diff'!=-1 { disp as text _col(11) "diff = " as result %8.4f `diff' /* */ as text " (half width of confidence interval)" _n /* */ _col(10) "alpha = " as result %8.4f (100-`level')/100 } disp as text _col(13) "se = " as result %8.4f `se' disp as text _n "Estimated required sample size:" _n(2) /* */ _col(14) "n = " as result %8.0f `n' } else { // calculate standard error if `n'<=0 { disp as error "n must be greater than 0" exit 198 } local se=sqrt((1-`k')*(4*`p1'*`p2'*(1-`p1')*(1-`p2')*(1+`k')+(1-2*`p1')*(1-2*`p2')*(`p1'*(1-`p2')+`p2'*(1-`p1'))*`k'*(2-`k')))/(`n'*(`p1'*(1-`p2')+`p2'*(1-`p1'))) disp _n as text "Estimated standard error for kappa from given sample size" disp _n as text "Assumptions:" _n(2) /* */ _col(10) "kappa = " as result %8.4f `k' _n /* */ as text _col(14) "m = " as result %8.0f `m' as text " (number of raters)" _n /* */ _col(13) "p1 = " as result %8.4f `p1' as text " (rater 1 proportion of positive ratings)" _n /* */ _col(13) "p2 = " as result %8.4f `p2' as text " (rater 2 proportion of positive ratings)" _n /* */ _col(14) "n = " as result %8.0f `n' disp as text _n "Estimated standard error:" _n(2) /* */ _col(13) "se = " as result %8.4f `se' } } else { // more than 2 raters if `p2'!=-1 { disp as error "p2 may not be specified for more than 2 raters" exit 198 } local p `p1' if `n'==-1 { // calculate sample size if `se'==-1 { if `diff'<=0 { disp as error "diff must be greater than 0" exit 198 } if `level'<10 | `level'>99 { disp as error "level must be between 10 and 99" exit 198 } local se=`diff'/invnorm((100+`level')/200) } if `se'<=0 { disp as error "se must be greater than 0" exit 198 } local n=`round'((1-`k')*(2/(`m'*(`m'-1))-(3-1/(`p'*(1-`p')))*`k'+(`m'-1)*(4-1/(`p'*(1-`p')))*(`k'^2)/`m')/(`se'^2)) disp as text _n "Estimated sample size for kappa to achieve given standard error" disp as text _n "Assumptions:" _n(2) /* */ _col(10) "kappa = " as result %8.4f `k' _n /* */ as text _col(14) "m = " as result %8.0f `m' as text " (number of raters)" _n /* */ _col(14) "p = " as result %8.4f `p' as text " (overall proportion of positive ratings)" if `diff'!=-1 { disp as text _col(11) "diff = " as result %8.4f `diff' /* */ as text " (half width of confidence interval)" _n /* */ _col(10) "alpha = " as result %8.4f (100-`level')/100 } disp as text _col(13) "se = " as result %8.4f `se' disp as text _n "Estimated required sample size:" _n(2) /* */ _col(14) "n = " as result %8.0f `n' } else { // calculate standard error if `n'<=0 { disp as error "n must be greater than 0" exit 198 } local se=sqrt((1-`k')*(2/(`m'*(`m'-1))-(3-1/(`p'*(1-`p')))*`k'+(`m'-1)*(4-1/(`p'*(1-`p')))*(`k'^2)/`m')/`n') disp _n as text "Estimated standard error for kappa from given sample size" disp _n as text "Assumptions:" _n(2) /* */ _col(10) "kappa = " as result %8.4f `k' _n /* */ as text _col(14) "m = " as result %8.0f `m' as text " (number of raters)" _n /* */ _col(14) "p = " as result %8.4f `p' as text " (overall proportion of positive ratings)" _n /* */ _col(14) "n = " as result %8.0f `n' disp as text _n "Estimated standard error:" _n(2) /* */ _col(13) "se = " as result %8.4f `se' } } return scalar se=`se' return scalar N=`n' end