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.
301 lines
8.0 KiB
Plaintext
301 lines
8.0 KiB
Plaintext
9 months ago
|
*! bamat Version 1.2.2 written 11 June 1997 by P T Seed (STB-55: sbe33)
|
||
|
*!
|
||
|
*! A matrix of Bland-Altman plots for a series of variables
|
||
|
*! bamat varlist, graph_options
|
||
|
|
||
|
* Amended 7 August 1998 to allow for saving graphs
|
||
|
*
|
||
|
* Amended 3 May 2000 by arr@stata to suppress intermediary graphs and
|
||
|
* display only the final matrix of Bland-Altman plots
|
||
|
|
||
|
prog define bamat
|
||
|
version 5.0
|
||
|
|
||
|
|
||
|
local varlist "req ex min(3)"
|
||
|
local if "opt"
|
||
|
local in "opt"
|
||
|
local options "noTABle TItle(string) saving(string) data nograph markout FORmat(string) XLAbel(string) YLAbel(string) text(str) *"
|
||
|
|
||
|
parse "`*'"
|
||
|
if index("`options'","xlab") ~= 0 | index("`options'","ylab") ~= 0 {
|
||
|
di in red "xlabel and ylabel without values not permitted"
|
||
|
exit 198
|
||
|
}
|
||
|
|
||
|
parse "`varlist'", parse(" ")
|
||
|
|
||
|
if "`table'" == "notable" & "`graph'" == "nograph" & "`data'" == "" {
|
||
|
di in red "Either table data or graph options must be chosen"
|
||
|
exit 194 }
|
||
|
|
||
|
preserve
|
||
|
tempvar touse
|
||
|
mark `touse' `if'
|
||
|
if "`markout'" ~= "" {markout `touse' `varlist'}
|
||
|
if "`format'" == "" { local format "%6.3f" }
|
||
|
if "`saving'" ~= "" { local saving "saving(`saving')" }
|
||
|
|
||
|
if "`table'" ~= "notable" {
|
||
|
_table `varlist' if `touse', format(`format') `data'
|
||
|
}
|
||
|
|
||
|
if "`graph'" ~= "nograph" |"`data'" ~= "" {
|
||
|
_limits `varlist' if `touse'
|
||
|
if "`xlabel'" == "" | "`xlabel'" == "xlabel" {
|
||
|
_mynnum xlabel $xmin $xmax
|
||
|
local xlabel "xlabel($xlabel)"
|
||
|
}
|
||
|
else {local xlabel "xlabel(`xlabel')" }
|
||
|
|
||
|
if "`ylabel'" == "" {
|
||
|
_mynnum ylabel $ymin $ymax
|
||
|
local ylabel "ylabel($ylabel)"
|
||
|
}
|
||
|
else {local ylabel "ylabel(`ylabel')" }
|
||
|
|
||
|
#delim ;
|
||
|
di _n in gr "Range of x values is " in ye %6.0g $xmin in gr " to " in ye %6.0g $xmax
|
||
|
in gr ", range of y values is " in ye %6.0g $ymin in gr " to " in ye %6.0g $ymax;
|
||
|
#delim cr
|
||
|
if "`title'" == "" {_graph `varlist' if `touse', `graph' `saving' `xlabel' `ylabel' `data' `options' }
|
||
|
else {_graph `varlist' if `touse', title("`title'") `graph' `saving' `xlabel' `ylabel' `data' `options' }
|
||
|
}
|
||
|
end bamat
|
||
|
|
||
|
prog define _table
|
||
|
local varlist "req ex"
|
||
|
local if "opt"
|
||
|
local options "data format(str)"
|
||
|
parse "`*'"
|
||
|
|
||
|
tempvar touse
|
||
|
mark `touse' `if'
|
||
|
|
||
|
di in gr _new "Reference ranges for differences between two methods""
|
||
|
#delimit;
|
||
|
di in gr _new(2) "Method 1" _col(10) "Method 2" _col(20) "Mean"
|
||
|
_col(30) "[95% Reference Range]"
|
||
|
_col(54) "Minimum" _col(64) "Maximum" ;
|
||
|
#delimit cr
|
||
|
di in gr _dup(70) "-"
|
||
|
|
||
|
tempvar av diff
|
||
|
qui gen `av' = .
|
||
|
qui gen `diff' = .
|
||
|
|
||
|
local nvar : word count `varlist'
|
||
|
local i = 2
|
||
|
while `i' <= `nvar' {
|
||
|
|
||
|
local j = 1
|
||
|
while `j' < `i' {
|
||
|
* di "i = |`i'|, j = |`j'|"
|
||
|
qui replace `diff' = ``i'' - ``j'' `if'
|
||
|
label var `diff' " "
|
||
|
qui replace `av' = (``i'' + ``j'')/2 `if'
|
||
|
label var `av' " "
|
||
|
qui summ `diff' `if'
|
||
|
local mean = _result(3)
|
||
|
local lrr = `mean' - 2*_result(4)^.5
|
||
|
local urr = `mean' + 2*_result(4)^.5
|
||
|
local min = _result(5)
|
||
|
local max = _result(6)
|
||
|
di in gr "``i''" _col(10) "``j''" _col(20) in ye `format' `mean' /*
|
||
|
*/ _col(30) `format' `lrr' _col(40) `format' `urr' _col(52) `format' `min' _col(62) `format' `max'
|
||
|
local j = `j' +1
|
||
|
}
|
||
|
local i = `i' + 1
|
||
|
}
|
||
|
di in gr _dup(70) "-"
|
||
|
end _table
|
||
|
|
||
|
|
||
|
prog define _data
|
||
|
local av `1'
|
||
|
local diff `2'
|
||
|
local m1 `3'
|
||
|
local m2 `4'
|
||
|
di _n in gr _dup(40) "-"
|
||
|
di in gr "Data for graph comparing `m1' and `m2'"
|
||
|
di in gr "Difference" _col(20) "Average"
|
||
|
di in gr _dup(40) "-"
|
||
|
local k = 1
|
||
|
while `k' <= _N {
|
||
|
if `av'[`k'] ~= . & `diff'[`k'] ~= . { di `diff'[`k'] _col(20) `av'[`k'] }
|
||
|
local k = `k' + 1
|
||
|
}
|
||
|
di in gr _dup(40) "-" _n
|
||
|
end _data
|
||
|
|
||
|
|
||
|
prog define _graph
|
||
|
local varlist "req ex"
|
||
|
local if "req"
|
||
|
local options "title(str) saving(str) xlabel(str) ylabel(str) nograph data *"
|
||
|
|
||
|
parse "`*'",
|
||
|
if "`saving'" ~= "" { local saving "saving(`saving')" }
|
||
|
|
||
|
local nvar : word count `varlist'
|
||
|
tempvar diff av
|
||
|
qui gen `diff' = .
|
||
|
qui gen `av' = .
|
||
|
label var `diff' " "
|
||
|
label var `av' " "
|
||
|
|
||
|
local gonoff : set graphics
|
||
|
set graphics off
|
||
|
local i = 1
|
||
|
while `i' <= `nvar' {
|
||
|
local j = 1
|
||
|
while `j' <= `nvar' {
|
||
|
qui replace `diff' = ``i'' - ``j'' `if'
|
||
|
qui replace `av' = (``i'' + ``j'')/2 `if'
|
||
|
tempfile g`i'`j'
|
||
|
local graph2 "`graph2' `i'`j'"
|
||
|
local graphs "`graphs' `g`i'`j''"
|
||
|
if `i' == `j' & "`graph'" == "" { _namegr ``i'', saving(`g`i'`j'', replace) }
|
||
|
* set trace on
|
||
|
else if `i' ~= `j'{
|
||
|
qui summ `diff'
|
||
|
local mean = _result(3)
|
||
|
local lrr = _result(3) - 2*_result(4)^.5
|
||
|
local urr = _result(3) + 2*_result(4)^.5
|
||
|
if "`graph'" == "" {
|
||
|
sort `diff' `av'
|
||
|
* set trace off
|
||
|
tempvar f n
|
||
|
qui by `diff' `av' : gen `f' = _N if `diff' ~= . & `av' ~= .
|
||
|
qui by `diff' `av' : gen `n' = _n if `diff' ~= . & `av' ~= .
|
||
|
|
||
|
qui graph `diff' `av' `if' & `n' == 1 [fw=`f'], xlabel(`xlabel') /*
|
||
|
*/ylabel(`ylabel') `options' saving(`g`i'`j'', replace) yline(`lrr', `mean', `urr')
|
||
|
}
|
||
|
if "`data'" ~= "" { _data `av' `diff' ``i'' ``j''}
|
||
|
}
|
||
|
local j = `j' + 1
|
||
|
}
|
||
|
local i = `i' + 1
|
||
|
}
|
||
|
set graphics `gonoff'
|
||
|
|
||
|
if "`graph'" == "" { graph using `graphs', title("`title'") `saving' }
|
||
|
end _graph
|
||
|
|
||
|
prog define _namegr
|
||
|
local varlist "req ex"
|
||
|
local options "saving(string)"
|
||
|
parse "`*'"
|
||
|
|
||
|
local f1 = 3000
|
||
|
local f2 = 1400
|
||
|
|
||
|
|
||
|
parse "`varlist'", parse (" ")
|
||
|
local lab1 : var label `1'
|
||
|
if "`lab1'" == "" { local lab1 "`1'" }
|
||
|
|
||
|
qui gph open, saving(`saving')
|
||
|
qui gph font `f1' `f2'
|
||
|
qui gph text 11188 16000 0 0 `lab1'
|
||
|
qui gph close
|
||
|
end _namegr
|
||
|
|
||
|
prog define _limits
|
||
|
local varlist "req ex"
|
||
|
local if "opt"
|
||
|
parse "`*'"
|
||
|
tempvar av diff
|
||
|
|
||
|
qui gen `diff' = `2' - `1'
|
||
|
qui gen `av' = (`2' + `1')/2
|
||
|
qui summ `av' `if'
|
||
|
global xmin = _result(5)
|
||
|
global xmax = _result(6)
|
||
|
qui summ `diff' `if'
|
||
|
global ymin = _result(5)
|
||
|
global ymax = _result(6)
|
||
|
|
||
|
local nvar : word count `varlist'
|
||
|
local i = 3
|
||
|
while `i' <= `nvar' {
|
||
|
|
||
|
local j = 1
|
||
|
while `j' < `i' {
|
||
|
qui replace `diff' = ``i'' - ``j'' `if'
|
||
|
qui replace `av' = (``i'' + ``j'')/2 `if'
|
||
|
qui summ `av' `if'
|
||
|
if _result(5) < $xmin { global xmin = _result(5) }
|
||
|
if _result(6) > $xmax { global xmax = _result(6) }
|
||
|
qui summ `diff' `if'
|
||
|
if _result(5) < $ymin { global ymin = _result(5) }
|
||
|
if _result(6) > $ymax { global ymax = _result(6) }
|
||
|
local j = `j' + 1
|
||
|
}
|
||
|
local i = `i' + 1
|
||
|
}
|
||
|
if $ymax + $ymin > 0 { global ymin = -$ymax }
|
||
|
else { global ymax = -$ymin }
|
||
|
end _limits
|
||
|
|
||
|
prog define _mynnum
|
||
|
*! _mynnum Version 1.00 20/3/1997 PTS
|
||
|
*! a version of nicenum to handle numbers less than 1
|
||
|
*! usage: _mynnum global_macro minimum maximum mumber_of_ticks
|
||
|
version 5.0
|
||
|
local macro "`1'"
|
||
|
if `2' ~= `3' {
|
||
|
if `2' < `3' {
|
||
|
local min `2'
|
||
|
local max `3'
|
||
|
}
|
||
|
else {
|
||
|
local min `3'
|
||
|
local max `2'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
di in red "Numbers do not differ"
|
||
|
exit 198
|
||
|
}
|
||
|
local nticks `4'
|
||
|
if "`nticks'" == "" { local nticks = 5 }
|
||
|
else { cap confirm integer `nticks'
|
||
|
assert `nticks' > 2
|
||
|
if _rc ~= 0 {
|
||
|
di in red "Number of ticks requested must be at least 2"
|
||
|
exit 198
|
||
|
}
|
||
|
}
|
||
|
|
||
|
local gap = 10^(int(log10(`max' - `min'))-1)
|
||
|
|
||
|
local nt = int((`max' - `min' )/`gap') + 1
|
||
|
while `nt' < `nticks' {
|
||
|
local gap = `gap'/10
|
||
|
local nt = int((`max' - `min' )/`gap') + 1
|
||
|
}
|
||
|
|
||
|
if `nt' > `nticks' - 1 {
|
||
|
local gap = `gap' * 2
|
||
|
local nt = int((`max' - `min' )/`gap') + 1
|
||
|
}
|
||
|
if `nt' > `nticks' - 1 {
|
||
|
local gap = `gap' * 2.5
|
||
|
}
|
||
|
if `nt' > `nticks' - 1 {
|
||
|
local gap = `gap' * 2
|
||
|
}
|
||
|
|
||
|
|
||
|
local tick = `gap'*int(`min'/`gap')
|
||
|
while `tick' > `min' { local tick = `tick' - `gap' }
|
||
|
global `macro' "`tick'"
|
||
|
while `tick' < `max' {
|
||
|
local tick = `tick' + `gap'
|
||
|
global `macro' "$`macro', `tick'"
|
||
|
}
|
||
|
|
||
|
end _mynnum
|