# Input data

First we need to load the package and load the coordinates of points that define a knee curve. Here is a randomly-generated example of a knee curve:

library(KneeArrower)

set.seed(12345)
x <- runif(100, min=0, max=4)
y <- -exp(-x) * (1+rnorm(100) * 0.10) * 4
plot(x, y, pch=20, col="gray")

Knee curves can be either increasing or decreasing, concave up or concave down.

# Finding cutoff points

Use the findCutoff function to find cutoff points on the curve using the first derivative cutoff method or the maximum curvature method.

Note that cutoff points arenâ€™t exact because the derivatives have to be estimated using curve fitting.

## First derivative cutoff

This method finds the point along the curve where the slope is a given fraction of the maximum. This is the default method.

For example, here is the point at which the slope of tangent line is half of its maximum value.

cutoff.point <- findCutoff(x, y, method="first", 0.5)
cutoff.point
## $x ## [1] 1.017362 ## ##$y
## [1] -1.448078
plot(x, y, pch=20, col="gray")
points(cutoff.point, col="red", cex=3, pch=20)

You can set cutoffs higher or lower on the curve by setting the first derivative cutoff to different values between 0 and 1.

thresholds <- c(0.25, 0.5, 0.75, 1)

# Find cutoff points at each threshold
cutoff.points <- lapply(thresholds, function(i) {
findCutoff(x, y, method="first", i)
})
x.coord <- sapply(cutoff.points, function(p) p$x) y.coord <- sapply(cutoff.points, function(p) p$y)

# Plot the cutoff points on the scatterplot
plot(x, y, pch=20, col="gray")
points(x.coord, y.coord, col="red", pch=20)
text(x.coord, y.coord, labels=thresholds, pos=4, col="red")

## Maximum curvature cutoff

This method finds the point at which the circle tangent to the curve has the smallest radius.

cutoff.point <- findCutoff(x, y, method="curvature")
cutoff.point
## $x ## [1] 2.183521 ## ##$y
## [1] -0.4642701
plot(x, y, pch=20, col="gray")
points(cutoff.point, col="blue", cex=3, pch=20)