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.

496 lines
12 KiB
Plaintext

* version 1.0.5 23set2004 MER version 8.0
capture program drop kapci
program define kapci, rclass byable(recall)
version 8.0
if "`1'" == "" {
di _n in gr " Syntax is:" _n
di in wh " kapci " in gr "[varlist] [if] [in] , [ " _c
di in wh "est" in gr "im(" in wh "an bc p n bsall" in gr ") "
di in wh _col(22) "w" in gr "gt" _c
di in gr "(" in wh "w w2 any_wgt" in gr ") " _c
di in wh "r" in gr "eps(" in wh "#" in gr ") " _c
di in wh "si" in gr "ze(" in wh "#" in gr ") "
di in wh _col(22) "se" in gr "ed(" in wh "#" in gr ") " _c
di in wh "ev" in gr "ery(" in wh "#" in gr ") " _c
di in wh "le" in gr "vel(" in wh "#" in gr ") " _c
di in wh "t" in gr "ab " in wh "w" in gr "ide"
di in wh _col(22) "sa" in gr "ving(" in wh "filename" in gr ") " _c
di in wh "replace nom" in gr "sg ]"
exit
}
* Setup
version 8
syntax varlist [if] [in] [ , Reps(numlist) SIze(numlist) SEed(numlist) ///
EVery(numlist) Wgt(str) ESTim(str) Level(integer $S_level) ///
SAving(str) REPLACE Tab WIDE NOMsg ]
if "`options'" ~= "" {
local options = ", `options'"
}
tokenize "`varlist'"
marksample touse
preserve
if "`if'"!="" {
keep `if'
}
if ("`in'"!="") {
keep `in'
}
* Level value, etc.
global zsc = invnorm(1-(1-`level'/100)/2)
global N = _N
* Checking if estim=an is compatible with data
qui inspect `1'
local numlev `r(N_unique)'
local nummeas : word count `varlist'
if `numlev' < 3 & `nummeas' < 3 {
local bs 0
}
else local bs 1
if "`estim'" == "an" & `bs' == 1 {
di in gr " "
di in gr "Note: Option " in wh "estim(an) " in gr "is only suitable for 2x2 data."
di in wh " bs " in gr " will be used."
}
* Defaults
if ("`estim'" == "") & (`bs' == 0) {
local estim "an"
}
if ("`estim'" == "") & (`bs' == 1) {
local estim "bc"
}
*************************************
* Displaying table if it is requested
*************************************
if "`wide'" ~= "" {
local wide_str ", wrap"
}
if "`wide'" == "" {
local wide_str ""
}
if ("`tab'" ~= "") & (`nummeas' < 3) {
tab `varlist' if `touse' `wide_str'
}
if ("`tab'" ~= "") & (`nummeas' >= 3) {
tab2 `varlist'if `touse' `wide_str'
}
****************************************************
* Calculating analytical CI for kappa when estim=an
****************************************************
if (`bs' == 0) & ("`estim'" == "an") { /* Start of no bs situation */
* First ... extracting effective sample size used (noting byable!)
qui summ `varlist' if `touse'
local N = `r(N)'
* Call kappa and get midpoints
qui kap `varlist' if `touse' `options'
* Saving scalars from kap as locals for return list
local prop_e = r(prop_e)
local prop_o = r(prop_o)
* Working macro ...
local k = r(kappa)
* Extract table data
tempname tab2x2 a b c d agrN
qui tab2 `varlist' , matcell(`tab2x2')
scalar `a'=`tab2x2'[1,1]
scalar `b'=`tab2x2'[1,2]
scalar `c'=`tab2x2'[2,1]
scalar `d'=`tab2x2'[2,2]
scalar `agrN'=`a'+`b'+`c'+`d'
* Locals - marginals
local p1 = (`a'+`b')/`agrN'
local p2 = (`a'+`c')/`agrN'
* Quantity Q based on Fleiss, (1981), equations 13.15 - 13.18
local Q = ( ( ( (-1 + `k' ) * ( (-2*`k' *`p1' ) + /*
*/ ((`k' ^2)*`p1' ) + (4*`k' *(`p1'^2)) - /*
*/ (2*(`k'^2)*(`p1'^2)) - (2*`k' *`p2' ) + /*
*/ ((`k'^2)*`p2' ) - (4*`p1' *`p2' ) + /*
*/ (8*`k' *`p1' *`p2' ) - (6*(`k'^2)*`p1' *`p2' ) + /*
*/ (4*(`p1'^2)*`p2' ) - (12*`k' *(`p1'^2)*`p2' ) + /*
*/ (8*(`k'^2)*(`p1'^2)*`p2' ) + (4*`k' *(`p2'^2)) - /*
*/ (2*(`k'^2)*(`p2'^2)) + (4*`p1' *(`p2'^2)) - /*
*/ (12*`k' *`p1' *(`p2'^2)) + /*
*/ (8*(`k'^2)*`p1' *(`p2'^2)) - /*
*/ (4*(`p1'^2)*(`p2'^2)) + /*
*/ (12*`k' *(`p1'^2)*(`p2'^2)) - /*
*/ (8*(`k'^2)*(`p1'^2)*(`p2'^2))) /*
*/ ) / ( (`p1' + `p2' - (2*`p1' *`p2' ) )^2 ) ) )
* Standard error, given kappa estimate k_hat=`k'
local sek = (sqrt(`Q')) / (sqrt(`agrN') )
* CI
local klow = `k'-($zsc*`sek')
local kup = `k'+($zsc*`sek')
if `kup' >= 1 {
local kup = 1
}
if `klow' < -1 {
local klow = -1
}
* Display
local type "analytical "
local typeab "A"
di _n in gr _col(42) "N=" `N'
di in gr "{hline 48}"
di in gr " Kappa (" %2.0f `level' "% CI) = " in ye %5.3f `k' _c
di in gr _col(24) " (" in ye %5.3f `klow' in gr " - " in ye %5.3f `kup' in gr ")" _c
di in gr _col(44) "(" "`typeab'" ")"
di in gr "{hline 48}"
di in gr _col(2) "`typeab'" " = " "`type'"
* Return list
return scalar N = `agrN'
return scalar z = $zsc
return scalar se = `sek'
return scalar prop_o = `prop_o'
return scalar prop_e = `prop_e'
return scalar ub_an = `kup'
return scalar lb_an = `klow'
return scalar kappa = `k'
} /* End of no bs situation */
*****************************************************
* Calculating analytical CI for kappa when estim!=an
*****************************************************
if (`bs' == 1) | ((`bs' == 0) & ("`estim'" ~= "an")) { /* Start of bs situation */
if "`estim'" ~= "an" {
if "`estim'" ~= "" {
if "`estim'" ~= "bc" {
if "`estim'" ~= "n" {
if "`estim'" ~= "p" {
if "`estim'" ~= "bsall" {
local estim "bc"
di in bl " "
di in bl "Note: Unknown bs CI type specified."
di in wh " bc " in gr "will be used."
}
}
}
}
}
}
if "`estim'" == "an" {
local estim "bc"
}
* Preparing ...
tempfile mainfile
qui save `mainfile', replace
qui use `mainfile', clear
tempfile tmpsave0 tmpsave1
local byindex = _byindex()
*----------------------------------------------------------------------------
if ("`saving'" ~= "") & (_by()==1) {
local sa_str "saving(`tmpsave1')"
}
if ("`saving'" ~= "") & (_by()==0) {
local sa_str "saving(`tmpsave0')"
}
if "`saving'" == "" & (_by()==0) {
local sa_str ""
}
*----------------------------------------------------------------------------
if "`wgt'" ~= "" {
local wgt_str "wgt(`wgt')"
}
local n : word count `varlist'
if `n' > 2 & "`wgt'" ~= "" {
di _n in gr "Note: wgt() not allowed if varlist > 2. Option ignored."
local wgt_str ""
}
if "`wgt'" == "" {
local wgt_str ""
}
*----------------------------------------------------------------------------
if "`reps'" ~= "" {
local reps_str "reps(`reps')"
}
if "`reps'" == "" {
local reps_str "reps(5)"
local reps 5
di _n in gr "Note: default number of bootstrap replications " _c
di in gr "has been
di in gr " set to " in wh "5 " in gr "for syntax testing only." _c
di in wh "reps() " in gr "needs to "
di in gr " be increased when analysing real data." _n
}
*----------------------------------------------------------------------------
if "`seed'" ~= "" {
set seed `seed'
local seed_str "seed(`seed')"
}
*----------------------------------------------------------------------------
if "`size'" ~= "" {
if `size' < 5 {
di in gr "Note: size() set to N"
local size $N
}
local size_str "size(`size')"
}
if "`size'" == "" {
local size_str ""
local size $N
}
*----------------------------------------------------------------------------
if "`every'" ~= "" {
local every_str "every(`every')"
}
if "`every'" == "" {
local every_str ""
}
*----------------------------------------------------------------------------
if _by()==0 {
local first "kap `varlist' , `wgt_str'"
}
if _by()==1 {
local first "kap `varlist' if `touse' , `wgt_str'"
}
* Calling bs
if `reps' > 100 & "`nomsg'" == "" {
di _n in gr "This may take quite a long time. Please wait ..."
}
qui bs " `first' " r(kappa), `reps_str' `sa_str' level(`level') `size_str' `every_str' nowarn
if ("`saving'" ~= "") & (_by()==0) {
qui use `tmpsave0'
qui label data "kapci: varlist is `varlist'"
qui rename _bs_1 _kapci_bs
label var _kapci_bs "Options: `wgt_str' `reps_str' `seed_str' `size_str' `every_str'"
qui save `saving', `replace'
restore
}
if ("`saving'" ~= "") & (_by()==1) {
qui use `tmpsave1'
qui label data "kapci: varlist is `varlist'; byvars is `_byvars'; by-group is (`byindex')"
qui rename _bs_1 _kapci_bs__`byindex'
label var _kapci_bs__`byindex' "Options: `wgt_str' `reps_str' `seed_str' `size_str' `every_str'"
qui save `saving'`byindex', `replace'
restore
}
* Extracting sample size used (noting byable !)
qui summ `varlist' if `touse'
local N = `r(N)'
* Matrix extraction
matrix tmp_mtx = e(b)
local k = tmp_mtx[1,1]
matrix tmp_mtx = e(ci_bc)
local klow_bc = tmp_mtx[1,1]
local kup_bc = tmp_mtx[2,1]
matrix tmp_mtx = e(ci_percentile)
local klow_p = tmp_mtx[1,1]
local kup_p = tmp_mtx[2,1]
matrix tmp_mtx = e(ci_normal)
local klow_n = tmp_mtx[1,1]
local kup_n = tmp_mtx[2,1]
matrix tmp_mtx = e(reps)
local numreps = tmp_mtx[1,1]
matrix tmp_mtx = e(bias)
local bias = tmp_mtx[1,1]
matrix tmp_mtx = e(se)
local se = tmp_mtx[1,1]
matrix drop tmp_mtx
* Display
local dotdot "{hline 48}"
local col1 "_col(34)"
local col2 "_col(43)"
if "`estim'" ~= "bsall" {
if "`estim'" == "bc" {
local klow = `klow_bc'
local kup = `kup_bc'
}
if "`estim'" == "n" {
local klow = `klow_n'
local kup = `kup_n'
}
if "`estim'" == "p" {
local klow = `klow_p'
local kup = `kup_p'
}
if (`kup' >= 1) & (`kup' ~= .) {
local kup = 1
}
if (`klow' < -1) & (`klow' ~= .) {
local klow = -1
}
if "`estim'" == "bc" {
local type "bias corrected "
local typeab "BC"
}
if "`estim'" == "n" {
local type "normal "
local typeab "N"
}
if "`estim'" == "p" {
local type "percentile "
local typeab "P"
}
di _n in gr _col(34) "B=" `numreps' _col(42) "N=" `N'
di in gr "{hline 48}"
di in gr " Kappa (" %2.0f `level' "% CI) = " in ye %5.3f `k' _c
di in gr _col(24) " (" in ye %5.3f `klow' in gr " - " in ye %5.3f `kup' in gr ")" _c
di in gr _col(44) "(" "`typeab'" ")"
di in gr "{hline 48}"
di in gr _col(2) "`typeab'" " = " "`type'"
}
if "`estim'" == "bsall" {
if `kup_n' >= 1 {
local kup_n = 1
}
if `klow_n' < -1 {
local klow_n = -1
}
local type1 "bias corrected"
local typeab1 "BC"
local type2 "percentile"
local typeab2 "P"
local type3 "normal"
local typeab3 "N"
di _n in gr _col(34) "B=" `numreps' _col(42) "N=" `N'
di in gr "{hline 48}"
di in gr " Kappa (" %2.0f `level' "% CI) = " in ye %5.3f `k' _c
di in gr _col(24) " (" in ye %5.3f `klow_bc' in gr " - " in ye %5.3f `kup_bc' in gr ")" _c
di in gr _col(44) "(" "`typeab1'" ")"
di in gr _col(24) " (" in ye %5.3f `klow_p' in gr " - " in ye %5.3f `kup_p' in gr ")" _c
di in gr _col(44) "(" "`typeab2'" ")"
di in gr _col(24) " (" in ye %5.3f `klow_n' in gr " - " in ye %5.3f `kup_n' in gr ")" _c
di in gr _col(44) "(" "`typeab3'" ")"
di in gr "{hline 48}"
di in gr _col(2) "`typeab1'" " = " "`type1'" ", " _c
di in gr "`typeab2'" " = " "`type2'" ", " _c
di in gr "`typeab3'" " = " "`type3'"
}
* Return list
return scalar N_bs = `size'
return scalar N = $N
return scalar z = $zsc
return scalar reps = `numreps'
return scalar bias = `bias'
return scalar se = `se'
return scalar lb_n = `klow_n'
return scalar ub_n = `kup_n'
return scalar lb_p = `klow_p'
return scalar ub_p = `kup_p'
return scalar lb_bc = `klow_bc'
return scalar ub_bc = `kup_bc'
return scalar kappa = `k'
} /* End of no bs situation */
* Cleaning up
macro drop zsc
macro drop N
end