# Sensitivity-specificity curves

**NOTE: this function is now deprecated; please use the optiPair function instead**

The SensSpecCurve function calculates and plots sensitivity (black circles) and specificity (white circles) for all thresholds at a given interval. The plot marks the threshold and the sensitivity value at which sensitivity and specificity are closest to each other. Optionally, you can plot also the difference (minuses), sum (pluses), and/or mean (grey line) of sensitivity and specificity, together with their optimal values and respective thresholds. All these values are also provided with the text output of the function.

```SensSpecCurve <- function (obs, pred, interval = 0.01, plot = TRUE, plot.diff = FALSE, plot.sum = FALSE, plot.mean = FALSE, ...) {
# obs: a vector of observed presences (1) and absences (0) or another binary response variable
# pred: a vector with the corresponding predicted values of presence probability, habitat suitability, environmental favourability or alike
# interval: the interval of thresholds at which to calculate sensitivity and specificity
# plot: logical indicating whether or not to plot the curves
# plot.sum and plot.diff will optionally plot the sum (+) and difference (-) between sensitivity and specificity
# ... : arguments to be passed to the "plot" function

SensSpec <- optiThresh(obs = obs, pred = pred, interval = interval, measures = c("Sensitivity", "Specificity"), plot = FALSE, simplif = TRUE)
SensSpec\$Difference <- abs(SensSpec\$Sensitivity - SensSpec\$Specificity)
SensSpec\$Sum <- rowSums(SensSpec[,1:2])
SensSpec\$Mean <- rowMeans(SensSpec)
SensSpec\$Threshold <- as.numeric(rownames(SensSpec))

MinDiff <- min(SensSpec\$Difference)
MaxSum <- max(SensSpec\$Sum)
MaxMean <- max(SensSpec\$Mean)

ThreshDiff <- with(SensSpec, Threshold[which.min(Difference)])
ThreshSum <- with(SensSpec, Threshold[which.max(Sum)])
ThreshMean <- with(SensSpec, Threshold[which.max(Mean)])

if(plot){
ymax <- ifelse(plot.sum, max(SensSpec\$Sum), 1)

with(SensSpec, plot(Sensitivity ~ Threshold, pch = 20, ylim = c(0, ymax), ylab = "Sensitivity and specificity", ...))
with(SensSpec, points(Specificity ~ Threshold, pch = 1))
abline(h = SensSpec[which.min(SensSpec\$Difference), "Sensitivity"], col = "grey", lty = 2)
abline(v = ThreshDiff, col = "grey", lty = 2)

if(plot.mean) {
with(SensSpec, lines(Mean ~ Threshold, col = "grey"))
abline(v = ThreshMean, col = "grey", lty = 2)
abline(h = MaxMean, col = "grey", lty = 2)
}  # end if plot mean

if(plot.sum) {
with(SensSpec, points(Sum ~ Threshold, pch = '+'))
abline(v = ThreshSum, col = "grey", lty = 2)
abline(h = MaxSum, col = "grey", lty = 2)
}    # end if plot sum

if(plot.diff) {
with(SensSpec, points(Difference ~ Threshold, pch = '-', col = "grey"))
abline(v = ThreshDiff, col = "grey", lty = 2)
abline(h = MinDiff, col = "grey", lty = 2)
}  # end if plot diff
}  # end if plot

return(list(SensSpec = SensSpec, MinDiff = MinDiff, ThreshDiff = ThreshDiff, MaxSum = MaxSum, ThreshSum = ThreshSum, MaxMean = MaxMean, ThreshMean = ThreshMean))

}  # end SensSpecCurve function```

[presented with Pretty R]

This function uses the optiThresh function, which in turn uses threshMeasures and evaluate, so all these must be loaded along with SpensSpecCurve for it to work. Then just load your observed and predicted data (see Beginner’s guide for more information) and type or paste:

```with(mydata, SpensSpecCurve(obs = myspecies, pred = myspecies_P))

```