3-D Plots Showing Effects of Two Continuous Predictors in a Regression Model Fit
Uses lattice graphics and the output from Predict
to plot image,
contour, or perspective plots showing the simultaneous effects of two
continuous predictor variables. Unless formula
is provided, the
x-axis is constructed from the first variable listed in the call
to Predict
and the y-axis variable comes from the second.
The perimeter
function is used to generate the boundary of data
to plot when a 3-d plot is made. It finds the area where there are
sufficient data to generate believable interaction fits.
bplot(x, formula, lfun=lattice::levelplot, xlab, ylab, zlab, adj.subtitle=!info$ref.zero, cex.adj=.75, cex.lab=1, perim, showperim=FALSE, zlim=range(yhat, na.rm=TRUE), scales=list(arrows=FALSE), xlabrot, ylabrot, zlabrot=90, ...) perimeter(x, y, xinc=diff(range(x))/10, n=10, lowess.=TRUE)
x |
for |
formula |
a formula of the form |
lfun |
a high-level lattice plotting function that takes formulas of the
form |
xlab |
Character string label for x-axis. Default is given by |
ylab |
Character string abel for y-axis |
zlab |
Character string z-axis label for perspective (wireframe) plots.
Default comes from |
adj.subtitle |
Set to |
cex.adj |
|
cex.lab |
|
perim |
names a matrix created by |
showperim |
set to |
zlim |
Controls the range for plotting in the z-axis if there is one. Computed by default. |
scales |
see |
xlabrot |
rotation angle for the x-axis. Default is 30 for
|
ylabrot |
rotation angle for the y-axis. Default is -40 for
|
zlabrot |
rotation angle for z-axis rotation for
|
... |
other arguments to pass to the lattice function |
y |
second variable of the pair for |
xinc |
increment in |
n |
within intervals of |
lowess. |
set to |
perimeter
is a kind of generalization of datadist
for 2
continuous variables. First, the n
smallest and largest x
values are determined. These form the lowest and highest possible
x
s to display. Then x
is grouped into intervals bounded
by these two numbers, with the interval widths defined by xinc
.
Within each interval, y
is sorted and the nth smallest and
largest y
are taken as the interval containing sufficient data
density to plot interaction surfaces. The interval is ignored when
there are insufficient y
values. When the data are being
readied for persp
, bplot
uses the approx
function to do
linear interpolation of the y
-boundaries as a function of the
x
values actually used in forming the grid (the values of the
first variable specified to Predict
). To make the perimeter smooth,
specify lowess.=TRUE
to perimeter
.
perimeter
returns a matrix of class perimeter
. This
outline can be conveniently plotted by lines.perimeter
.
Frank Harrell
Department of Biostatistics, Vanderbilt University
fh@fharrell.com
n <- 1000 # define sample size set.seed(17) # so can reproduce the results age <- rnorm(n, 50, 10) blood.pressure <- rnorm(n, 120, 15) cholesterol <- rnorm(n, 200, 25) sex <- factor(sample(c('female','male'), n,TRUE)) label(age) <- 'Age' # label is in Hmisc label(cholesterol) <- 'Total Cholesterol' label(blood.pressure) <- 'Systolic Blood Pressure' label(sex) <- 'Sex' units(cholesterol) <- 'mg/dl' # uses units.default in Hmisc units(blood.pressure) <- 'mmHg' # Specify population model for log odds that Y=1 L <- .4*(sex=='male') + .045*(age-50) + (log(cholesterol - 10)-5.2)*(-2*(sex=='female') + 2*(sex=='male')) # Simulate binary y to have Prob(y=1) = 1/[1+exp(-L)] y <- ifelse(runif(n) < plogis(L), 1, 0) ddist <- datadist(age, blood.pressure, cholesterol, sex) options(datadist='ddist') fit <- lrm(y ~ blood.pressure + sex * (age + rcs(cholesterol,4)), x=TRUE, y=TRUE) p <- Predict(fit, age, cholesterol, sex, np=50) # vary sex last bplot(p) # image plot for age, cholesterol with color # coming from yhat; use default ranges for # both continuous predictors; two panels (for sex) bplot(p, lfun=wireframe) # same as bplot(p,,wireframe) # View from different angle, change y label orientation accordingly # Default is z=40, x=-60 bplot(p,, wireframe, screen=list(z=40, x=-75), ylabrot=-25) bplot(p,, contourplot) # contour plot bounds <- perimeter(age, cholesterol, lowess=TRUE) plot(age, cholesterol) # show bivariate data density and perimeter lines(bounds[,c('x','ymin')]); lines(bounds[,c('x','ymax')]) p <- Predict(fit, age, cholesterol) # use only one sex bplot(p, perim=bounds) # draws image() plot # don't show estimates where data are sparse # doesn't make sense here since vars don't interact bplot(p, plogis(yhat) ~ age*cholesterol) # Probability scale options(datadist=NULL)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.