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.

221 lines
6.2 KiB
Plaintext

7 months ago
*! bagroup.ado written 8/5/1997 by PTS version 1.2.2 (STB-55: sbe33)
*! modified Bland-Altman plots for more than two measures
*! one plot per figure
*!
*! Syntax: bagroup varlist if in, rows avlab difflab <graph options> obs_c
* modified 3/8/1998 to allow for larger symbols if there are repetitions
* modified 7/8/1998 to use all possible pairs, and to allow for ylines
* modified 11/11/1998 to give n, means, sd of vars in table
* modified 2/2/2000 to accommodate xlab & ylab options & warn against xlab, ylab without options
set trace off
cap prog drop bagroup
prog define bagroup
local varlist "req ex min(3)"
local if "opt"
local in "opt"
local options "format(str) rows(int 999) XLABel(str) YLABel(str) avlab(str) difflab(str) title(str) saving(str) obs(int 2) listwise text(real 100) *"
parse "`*'"
if index("`options'","xlab") ~= 0 | index("`options'","ylab") ~= 0 {
di in red "xlabel and ylabel without values not permitted"
exit 198
}
tempvar touse
mark `touse' `if' `in'
local nvars : word count `varlist'
if "`listwise'" ~= "" {local obs = `nvars'}
cap assert `obs' >= 2 & `obs' <= `nvars'
if _rc { di in red "obs must be between 2 and the number of variables: " in ye `nvars'
exit _rc}
tempvar obs_c
qui gen `obs_c' = 0
parse "`varlist'", parse(" ")
while "`1'" ~= "" {
qui replace `obs_c' = `obs_c' + (`1' ~= .)
mac shift
}
qui replace `touse' = 0 if `obs_c' < `obs'
if "`format'" == "" { local format "%5.2f" }
tempvar av diff
qui egen `av' = rmean(`varlist') `if' `in'
qui gen `diff' = .
_table `varlist', av(`av') diff(`diff') touse(`touse') format(`format') obs_c(`obs_c')
if "`xlabel'" == "" {
nicenum xlabel = $xmin $xmax
local xlabel "xlabel($xlabel)"
global xlabel
}
else local xlabel "xlabel(`xlabel')"
if "`ylabel'" == "" {
nicenum ylabel = $rrmin $rrmax
parse "$ylabel" , parse (",")
assert "`2'" == ","
if `1' > $rrmin {
local ymin = 2*`1' - `3'
global ylabel "`ymin',$ylabel"
}
local ylabel "ylabel($ylabel)"
global ylabel
}
else local ylabel "ylabel(`ylabel')"
if "`avlab'" ~= "" { local avlab avlab("`avlab'") }
if "`difflab'" ~= "" { local difflab difflab("`difflab'") }
if "`title'" ~= "" { local title title("`title'") }
if "`saving'" ~= "" { local saving saving(`saving') }
qui replace `diff' = .
cap noi _graph `varlist', av(`av') diff (`diff') touse(`touse') rows(`rows') /*
*/ `xlabel' `ylabel' `avlab' `difflab' `saving' `title' `options' obs_c(`obs_c') text(`text')
if _rc {di in red "error in graph options"
exit _rc}
cap gph close
end bagroup
prog define _table
local varlist "req ex "
local options "av(str) diff(str) touse(str) format(str) title(str) obs_c(str)"
parse "`*'"
di _n(2) in gr "Comparisons with the average of the other measures"
di _n in gr "Variable | Obs Mean SD Difference Reference Range "
di in gr "---------+----------------------------------------------------------"
parse "`varlist'", parse(" ")
while "`1'" ~ = "" {
qui replace `diff' = (`1' - `av')* `obs_c'/(`obs_c'-1) if `touse'
qui summ `diff' if `touse'
local mean = _result(3)
local lrr = _result(3) - 2*_result(4)^.5
local urr = _result(3) + 2*_result(4)^.5
if "`rrmin'" == "" { local rrmin = `lrr' }
else if `lrr' < `rrmin' { local rrmin = `lrr' }
if "`rrmax'" == "" { local rrmax = `urr' }
else if `urr' > `rrmax' { local rrmax = `urr' }
* set trace on
summ `av' , mean
if "`xmin'" == "" { local xmin = _result(5) }
else if _result(5) < `xmin' { local xmin = _result(5) }
if "`xmax'" == "" { local xmax = _result(6) }
else if _result(6) > `xmax' { local xmax = _result(6) }
qui corr `av' `diff' if `touse'
local r = _result(4)
local n = _result(1)
local sig = tprob(`n'-2, `r'*((`n'-2)/(1-`r'^2))^.5)
qui summ `1' if `touse'
#delim ;
di in gr "`1'" _col(10) "|"
_col(12) in ye %7.0f `n'
_col(22) `format' _result(3)
_col(32) `format' _result(4)^.5
_col(40) `format' `mean'
_col(54) `format' `lrr' in gr " to " in ye `format' `urr';
#delim cr
mac shift
}
global xmin = `xmin'
global xmax = `xmax'
global rrmin = `rrmin'
global rrmax = `rrmax'
end _table
prog define _graph
local varlist "req ex min(3)"
local options "av(str) diff(str) touse(str) rows(int 999) avlab(str) difflab(str) title(str) saving(str) obs_c(str) yline(str) text(real 100) *"
parse "`*'"
if "`yline'" ~= "" { local yline ",`yline'" }
if "`avlab'" == "" {local avlab " " }
if "`difflab'" == "" {local difflab " " }
if "`saving'" ~= "" { local saving saving(`saving') }
label var `av' "`avlab'"
label var `diff' "`difflab'"
local nvar: word count `varlist'
if "`rows'" == "999" { local rows = int(`nvar'^.5) }
local cols = int(`nvar' / `rows')
if `cols'*`rows' < `nvar' {
local cols = `cols' + 1
}
local rlow = 0
local rmax = 23063
if "`title'" ~= "" {local rmax = 20000 }
local clow = 0
local cmax = 32000
local dr = `rmax'/`rows' - 100
local dc = `cmax'/`cols' - 100
cap noi gph open, `saving'
if "title" ~= "" {
gph pen 1
gph font 1000 500
gph text 22000 16000 0 0 `title'
}
parse "`varlist'", parse(" ")
while "`1'" ~ = "" {
qui replace `diff' = (`1' - `av')* `obs_c'/(`obs_c'-1) if `touse'
qui summ `diff' if `touse'
local mean = _result(3)
local lrr = _result(3) - 2*_result(4)^.5
local urr = _result(3) + 2*_result(4)^.5
local rhigh = `rlow' + `dr'
local chigh = `clow' + `dc'
local lab1 : var label `1'
if "`lab1'" == "" { local lab1 "`1'" }
sort `diff' `av'
tempvar f n
qui by `diff' `av' : gen `f' = _N if `touse'
qui by `diff' `av' : gen `n' = _n if `touse'
local r_tx = int(400 * `text'/100)
local c_tx = int(200 * `text'/100)
#delim ;
cap noi graph `diff' `av' if `touse' & `n' == 1 [fw=`f'], s(o) `xlabel' `ylabel' yline(`lrr', `mean', `urr' `yline')
`options' title("`lab1'")
bbox(`rlow', `clow', `rhigh', `chigh', `r_tx',`c_tx', 0);
#delim cr
local clow = `clow' + `dc'
if `clow' + `dc' > `cmax' {
local clow = 0
local rlow = `rlow' + `dr'
}
mac shift
}
gph close
end _graph