bplot {rms} | R Documentation |
3-D Plots Showing Effects of Two Continuous Predictors in a Regression Model Fit
Description
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.
Usage
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)
Arguments
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 |
ylab |
Character string abel for |
zlab |
Character string |
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 |
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 |
Details
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 n
th 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
.
Value
perimeter
returns a matrix of class perimeter
. This
outline can be conveniently plotted by lines.perimeter
.
Author(s)
Frank Harrell
Department of Biostatistics, Vanderbilt University
fh@fharrell.com
See Also
datadist
, Predict
,
rms
, rmsMisc
, levelplot
,
contourplot
, wireframe
Examples
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
require(lattice)
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)