Function to plot survival probabilities or absolute risks (cumulative incidence function) against time.
# S3 method for class 'prodlim'
plot(
x,
type,
cause,
select,
newdata,
add = FALSE,
col,
lty,
lwd,
ylim,
xlim,
ylab,
xlab = "Time",
num.digits = 2,
timeconverter,
legend = TRUE,
short.labels = TRUE,
logrank = FALSE,
marktime = FALSE,
confint = TRUE,
automar,
atrisk = ifelse(add, FALSE, TRUE),
timeOrigin = 0,
axes = TRUE,
background = TRUE,
percent = TRUE,
minAtrisk = 0,
limit = 10,
...
)
an object of class `prodlim' as returned by the
prodlim
function.
Either "surv"
or "risk"
AKA "cuminc"
. Controls what
part of the object is plotted. Defaults to object$type
.
For competing risk models. Character (other classes are converted with as.character
).
The argument cause
determines the event of interest. Currently one cause is allowed at a time, but you can
call the function again with add=TRUE
to add the lines of the other
causes. Also, if cause="stacked"
is specified the absolute risks of all causes are stacked.
Select which lines to plot. This can be used when
there are many strata or many competing risks to select a
subset of the lines. However, a more clean way to select
covariate strata is to use the argument newdata
. Another
application is when there are several competing risks and the
stacked plot (cause="stacked"
) should only show a selected subset
of the available causes.
a data frame containing covariate strata for which
to show curves. When omitted element X
of object
x
is used.
if TRUE
curves are added to an existing plot.
color for curves. Default is 1:number(curves)
line type for curves. Default is 1.
line width for all curves. Default is 3.
limits of the y-axis
limits of the x-axis
label for the y-axis
label for the x-axis
Number of digits when rounding off numerical values for legend and at-risk tables.
The following options are supported: "days2years" (conversion factor: 1/365.25) "months2years" (conversion factor: 1/12) "days2months" (conversion factor 1/30.4368499) "years2days" (conversion factor 365.25) "years2months" (conversion factor 12) "months2days" (conversion factor 30.4368499)
if TRUE a legend is plotted by calling the function
legend. Optional arguments of the function legend
can
be given in the form legend.x=val
where x is the name of
the argument and val the desired value. See also Details.
Logical. When FALSE
construct labels as cause=1, var1=v1, var2=v2 else as 1, v1, v2.
If TRUE, the logrank p-value will be extracted from
a call to survdiff
and added to the legend. This works
only for survival models, i.e. Kaplan-Meier with discrete
predictors.
if TRUE the curves are tick-marked at right
censoring times by invoking the function
markTime
. Optional arguments of the function
markTime
can be given in the form confint.x=val
as with legend. See also Details.
Logical. If TRUE
pointwise confidence intervals are plotted
by invoking the function confInt
. Optional arguments of
the function confInt
can be given in the form
confint.x=val
as with legend. See also Details.
If TRUE the function trys to find suitable values for the figure margins around the main plotting region.
if TRUE display numbers of subjects at risk by
invoking the function atRisk
. Optional arguments of the
function atRisk
can be given in the form
atrisk.x=val
as with legend. See also Details.
Start of the time axis
If true axes are drawn. See details.
If TRUE
the background color and grid
color can be controlled using smart arguments SmartControl,
such as background.bg="yellow" or
background.bg=c("gray66","gray88"). The following defaults are
passed to background
by plot.prodlim
:
horizontal=seq(0,1,.25), vertical=NULL, bg="gray77",
fg="white". See background
for all arguments, and the
examples below.
If true the y-axis is labeled in percent.
Integer. Show the curve only until the number
at-risk is at least minAtrisk
When newdata is not specified and the number of lines
in element X
of object x
exceeds limits, only the
results for covariate constellations of the first, the middle
and the last row in X
are shown. Otherwise all lines of
X
are shown.
Parameters that are filtered by
SmartControl
and then passed to the functions
plot
, legend
, axis
,
atRisk
, confInt
,
markTime
, backGround
The (invisible) object.
From version 1.1.3 on the arguments legend.args, atrisk.args, confint.args
are obsolete and only available for backward compatibility. Instead
arguments for the invoked functions atRisk
, legend
,
confInt
, markTime
, axis
are simply specified as
atrisk.cex=2
. The specification is not case sensitive, thus
atRisk.cex=2
or atRISK.cex=2
will have the same effect. The
function axis
is called twice, and arguments of the form
axis1.labels
, axis1.at
are used for the time axis whereas
axis2.pos
, axis1.labels
, etc. are used for the y-axis.
These arguments are processed via ...{}
of plot.prodlim
and
inside by using the function SmartControl
. Documentation of these
arguments can be found in the help pages of the corresponding functions.
## simulate right censored data from a two state model
set.seed(100)
dat <- SimSurv(100)
# with(dat,plot(Hist(time,status)))
### marginal Kaplan-Meier estimator
kmfit <- prodlim(Hist(time, status) ~ 1, data = dat)
plot(kmfit)
plot(kmfit,atrisk.show.censored=1L,atrisk.at=seq(0,12,3))
plot(kmfit,timeconverter="years2months")
# change time range
plot(kmfit,xlim=c(0,4))
# change scale of y-axis
plot(kmfit,percent=FALSE)
# mortality instead of survival
plot(kmfit,type="risk")
# change axis label and position of ticks
plot(kmfit,
xlim=c(0,10),
axis1.at=seq(0,10,1),
axis1.labels=0:10,
xlab="Years",
axis2.las=2,
atrisk.at=seq(0,10,2.5),
atrisk.title="")
# change background color
plot(kmfit,
xlim=c(0,10),
confint.citype="shadow",
col=1,
axis1.at=0:10,
axis1.labels=0:10,
xlab="Years",
axis2.las=2,
atrisk.at=seq(0,10,2.5),
atrisk.title="",
background=TRUE,
background.fg="white",
background.horizontal=seq(0,1,.25/2),
background.vertical=seq(0,10,2.5),
background.bg=c("gray88"))
# change type of confidence limits
plot(kmfit,
xlim=c(0,10),
confint.citype="dots",
col=4,
background=TRUE,
background.bg=c("white","gray88"),
background.fg="gray77",
background.horizontal=seq(0,1,.25/2),
background.vertical=seq(0,10,2))
### Kaplan-Meier in discrete strata
kmfitX <- prodlim(Hist(time, status) ~ X1, data = dat)
plot(kmfitX,atrisk.show.censored=1L)
# move legend
plot(kmfitX,legend.x="bottomleft",atRisk.cex=1.3,
atrisk.title="No. subjects")
## Control the order of strata
## since version 1.5.1 prodlim does obey the order of
## factor levels
dat$group <- factor(cut(dat$X2,c(-Inf,0,0.5,Inf)),
labels=c("High","Intermediate","Low"))
kmfitG <- prodlim(Hist(time, status) ~ group, data = dat)
plot(kmfitG)
## relevel
dat$group2 <- factor(cut(dat$X2,c(-Inf,0,0.5,Inf)),
levels=c("(0.5, Inf]","(0,0.5]","(-Inf,0]"),
labels=c("Low","Intermediate","High"))
kmfitG2 <- prodlim(Hist(time, status) ~ group2, data = dat)
plot(kmfitG2)
# add log-rank test to legend
plot(kmfitX,
atRisk.cex=1.3,
logrank=TRUE,
legend.x="topright",
atrisk.title="at-risk")
#> Error in eval(x$call$data): object 'dat' not found
# change atrisk labels
plot(kmfitX,
legend.x="bottomleft",
atrisk.title="Patients",
atrisk.cex=0.9,
atrisk.labels=c("X1=0","X1=1"))
# multiple categorical factors
kmfitXG <- prodlim(Hist(time,status)~X1+group2,data=dat)
plot(kmfitXG,select=1:2)
### Kaplan-Meier in continuous strata
kmfitX2 <- prodlim(Hist(time, status) ~ X2, data = dat)
plot(kmfitX2,xlim=c(0,10))
# specify values of X2 for which to show the curves
plot(kmfitX2,xlim=c(0,10),newdata=data.frame(X2=c(-1.8,0,1.2)))
### Cluster-correlated data
library(survival)
cdat <- cbind(SimSurv(20),patnr=sample(1:5,size=20,replace=TRUE))
kmfitC <- prodlim(Hist(time, status) ~ cluster(patnr), data = cdat)
plot(kmfitC)
plot(kmfitC,atrisk.labels=c("Units","Patients"))
kmfitC2 <- prodlim(Hist(time, status) ~ X1+cluster(patnr), data = cdat)
plot(kmfitC2)
plot(kmfitC2,atrisk.labels=c("Teeth","Patients","Teeth","Patients"),
atrisk.col=c(1,1,2,2))
### Cluster-correlated data with strata
n = 50
foo = runif(n)
bar = rexp(n)
baz = rexp(n,1/2)
d = stack(data.frame(foo,bar,baz))
d$cl = sample(10, 3*n, replace=TRUE)
fit = prodlim(Surv(values) ~ ind + cluster(cl), data=d)
plot(fit)
## simulate right censored data from a competing risk model
datCR <- SimCompRisk(100)
with(datCR,plot(Hist(time,event)))
#> Warning: The dimension of the boxes may depend on the current graphical device
#> in the sense that the layout and centering of text may change when you resize the graphical device and call the same plot.
### marginal Aalen-Johansen estimator
ajfit <- prodlim(Hist(time, event) ~ 1, data = datCR)
plot(ajfit) # same as plot(ajfit,cause=1)
plot(ajfit,atrisk.show.censored=1L)
# cause 2
plot(ajfit,cause=2)
# both in one
plot(ajfit,cause=1)
plot(ajfit,cause=2,add=TRUE,col=2)
### stacked plot
plot(ajfit,cause="stacked",select=2)
### stratified Aalen-Johansen estimator
ajfitX1 <- prodlim(Hist(time, event) ~ X1, data = datCR)
plot(ajfitX1)
## add total number at-risk to a stratified curve
ttt = 1:10
plot(ajfitX1,atrisk.at=ttt,col=2:3)
plot(ajfit,add=TRUE,col=1)
atRisk(ajfit,newdata=datCR,col=1,times=ttt,line=3,labels="Total")
#> [[1]]
#> NULL
#>
## stratified Aalen-Johansen estimator in nearest neighborhoods
## of a continuous variable
ajfitX <- prodlim(Hist(time, event) ~ X1+X2, data = datCR)
plot(ajfitX,newdata=data.frame(X1=c(1,1,0),X2=c(4,10,10)))
plot(ajfitX,newdata=data.frame(X1=c(1,1,0),X2=c(4,10,10)),cause=2)
## stacked plot
plot(ajfitX,
newdata=data.frame(X1=0,X2=0.1),
cause="stacked",
legend.title="X1=0,X2=0.1",
legend.legend=paste("cause:",getStates(ajfitX$model.response)),
plot.main="Subject specific stacked plot")