File: plot.roc.Rd

package info (click to toggle)
r-cran-proc 1.18.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,260 kB
  • sloc: cpp: 144; sh: 14; makefile: 2
file content (348 lines) | stat: -rw-r--r-- 14,193 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
\encoding{UTF-8}
\name{plot.roc}
\alias{plot}
\alias{plot.roc}
\alias{plot.roc.roc}
\alias{plot.smooth.roc}
\alias{plot.roc.smooth.roc}
\alias{plot.roc.default}
\alias{plot.roc.formula}

\title{
  Plot a ROC curve
}
\description{
  This function plots a ROC curve. It can accept many arguments to
  tweak the appearance of the plot. Two syntaxes are possible: one
  object of class \dQuote{\link{roc}}, or either two vectors (response, predictor) or a
  formula (response~predictor) as in the \code{\link{roc}} function. 
}
\usage{
\S3method{plot}{roc}(x, ...)
\S3method{plot}{smooth.roc}(x, ...)
\S3method{plot.roc}{roc}(x, add=FALSE, reuse.auc=TRUE,
axes=TRUE, legacy.axes=FALSE,
# Generic arguments for par:
xlim=if(x$percent){c(100, 0)} else{c(1, 0)},
ylim=if(x$percent){c(0, 100)} else{c(0, 1)},
xlab=ifelse(x$percent, ifelse(legacy.axes, "100 - Specificity (\%)", "Specificity (\%)"),
            ifelse(legacy.axes, "1 - Specificity", "Specificity")),
ylab=ifelse(x$percent, "Sensitivity (\%)", "Sensitivity"),
asp=1,
mar=c(4, 4, 2, 2)+.1,
mgp=c(2.5, 1, 0),
# col, lty and lwd for the ROC line only
col=par("col"),
lty=par("lty"),
lwd=2,
type="l",
# Identity line
identity=!add,
identity.col="darkgrey",
identity.lty=1,
identity.lwd=1,
# Print the thresholds on the plot
print.thres=FALSE,
print.thres.pch=20,
print.thres.adj=c(-.05,1.25),
print.thres.col="black",
print.thres.pattern=ifelse(x$percent, "\%.1f (\%.1f\%\%, \%.1f\%\%)", "\%.3f (\%.3f, \%.3f)"),
print.thres.cex=par("cex"),
print.thres.pattern.cex=print.thres.cex,
print.thres.best.method=NULL,
print.thres.best.weights=c(1, 0.5),
# Print the AUC on the plot
print.auc=FALSE,
print.auc.pattern=NULL,
print.auc.x=ifelse(x$percent, 50, .5),
print.auc.y=ifelse(x$percent, 50, .5),
print.auc.adj=c(0,1),
print.auc.col=col,
print.auc.cex=par("cex"),
# Grid
grid=FALSE,
grid.v={if(is.logical(grid) && grid[1]==TRUE)
          {seq(0, 1, 0.1) * ifelse(x$percent, 100, 1)}
        else if(is.numeric(grid)) 
          {seq(0, ifelse(x$percent, 100, 1), grid[1])} else {NULL}},
grid.h={if (length(grid) == 1) {grid.v} 
        else if (is.logical(grid) && grid[2]==TRUE)
          {seq(0, 1, 0.1) * ifelse(x$percent, 100, 1)} 
        else if(is.numeric(grid))
          {seq(0, ifelse(x$percent, 100, 1), grid[2])} else {NULL}},
grid.lty=3,
grid.lwd=1,
grid.col="#DDDDDD",
# Polygon for the AUC
auc.polygon=FALSE,
auc.polygon.col="gainsboro",
auc.polygon.lty=par("lty"),
auc.polygon.density=NULL,
auc.polygon.angle=45,
auc.polygon.border=NULL,
# Polygon for the maximal AUC possible                           
max.auc.polygon=FALSE,
max.auc.polygon.col="#EEEEEE", 
max.auc.polygon.lty=par("lty"),
max.auc.polygon.density=NULL,
max.auc.polygon.angle=45,
max.auc.polygon.border=NULL,
# Confidence interval
ci=!is.null(x$ci),
ci.type=c("bars", "shape", "no"),
ci.col=ifelse(ci.type=="bars", par("fg"), "gainsboro"),
...)
\S3method{plot.roc}{formula}(x, data, subset, na.action, ...)
\S3method{plot.roc}{default}(x, predictor, ...)
\S3method{plot.roc}{smooth.roc}(x, ...)

}
		   
\arguments{
  \item{x}{a roc object from the \link{roc} function (for plot.roc.roc),
    a formula (for plot.roc.formula) or a response vector (for
    plot.roc.default).
  }
  \item{predictor, data}{arguments for the \link{roc} function.}
  \item{subset,na.action}{arguments for \code{\link{model.frame}}}
  \item{add}{if TRUE, the ROC curve will be added to an existing
    plot. If FALSE (default), a new plot will be created.
  }
  \item{reuse.auc}{if \code{TRUE} (default) and the \dQuote{roc} object
    contains an \dQuote{auc} field, re-use these specifications for the
    plot (specifically \code{print.auc}, \code{auc.polygon} and
    \code{max.auc.polygon} arguments). See details.
  }
  \item{axes}{a logical indicating if the plot axes must be drawn.}
  \item{legacy.axes}{a logical indicating if the specificity axis (x
    axis) must be plotted as as decreasing \dQuote{specificity}
    (\code{FALSE}, the default) or increasing \dQuote{1 - specificity}
    (\code{TRUE}) as in most legacy software. This affects only the
    axis, not the plot coordinates.}
  \item{xlim, ylim, xlab, ylab, asp, mar, mgp}{Generic arguments for the
	plot. See \link{plot} and \link{plot.window} for more details. Only
	used if \code{add=FALSE}.
  }
  \item{col,lty, lwd}{color, line type and line width for the ROC
    curve. See \link{par} for more details.
  }
  \item{type}{type of plotting as in \code{\link{plot}}.}
  \item{identity}{logical: whether or not the identity line (no discrimination
    line) must be displayed. Default: only on new plots.
  }
  \item{identity.col, identity.lty, identity.lwd}{color, line type and
    line width for the identity line. Used only if identity=TRUE. See
    \link{par} for more details.
  }
  \item{print.thres}{Should a selected set of thresholds be displayed on
	the ROC curve? \code{FALSE}, \code{NULL} or \dQuote{no}: no threshold is
	displayed. \code{TRUE} or \dQuote{best}: the threshold with the
	highest sum sensitivity + specificity is plotted (this might be more
	than one threshold). \dQuote{all}: all the points of the ROC
	curve. \dQuote{local maximas}: all the local maximas. Numeric
	vector: direct definition of the thresholds to display.
	Note that on a smoothed ROC curve, only \dQuote{best} is supported.
  }
  \item{print.thres.pch, print.thres.adj, print.thres.col,
    print.thres.cex}{the plotting character (pch), text string
    adjustment (adj), color (col) and character expansion factor (cex)
    parameters for the printing of the thresholds. See \link{points} and
    \link{par} for more details.
  }
  \item{print.thres.pattern}{the text pattern for the thresholds, as a
    \link{sprintf} format. Three numerics are passed to sprintf:
    threshold, specificity, sensitivity.
  }
  \item{print.thres.pattern.cex}{the character expansion factor (cex) for the
    threshold text pattern. See \link{par} for more details.
  }
  \item{print.thres.best.method, print.thres.best.weights}{if
    \code{print.thres="best"} or \code{print.thres=TRUE}, what method must be used to determine which
    threshold is the best. See argument \code{best.method} and \code{best.weights} to
    \code{\link{coords}} for more details.
  }
  \item{print.auc}{boolean. Should the numeric value of AUC be printed
    on the plot?
  }
  \item{print.auc.pattern}{the text pattern for the AUC, as a
    \link{sprintf} format. If NULL, a reasonable value is computed that
    takes partial AUC, CI and percent into account. If the CI
    of the AUC was computed, three numerics are passed to
    sprintf: AUC, lower CI bound, higher CI bound. Otherwise, only AUC is
    passed.
  }
  \item{print.auc.x, print.auc.y}{x and y position for the printing of
    the AUC.
  }
  \item{print.auc.adj, print.auc.cex, print.auc.col}{the text
    adjustment, character expansion factor and color for the printing of
    the AUC. See \link{par} for more details.
  }
  \item{grid}{boolean or numeric vector of length 1 or 2. Should a
    background grid be added to the plot? Numeric: show a grid with the
    specified interval between each line; Logical: show the grid or
    not. Length 1: same values are taken for horizontal and vertical
    lines. Length 2: grid value for vertical (grid[1]) and horizontal
    (grid[2]). Note that these values are used to compute grid.v and
    grid.h. Therefore if you specify a grid.h and grid.v, it will be
    ignored. 
  }
  \item{grid.v, grid.h}{numeric. The x and y values at which a vertical
    or horizontal line (respectively) must be drawn. NULL if no line
    must be added.
  }
  \item{grid.lty, grid.lwd, grid.col}{the line type (lty), line width (lwd) and
    color (col) of the lines of the grid. See \link{par} for
    more details. Note that you can pass vectors of length 2, in which
    case it specifies the vertical (1) and horizontal (2) lines.
  }
  \item{auc.polygon}{boolean. Whether or not to display the area as a
    polygon.
  }
  \item{auc.polygon.col, auc.polygon.lty, auc.polygon.density,
    auc.polygon.angle, auc.polygon.border}{color (col), line type
    (lty), density, angle and border for the AUC polygon. See
    \code{\link{polygon}} and \code{\link{par}} for more details.
  }
  \item{max.auc.polygon}{boolean. Whether or not to display the maximal
    possible area as a polygon.
  }
  \item{max.auc.polygon.col, max.auc.polygon.lty, max.auc.polygon.density,
    max.auc.polygon.angle, max.auc.polygon.border}{color (col), line type
    (lty), density, angle and border for the maximum AUC polygon. See
    \code{\link{polygon}} and \code{\link{par}} for more details.
  }
  \item{ci}{boolean. Should we plot the confidence intervals?}
  \item{ci.type, ci.col}{\code{type} and \code{col} arguments for
	\code{\link{plot.ci}}. The special value \dQuote{no} disables the plotting of confidence intervals.
  }
  \item{\dots}{further arguments passed to or from other methods,
    especially arguments for \code{\link{roc}} and \code{plot.roc.roc} when calling
    \code{plot.roc.default} or \code{plot.roc.formula}. Note that the
    \code{plot} argument for \code{\link{roc}} is not allowed.
    Arguments for \code{\link{auc}} and graphical functions
    \code{\link{plot}}, \code{\link{abline}}, \code{\link{polygon}},
    \code{\link{points}}, \code{\link{text}} and \code{\link{plot.ci}}
    if applicable.
  }
}

\details{
  This function is typically called from \code{\link{roc}} when plot=TRUE (not by
  default). \code{plot.roc.formula} and \code{plot.roc.default} are convenience methods
  that build the ROC curve (with the \code{\link{roc}} function) before
  calling \code{plot.roc.roc}. You can pass them arguments for both
  \code{\link{roc}} and \code{plot.roc.roc}. Simply use \code{plot.roc}
  that will dispatch to the correct method.

  The plotting is done in the following order:
  \enumerate{
    \item A new plot is created if \code{add=FALSE}.
    \item The grid is added if \code{grid.v} and \code{grid.h} are not NULL.
    \item The maximal AUC polygon is added if \code{max.auc.polygon=TRUE}.
	\item The CI shape is added if \code{ci=TRUE}, \code{ci.type="shape"} and \code{x$ci} isn't a \dQuote{ci.auc}.
    \item The AUC polygon is added if \code{auc.polygon=TRUE}.
    \item The identity line if \code{identity=TRUE}.
    \item The actual ROC line is added.
	\item The CI bars are added if \code{ci=TRUE}, \code{ci.type="bars"} and \code{x$ci} isn't a \dQuote{ci.auc}.
    \item The selected thresholds are printed if \code{print.thres} is \code{TRUE} or numeric.
    \item The AUC is printed if \code{print.auc=TRUE}.
  }

  Graphical functions are called with \link{suppressWarnings}.
}

\section{AUC specification}{
  For \code{print.auc}, \code{auc.polygon} and \code{max.auc.polygon}
  arguments, an AUC specification is
  required. By default, the total AUC is plotted, but you may want a
  partial AUCs. The specification is defined by:
  \enumerate{
    \item the \dQuote{auc} field in the \dQuote{\link{roc}} object if
    \code{reuse.auc} is set to \code{TRUE} (default). It is naturally
    inherited from any call to \code{\link{roc}} and fits most cases.
    \item passing the specification to \code{\link{auc}} with \dots
    (arguments \code{partial.auc}, \code{partial.auc.correct} and
    \code{partial.auc.focus}). In this case, you must ensure either that
    the \code{\link{roc}} object do not contain an \code{auc} field (if
    you called \code{\link{roc}} with \code{auc=FALSE}), or set
    \code{reuse.auc=FALSE}.
  }

  If \code{reuse.auc=FALSE} the \code{\link{auc}} function will always
  be called with \code{\dots} to determine the specification, even if
  the \dQuote{\link{roc}} object do contain an \code{auc} field.

  As well if the \dQuote{\link{roc}} object do not contain an \code{auc}
  field, the \code{\link{auc}} function will always be called with
  \code{\dots} to determine the specification.

  Warning: if the roc object passed to plot.roc contains an \code{auc}
  field and \code{reuse.auc=TRUE}, \link{auc} is not called and
  arguments such as \code{partial.auc} are silently ignored.
  
}

\value{
This function returns a list of class \dQuote{roc} invisibly. See \link{roc} for more details.
}

\references{
  Xavier Robin, Natacha Turck, Alexandre Hainard, \emph{et al.}
  (2011) ``pROC: an open-source package for R and S+ to analyze and
  compare ROC curves''. \emph{BMC Bioinformatics}, \bold{7}, 77.
  DOI: \doi{10.1186/1471-2105-12-77}.
}

\seealso{
\code{\link{roc}}, \code{\link{auc}}, \code{\link{ci}}
}
\examples{

# Create a few ROC curves:
data(aSAH)
roc.s100b <- roc(aSAH$outcome, aSAH$s100b)
roc.wfns <- roc(aSAH$outcome, aSAH$wfns)
roc.ndka <- roc(aSAH$outcome, aSAH$wfns)

# Simple example:
plot(roc.s100b)

# Add a smoothed ROC:
plot(smooth(roc.s100b), add=TRUE, col="blue")
legend("bottomright", legend=c("Empirical", "Smoothed"),
       col=c(par("fg"), "blue"), lwd=2)

# With more options:
plot(roc.s100b, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
     grid.col=c("green", "red"), max.auc.polygon=TRUE,
     auc.polygon.col="lightblue", print.thres=TRUE)

# To plot a different partial AUC, we need to ignore the existing value
# with reuse.auc=FALSE:
plot(roc.s100b, print.auc=TRUE, auc.polygon=TRUE, partial.auc=c(1, 0.8),
     partial.auc.focus="se", grid=c(0.1, 0.2), grid.col=c("green", "red"),
     max.auc.polygon=TRUE, auc.polygon.col="lightblue", 
     print.thres=TRUE, print.thres.adj = c(1, -1),
     reuse.auc=FALSE)

# Add a second ROC curve to the previous plot:
plot(roc.wfns, add=TRUE)

# Plot some thresholds, add them to the same plot
plot(roc.ndka, print.thres="best", print.thres.best.method="youden")
plot(roc.ndka, print.thres="best", print.thres.best.method="closest.topleft",
                                   add = TRUE)
plot(roc.ndka, print.thres="best", print.thres.best.method="youden",
                                   print.thres.best.weights=c(50, 0.2),
                                   print.thres.adj = c(1.1, 1.25),
                                   add = TRUE)
}

\keyword{univar}
\keyword{nonparametric}
\keyword{utilities}
\keyword{aplot}
\keyword{hplot}
\keyword{roc}