Bland Altman Analysis
Bland Altman Analysis
Bland Altman Analysis
Notice that the 95% limit lines are at about plus or minus 75 for the differences between
readings, and the graph shows a few differences outside or close to the limit lines, i.e. differences
in the neighborhood of 75 (the actual limits are -75.4 and 79.6). Bland and Altman (1986)
argue that such large differences are clinically important (a decision not based on any p-value)
and therefore conclude that the two devices do not show sufficient agreement to be used
interchangeably. It is important to note that this lack of agreement is not apparent in the plot of
identity. The following steps are used to calculate the values needed for this plot.
Step 1: Using the BA data set created above, calculate the mean and standard deviation of the
“diff” value and output that information to a file (named diff in this case.) Merge the mean and
std into the original data set (name the combined data set PERF) and use that information to
calculate the upper 95% bound (ubound) and lower bound (lbound) using the following SAS
code:
data prelim;set ba;
proc means noprint data=prelim;var diff;
output out=diff mean=meandiff std=stddiff;
run;
data PERF;set prelim;
if _N_=1 then set diff;
ubound=meandiff+stddiff*2;
lbound=meandiff-stddiff*2;
run;
The PERF data set contains the following information shown in the PERF data set below.
Notice the meandiff and std columns were from the PROC MEANS and
the ubound and lbound were calculated using the code above.
Step 2: Specify the limits for the axes using macro variables:
* AXIS LIMITS FOR GRAPHS;
%let miny=-100;%let maxy=100;%let ticky=20;
This information is something you must observe from the data – note that the minimum
and maximum for the Y axis should be the same magnitude (but one negative) to create a
balanced plot.
Step 3: The next set of code creates a data set named “b” that contains values that are used to
draw the mean line and the two limits (ubound and lbound) on the plot.
data b;set diff;
Maxaxis=&maxy;
meanline=50+(meandiff/(maxaxis*2))*100;
upper = 50+((meandiff+2*stddiff)/(maxaxis*2))*100;
up=(meandiff+2*stddiff);
lower = 50+((meandiff-2*stddiff)/(maxaxis*2))*100;
length color function $8 text $14;
retain xsys '1' ysys '2' when 'a';
/* The lines are positioned using the percentage of the horizontal axis,*/
* --this is the mean value for the y axis;
function='move'; xsys='1'; ysys='1';x=0; y=meanline; output;
function='draw'; xsys='1'; ysys='1';x=100; y=meanline; color='red'; size=2;
output;
* Upper confidence limit ------------- ;
function='move'; xsys='1'; ysys='1'; x=0; y=upper; output;
function='draw'; xsys='1'; ysys='1'; color='green'; x=100; y=upper; size=1;
output;
* Lower confidence limit ------------- ;
*data Lower;
function='move'; xsys='1'; ysys='1'; x=0; y=lower; output;
function='draw'; xsys='1'; ysys='1'; color='green'; x=100; y=lower; size=1;
output;
run;
Step 4: The Bland –Altman graph is created using the following code. The “symbol” statement
specifies the type of dots, color and size of dots. The “axis1” paragraph specifies information
about the X-axis and the “axis2” paragraph specifies information about the Y-axis.In particular,
the numbers used for each are given by the “order” statements. The plot is produced with the
PROC GPLOT statement, which uses the information from the “b” data set to annotate (anno=b)
the plot with the three lines calculated above.
symbol1 i=none v=dot c=black height=1;
* XAXIS - HORIZONTAL - AVERAGE;
axis1 length=6.5 in width=1 OFFSET=(0,0)
label=(f="Arial" h=2 'Average')
value=(font="Arial" h=1)
order=&minx to &maxx by &tickx;
* YAXIS - Vertical - Difference;
axis2 length=4.5 in width=1 OFFSET=(0,0)
label=(f="Arial" h=2 'Difference')
value=(font="Arial" h=1)
order=&miny to &maxy by &ticky;
footnote h=2 f="Arial" 'Bland-Altman Plot';
title h=2 f="Arial" 'Example';
proc gplot data=PERF;
plot diff*avg/ anno=b haxis=axis1 vaxis=axis2;
run;
quit;
Reporting the results of a Bland-Altman analysis
The following example illustrates how you might report the results of a Bland-Altman
analysis in publication format.
Narrative for methods section:
“A Bland-Altman assessment for agreement was used to compare the two peak flow
methods. A range of agreement was defined as mean bias ±2 SD.”
Bland-Altman Analysis
“A Bland-Altman analysis was used to assess the level of agreement between the two
methods to compare the new technique to the established one.”
Narrative for results section:
“The Bland-Altman analysis indicates that the 95% limits of agreement between the two
methods ranged from -75.4 to 79.6. The two methods do not consistently provide similar
measures because there is a level of disagreement that includes clinically important
discrepancies of up to 80 l/min.”
References
Barnett, V. and Lewis, T. (1994). Outliers in Statistical Data, 3rd edition. New York:
John Wiley and Sons.
Bland JM and Altman DG. (1986).Statistical methods for assessing agreement between
two methods of clinical measurement, Lancet, February, pp 307-10.
Bland JM and Altman DG. (2003). Applying the right statistics: analyses of measurement
studies, Untrasound Obstet Gynecol 2003;22: 85-93.
Elliott, AC, Woodward, WA (2007), Statistical Analysis Quick Reference Guidebook,
Sag, pp 107ff.
Kleinbaum DG, Kupper LL, Muller KE, Nizam A. (1997). Applied Regression Analysis
and Other Multivariate Methods (3rd Edition), North Scituate, MA: Duxbury Press.
Mantel, N. (1970). Why stepdown procedures in variable selection,”Technometrics 12,
621-625.
SAS Institute Inc. (2003). SAS/STAT Software: Reference, Version 9.1, Cary, NC: SAS
Institute Inc.