https://github.com/cran/cutpointr
Raw File
Tip revision: 4408233eb8624dea85ecf18e86d50c296165c3f2 authored by Christian Thiele on 13 April 2022, 17:12:29 UTC
version 1.1.2
Tip revision: 4408233
cutpointr.html
<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />

<meta name="viewport" content="width=device-width, initial-scale=1" />

<meta name="author" content="Christian Thiele" />

<meta name="date" content="2022-04-13" />

<title>An introduction to cutpointr</title>

<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to
// be compatible with the behavior of Pandoc < 2.8).
document.addEventListener('DOMContentLoaded', function(e) {
  var hs = document.querySelectorAll("div.section[class*='level'] > :first-child");
  var i, h, a;
  for (i = 0; i < hs.length; i++) {
    h = hs[i];
    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6
    a = h.attributes;
    while (a.length > 0) h.removeAttribute(a[0].name);
  }
});
</script>
<script>// Hide empty <a> tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) -->
// v0.0.1
// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020.

document.addEventListener('DOMContentLoaded', function() {
  const codeList = document.getElementsByClassName("sourceCode");
  for (var i = 0; i < codeList.length; i++) {
    var linkList = codeList[i].getElementsByTagName('a');
    for (var j = 0; j < linkList.length; j++) {
      if (linkList[j].innerHTML === "") {
        linkList[j].setAttribute('aria-hidden', 'true');
      }
    }
  }
});
</script>

<style type="text/css">
  code{white-space: pre-wrap;}
  span.smallcaps{font-variant: small-caps;}
  span.underline{text-decoration: underline;}
  div.column{display: inline-block; vertical-align: top; width: 50%;}
  div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
  ul.task-list{list-style: none;}
    </style>


<style type="text/css">
  code {
    white-space: pre;
  }
  .sourceCode {
    overflow: visible;
  }
</style>
<style type="text/css" data-origin="pandoc">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code > span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
    color: #aaaaaa;
  }
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
div.sourceCode
  {   }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */

</style>
<script>
// apply pandoc div.sourceCode style to pre.sourceCode instead
(function() {
  var sheets = document.styleSheets;
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].ownerNode.dataset["origin"] !== "pandoc") continue;
    try { var rules = sheets[i].cssRules; } catch (e) { continue; }
    for (var j = 0; j < rules.length; j++) {
      var rule = rules[j];
      // check if there is a div.sourceCode rule
      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") continue;
      var style = rule.style.cssText;
      // check if color or background-color is set
      if (rule.style.color === '' && rule.style.backgroundColor === '') continue;
      // replace div.sourceCode by a pre.sourceCode rule
      sheets[i].deleteRule(j);
      sheets[i].insertRule('pre.sourceCode{' + style + '}', j);
    }
  }
})();
</script>




<style type="text/css">body {
background-color: #fff;
margin: 1em auto;
max-width: 700px;
overflow: visible;
padding-left: 2em;
padding-right: 2em;
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.35;
}
#TOC {
clear: both;
margin: 0 0 10px 10px;
padding: 4px;
width: 400px;
border: 1px solid #CCCCCC;
border-radius: 5px;
background-color: #f6f6f6;
font-size: 13px;
line-height: 1.3;
}
#TOC .toctitle {
font-weight: bold;
font-size: 15px;
margin-left: 5px;
}
#TOC ul {
padding-left: 40px;
margin-left: -1.5em;
margin-top: 5px;
margin-bottom: 5px;
}
#TOC ul ul {
margin-left: -2em;
}
#TOC li {
line-height: 16px;
}
table {
margin: 1em auto;
border-width: 1px;
border-color: #DDDDDD;
border-style: outset;
border-collapse: collapse;
}
table th {
border-width: 2px;
padding: 5px;
border-style: inset;
}
table td {
border-width: 1px;
border-style: inset;
line-height: 18px;
padding: 5px 5px;
}
table, table th, table td {
border-left-style: none;
border-right-style: none;
}
table thead, table tr.even {
background-color: #f7f7f7;
}
p {
margin: 0.5em 0;
}
blockquote {
background-color: #f6f6f6;
padding: 0.25em 0.75em;
}
hr {
border-style: solid;
border: none;
border-top: 1px solid #777;
margin: 28px 0;
}
dl {
margin-left: 0;
}
dl dd {
margin-bottom: 13px;
margin-left: 13px;
}
dl dt {
font-weight: bold;
}
ul {
margin-top: 0;
}
ul li {
list-style: circle outside;
}
ul ul {
margin-bottom: 0;
}
pre, code {
background-color: #f7f7f7;
border-radius: 3px;
color: #333;
white-space: pre-wrap; 
}
pre {
border-radius: 3px;
margin: 5px 0px 10px 0px;
padding: 10px;
}
pre:not([class]) {
background-color: #f7f7f7;
}
code {
font-family: Consolas, Monaco, 'Courier New', monospace;
font-size: 85%;
}
p > code, li > code {
padding: 2px 0px;
}
div.figure {
text-align: center;
}
img {
background-color: #FFFFFF;
padding: 2px;
border: 1px solid #DDDDDD;
border-radius: 3px;
border: 1px solid #CCCCCC;
margin: 0 5px;
}
h1 {
margin-top: 0;
font-size: 35px;
line-height: 40px;
}
h2 {
border-bottom: 4px solid #f7f7f7;
padding-top: 10px;
padding-bottom: 2px;
font-size: 145%;
}
h3 {
border-bottom: 2px solid #f7f7f7;
padding-top: 10px;
font-size: 120%;
}
h4 {
border-bottom: 1px solid #f7f7f7;
margin-left: 8px;
font-size: 105%;
}
h5, h6 {
border-bottom: 1px solid #ccc;
font-size: 105%;
}
a {
color: #0033dd;
text-decoration: none;
}
a:hover {
color: #6666ff; }
a:visited {
color: #800080; }
a:visited:hover {
color: #BB00BB; }
a[href^="http:"] {
text-decoration: underline; }
a[href^="https:"] {
text-decoration: underline; }

code > span.kw { color: #555; font-weight: bold; } 
code > span.dt { color: #902000; } 
code > span.dv { color: #40a070; } 
code > span.bn { color: #d14; } 
code > span.fl { color: #d14; } 
code > span.ch { color: #d14; } 
code > span.st { color: #d14; } 
code > span.co { color: #888888; font-style: italic; } 
code > span.ot { color: #007020; } 
code > span.al { color: #ff0000; font-weight: bold; } 
code > span.fu { color: #900; font-weight: bold; } 
code > span.er { color: #a61717; background-color: #e3d2d2; } 
</style>




</head>

<body>




<h1 class="title toc-ignore">An introduction to cutpointr</h1>
<h4 class="author">Christian Thiele</h4>
<h4 class="date">2022-04-13</h4>



<p><strong>cutpointr</strong> is an R package for tidy calculation of “optimal” cutpoints. It supports several methods for calculating cutpoints and includes several metrics that can be maximized or minimized by selecting a cutpoint. Some of these methods are designed to be more robust than the simple empirical optimization of a metric. Additionally, <strong>cutpointr</strong> can automatically bootstrap the variability of the optimal cutpoints and return out-of-bag estimates of various performance metrics.</p>
<div id="installation" class="section level2">
<h2>Installation</h2>
<p>You can install <strong>cutpointr</strong> from CRAN using the menu in RStudio or simply:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1"></a><span class="kw">install.packages</span>(<span class="st">&quot;cutpointr&quot;</span>)</span></code></pre></div>
</div>
<div id="example" class="section level2">
<h2>Example</h2>
<p>For example, the optimal cutpoint for the included data set is 2 when maximizing the sum of sensitivity and specificity.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1"></a><span class="kw">library</span>(cutpointr)</span>
<span id="cb2-2"><a href="#cb2-2"></a><span class="kw">data</span>(suicide)</span>
<span id="cb2-3"><a href="#cb2-3"></a><span class="kw">head</span>(suicide)</span></code></pre></div>
<pre><code>##   age gender dsi suicide
## 1  29 female   1      no
## 2  26   male   0      no
## 3  26 female   0      no
## 4  27 female   0      no
## 5  28 female   0      no
## 6  53   male   2      no</code></pre>
<div class="sourceCode" id="cb4"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb4-1"><a href="#cb4-1"></a>cp &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(suicide, dsi, suicide, </span>
<span id="cb4-2"><a href="#cb4-2"></a>                <span class="dt">method =</span> maximize_metric, <span class="dt">metric =</span> sum_sens_spec)</span></code></pre></div>
<pre><code>## Assuming the positive class is yes</code></pre>
<pre><code>## Assuming the positive class has higher x values</code></pre>
<div class="sourceCode" id="cb7"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb7-1"><a href="#cb7-1"></a><span class="kw">summary</span>(cp)</span></code></pre></div>
<pre><code>## Method: maximize_metric 
## Predictor: dsi 
## Outcome: suicide 
## Direction: &gt;= 
## 
##     AUC   n n_pos n_neg
##  0.9238 532    36   496
## 
##  optimal_cutpoint sum_sens_spec    acc sensitivity specificity tp fn fp  tn
##                 2        1.7518 0.8647      0.8889      0.8629 32  4 68 428
## 
## Predictor summary: 
##     Data Min.   5% 1st Qu. Median      Mean 3rd Qu.  95% Max.       SD NAs
##  Overall    0 0.00       0      0 0.9210526       1 5.00   11 1.852714   0
##       no    0 0.00       0      0 0.6330645       0 4.00   10 1.412225   0
##      yes    0 0.75       4      5 4.8888889       6 9.25   11 2.549821   0</code></pre>
<div class="sourceCode" id="cb9"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb9-1"><a href="#cb9-1"></a><span class="kw">plot</span>(cp)</span></code></pre></div>
<p><img src="data:image/png;base64,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" style="display: block; margin: auto;" /></p>
<p>When considering the optimality of a cutpoint, we can only make a judgement based on the sample at hand. Thus, the estimated cutpoint may not be optimal within the population or on unseen data, which is why we sometimes put the “optimal” in quotation marks.</p>
<p><code>cutpointr</code> makes assumptions about the direction of the dependency between <code>class</code> and <code>x</code>, if <code>direction</code> and / or <code>pos_class</code> or <code>neg_class</code> are not specified. The same result as above can be achieved by manually defining <code>direction</code> and the positive / negative classes which is slightly faster, since the classes and direction don’t have to be determined:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb10-1"><a href="#cb10-1"></a>opt_cut &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(suicide, dsi, suicide, <span class="dt">direction =</span> <span class="st">&quot;&gt;=&quot;</span>, <span class="dt">pos_class =</span> <span class="st">&quot;yes&quot;</span>,</span>
<span id="cb10-2"><a href="#cb10-2"></a>                     <span class="dt">neg_class =</span> <span class="st">&quot;no&quot;</span>, <span class="dt">method =</span> maximize_metric, <span class="dt">metric =</span> youden)</span></code></pre></div>
<p><code>opt_cut</code> is a data frame that returns the input data and the ROC curve (and optionally the bootstrap results) in a nested tibble. Methods for summarizing and plotting the data and results are included (e.g. <code>summary</code>, <code>plot</code>, <code>plot_roc</code>, <code>plot_metric</code>)</p>
<p>To inspect the optimization, the function of metric values per cutpoint can be plotted using <code>plot_metric</code>, if an optimization function was used that returns a metric column in the <code>roc_curve</code> column. For example, the <code>maximize_metric</code> and <code>minimize_metric</code> functions do so:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb11-1"><a href="#cb11-1"></a><span class="kw">plot_metric</span>(opt_cut)</span></code></pre></div>
<p><img src="data:image/png;base64,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" style="display: block; margin: auto;" /></p>
<p>Predictions for new data can be made using <code>predict</code>:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb12-1"><a href="#cb12-1"></a><span class="kw">predict</span>(opt_cut, <span class="dt">newdata =</span> <span class="kw">data.frame</span>(<span class="dt">dsi =</span> <span class="dv">0</span><span class="op">:</span><span class="dv">5</span>))</span></code></pre></div>
<pre><code>## [1] &quot;no&quot;  &quot;no&quot;  &quot;yes&quot; &quot;yes&quot; &quot;yes&quot; &quot;yes&quot;</code></pre>
</div>
<div id="features" class="section level2">
<h2>Features</h2>
<ul>
<li>Calculation of optimal cutpoints in binary classification tasks</li>
<li>Tidy output, integrates well with functions from the tidyverse</li>
<li>Functions for plotting ROC curves, metric distributions and more</li>
<li>Bootstrapping for simulating the cutpoint variability and for obtaining out-of-bag estimates of various metrics (as a form of internal validation) with optional parallelisation</li>
<li>Multiple methods for calculating cutpoints</li>
<li>Multiple metrics can be chosen for maximization / minimization</li>
<li>Tidyeval</li>
</ul>
</div>
<div id="calculating-cutpoints" class="section level1">
<h1>Calculating cutpoints</h1>
<div id="method-functions-for-cutpoint-estimation" class="section level2">
<h2>Method functions for cutpoint estimation</h2>
<p>The included methods for calculating cutpoints are:</p>
<ul>
<li><code>maximize_metric</code>: Maximize the metric function</li>
<li><code>minimize_metric</code>: Minimize the metric function</li>
<li><code>maximize_loess_metric</code>: Maximize the metric function after LOESS smoothing</li>
<li><code>minimize_loess_metric</code>: Minimize the metric function after LOESS smoothing</li>
<li><code>maximize_spline_metric</code>: Maximize the metric function after spline smoothing</li>
<li><code>minimize_spline_metric</code>: Minimize the metric function after spline smoothing</li>
<li><code>maximize_gam_metric</code>: Maximize the metric function after smoothing via Generalized Additive Models</li>
<li><code>minimize_gam_metric</code>: Minimize the metric function after smoothing via Generalized Additive Models</li>
<li><code>maximize_boot_metric</code>: Bootstrap the optimal cutpoint when maximizing a metric</li>
<li><code>minimize_boot_metric</code>: Bootstrap the optimal cutpoint when minimizing a metric</li>
<li><code>oc_manual</code>: Specify the cutoff value manually</li>
<li><code>oc_mean</code>: Use the sample mean as the “optimal” cutpoint</li>
<li><code>oc_median</code>: Use the sample median as the “optimal” cutpoint</li>
<li><code>oc_youden_kernel</code>: Maximize the Youden-Index after kernel smoothing the distributions of the two classes</li>
<li><code>oc_youden_normal</code>: Maximize the Youden-Index parametrically assuming normally distributed data in both classes</li>
</ul>
</div>
<div id="metric-functions" class="section level2">
<h2>Metric functions</h2>
<p>The included metrics to be used with the minimization and maximization methods are:</p>
<ul>
<li><code>accuracy</code>: Fraction correctly classified</li>
<li><code>abs_d_sens_spec</code>: The absolute difference of sensitivity and specificity</li>
<li><code>abs_d_ppv_npv</code>: The absolute difference between positive predictive value (PPV) and negative predictive value (NPV)</li>
<li><code>roc01</code>: Distance to the point (0,1) on ROC space</li>
<li><code>cohens_kappa</code>: Cohen’s Kappa</li>
<li><code>sum_sens_spec</code>: sensitivity + specificity</li>
<li><code>sum_ppv_npv</code>: The sum of positive predictive value (PPV) and negative predictive value (NPV)</li>
<li><code>prod_sens_spec</code>: sensitivity * specificity</li>
<li><code>prod_ppv_npv</code>: The product of positive predictive value (PPV) and negative predictive value (NPV)</li>
<li><code>youden</code>: Youden- or J-Index = sensitivity + specificity - 1</li>
<li><code>odds_ratio</code>: (Diagnostic) odds ratio</li>
<li><code>risk_ratio</code>: risk ratio (relative risk)</li>
<li><code>p_chisquared</code>: The p-value of a chi-squared test on the confusion matrix</li>
<li><code>cost_misclassification</code>: The sum of the misclassification cost of false positives and false negatives. Additional arguments: cost_fp, cost_fn</li>
<li><code>total_utility</code>: The total utility of true / false positives / negatives. Additional arguments: utility_tp, utility_tn, cost_fp, cost_fn</li>
<li><code>F1_score</code>: The F1-score (2 * TP) / (2 * TP + FP + FN)</li>
<li><code>metric_constrain</code>: Maximize a selected metric given a minimal value of another selected metric</li>
<li><code>sens_constrain</code>: Maximize sensitivity given a minimal value of specificity</li>
<li><code>spec_constrain</code>: Maximize specificity given a minimal value of sensitivity</li>
<li><code>acc_constrain</code>: Maximize accuracy given a minimal value of sensitivity</li>
</ul>
<p>Furthermore, the following functions are included which can be used as metric functions but are more useful for plotting purposes, for example in <code>plot_cutpointr</code>, or for defining new metric functions: <code>tp</code>, <code>fp</code>, <code>tn</code>, <code>fn</code>, <code>tpr</code>, <code>fpr</code>, <code>tnr</code>, <code>fnr</code>, <code>false_omission_rate</code>, <code>false_discovery_rate</code>, <code>ppv</code>, <code>npv</code>, <code>precision</code>, <code>recall</code>, <code>sensitivity</code>, and <code>specificity</code>.</p>
<p>The inputs to the arguments <code>method</code> and <code>metric</code> are functions so that user-defined functions can easily be supplied instead of the built-in ones.</p>
</div>
<div id="separate-subgroups-and-bootstrapping" class="section level2">
<h2>Separate subgroups and bootstrapping</h2>
<p>Cutpoints can be separately estimated on subgroups that are defined by a third variable, <code>gender</code> in this case. Additionally, if <code>boot_runs</code> is larger zero, <code>cutpointr</code> will carry out the usual cutpoint calculation on the full sample, just as before, and additionally on <code>boot_runs</code> bootstrap samples. This offers a way of gauging the out-of-sample performance of the cutpoint estimation method. If a subgroup is given, the bootstrapping is carried out separately for every subgroup which is also reflected in the plots and output.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb14-1"><a href="#cb14-1"></a><span class="kw">set.seed</span>(<span class="dv">12</span>)</span>
<span id="cb14-2"><a href="#cb14-2"></a>opt_cut_b &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(suicide, dsi, suicide, <span class="dt">boot_runs =</span> <span class="dv">1000</span>)</span></code></pre></div>
<div class="sourceCode" id="cb15"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb15-1"><a href="#cb15-1"></a>opt_cut_b</span></code></pre></div>
<pre><code>## # A tibble: 1 x 16
##   direction optimal_cutpoint method          sum_sens_spec      acc sensitivity
##   &lt;chr&gt;                &lt;dbl&gt; &lt;chr&gt;                   &lt;dbl&gt;    &lt;dbl&gt;       &lt;dbl&gt;
## 1 &gt;=                       2 maximize_metric       1.75179 0.864662    0.888889
##   specificity      AUC pos_class neg_class prevalence outcome predictor
##         &lt;dbl&gt;    &lt;dbl&gt; &lt;fct&gt;     &lt;fct&gt;          &lt;dbl&gt; &lt;chr&gt;   &lt;chr&gt;    
## 1    0.862903 0.923779 yes       no         0.0676692 suicide dsi      
##   data               roc_curve                 boot                 
##   &lt;list&gt;             &lt;list&gt;                    &lt;list&gt;               
## 1 &lt;tibble [532 x 2]&gt; &lt;roc_cutpointr [13 x 10]&gt; &lt;tibble [1,000 x 23]&gt;</code></pre>
<p>The returned object has the additional column <code>boot</code> which is a nested tibble that includes the cutpoints per bootstrap sample along with the metric calculated using the function in <code>metric</code> and various default metrics. The metrics are suffixed by <code>_b</code> to indicate in-bag results or <code>_oob</code> to indicate out-of-bag results:</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb17-1"><a href="#cb17-1"></a>opt_cut_b<span class="op">$</span>boot</span></code></pre></div>
<pre><code>## [[1]]
## # A tibble: 1,000 x 23
##    optimal_cutpoint AUC_b AUC_oob sum_sens_spec_b sum_sens_spec_o~ acc_b acc_oob
##               &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt;           &lt;dbl&gt;            &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt;
##  1                2 0.957   0.884            1.80             1.71 0.874   0.842
##  2                1 0.918   0.935            1.70             1.70 0.752   0.771
##  3                2 0.920   0.946            1.79             1.73 0.874   0.864
##  4                2 0.940   0.962            1.82             1.76 0.893   0.851
##  5                2 0.849   0.96             1.66             1.76 0.848   0.887
##  6                4 0.926   0.927            1.80             1.51 0.925   0.881
##  7                2 0.927   0.919            1.74             1.78 0.885   0.862
##  8                2 0.958   0.882            1.82             1.67 0.863   0.861
##  9                4 0.911   0.923            1.80             1.53 0.914   0.879
## 10                1 0.871   0.975            1.62             1.80 0.737   0.820
## # ... with 990 more rows, and 16 more variables: sensitivity_b &lt;dbl&gt;,
## #   sensitivity_oob &lt;dbl&gt;, specificity_b &lt;dbl&gt;, specificity_oob &lt;dbl&gt;,
## #   cohens_kappa_b &lt;dbl&gt;, cohens_kappa_oob &lt;dbl&gt;, TP_b &lt;dbl&gt;, FP_b &lt;dbl&gt;,
## #   TN_b &lt;int&gt;, FN_b &lt;int&gt;, TP_oob &lt;dbl&gt;, FP_oob &lt;dbl&gt;, TN_oob &lt;int&gt;,
## #   FN_oob &lt;int&gt;, roc_curve_b &lt;list&gt;, roc_curve_oob &lt;list&gt;</code></pre>
<p>The summary and plots include additional elements that summarize or display the bootstrap results:</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb19-1"><a href="#cb19-1"></a><span class="kw">summary</span>(opt_cut_b)</span></code></pre></div>
<pre><code>## Method: maximize_metric 
## Predictor: dsi 
## Outcome: suicide 
## Direction: &gt;= 
## Nr. of bootstraps: 1000 
## 
##     AUC   n n_pos n_neg
##  0.9238 532    36   496
## 
##  optimal_cutpoint sum_sens_spec    acc sensitivity specificity tp fn fp  tn
##                 2        1.7518 0.8647      0.8889      0.8629 32  4 68 428
## 
## Predictor summary: 
##     Data Min.   5% 1st Qu. Median      Mean 3rd Qu.  95% Max.       SD NAs
##  Overall    0 0.00       0      0 0.9210526       1 5.00   11 1.852714   0
##       no    0 0.00       0      0 0.6330645       0 4.00   10 1.412225   0
##      yes    0 0.75       4      5 4.8888889       6 9.25   11 2.549821   0
## 
## Bootstrap summary: 
##           Variable Min.   5% 1st Qu. Median Mean 3rd Qu.  95% Max.   SD NAs
##   optimal_cutpoint 1.00 1.00    2.00   2.00 2.12    2.00 4.00 4.00 0.72   0
##              AUC_b 0.83 0.88    0.91   0.93 0.92    0.94 0.96 0.98 0.02   0
##            AUC_oob 0.82 0.86    0.90   0.92 0.92    0.95 0.97 1.00 0.03   0
##    sum_sens_spec_b 1.57 1.67    1.72   1.76 1.76    1.80 1.84 1.89 0.05   0
##  sum_sens_spec_oob 1.37 1.56    1.66   1.72 1.71    1.78 1.86 1.90 0.09   0
##              acc_b 0.73 0.77    0.85   0.87 0.86    0.88 0.91 0.94 0.04   0
##            acc_oob 0.72 0.77    0.85   0.86 0.86    0.88 0.90 0.93 0.04   0
##      sensitivity_b 0.72 0.81    0.86   0.90 0.90    0.94 0.98 1.00 0.05   0
##    sensitivity_oob 0.44 0.67    0.80   0.87 0.86    0.93 1.00 1.00 0.10   0
##      specificity_b 0.72 0.76    0.85   0.86 0.86    0.88 0.91 0.94 0.04   0
##    specificity_oob 0.69 0.76    0.84   0.86 0.86    0.88 0.91 0.94 0.04   0
##     cohens_kappa_b 0.16 0.27    0.37   0.42 0.41    0.46 0.52 0.66 0.07   0
##   cohens_kappa_oob 0.15 0.25    0.34   0.39 0.39    0.44 0.51 0.62 0.08   0</code></pre>
<div class="sourceCode" id="cb21"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb21-1"><a href="#cb21-1"></a><span class="kw">plot</span>(opt_cut_b)</span></code></pre></div>
<p><img src="data:image/png;base64,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" style="display: block; margin: auto;" /></p>
<div id="parallelized-bootstrapping" class="section level3">
<h3>Parallelized bootstrapping</h3>
<p>Using <code>foreach</code> and <code>doRNG</code> the bootstrapping can be parallelized easily. The <strong>doRNG</strong> package is being used to make the bootstrap sampling reproducible.</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb22-1"><a href="#cb22-1"></a><span class="kw">library</span>(doParallel)</span>
<span id="cb22-2"><a href="#cb22-2"></a>cl &lt;-<span class="st"> </span><span class="kw">makeCluster</span>(<span class="dv">2</span>) <span class="co"># 2 cores</span></span>
<span id="cb22-3"><a href="#cb22-3"></a><span class="kw">registerDoParallel</span>(cl)</span>
<span id="cb22-4"><a href="#cb22-4"></a><span class="kw">registerDoRNG</span>(<span class="dv">12</span>) <span class="co"># Reproducible parallel loops using doRNG</span></span>
<span id="cb22-5"><a href="#cb22-5"></a>opt_cut &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(suicide, dsi, suicide, gender, <span class="dt">pos_class =</span> <span class="st">&quot;yes&quot;</span>,</span>
<span id="cb22-6"><a href="#cb22-6"></a>                     <span class="dt">direction =</span> <span class="st">&quot;&gt;=&quot;</span>, <span class="dt">boot_runs =</span> <span class="dv">1000</span>, <span class="dt">allowParallel =</span> <span class="ot">TRUE</span>)</span>
<span id="cb22-7"><a href="#cb22-7"></a><span class="kw">stopCluster</span>(cl)</span>
<span id="cb22-8"><a href="#cb22-8"></a>opt_cut</span></code></pre></div>
</div>
</div>
</div>
<div id="additional-features" class="section level1">
<h1>Additional features</h1>
<div id="finding-all-cutpoints-with-acceptable-performance" class="section level2">
<h2>Finding all cutpoints with acceptable performance</h2>
<p>By default, most packages only return the “best” cutpoint and disregard other cutpoints with quite similar performance, even if the performance differences are minuscule. <strong>cutpointr</strong> makes this process more explicit via the <code>tol_metric</code> argument. For example, if all cutpoints are of interest that achieve at least an accuracy within <code>0.05</code> of the optimally achievable accuracy, <code>tol_metric</code> can be set to <code>0.05</code> and also those cutpoints will be returned.</p>
<p>In the case of the <code>suicide</code> data and when maximizing the sum of sensitivity and specificity, empirically the cutpoints 2 and 3 lead to quite similar performances. If <code>tol_metric</code> is set to <code>0.05</code>, both will be returned.</p>
<div class="sourceCode" id="cb23"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb23-1"><a href="#cb23-1"></a><span class="kw">library</span>(tidyr)</span>
<span id="cb23-2"><a href="#cb23-2"></a><span class="kw">library</span>(dplyr)</span></code></pre></div>
<pre><code>## 
## Attaching package: &#39;dplyr&#39;</code></pre>
<pre><code>## The following objects are masked from &#39;package:stats&#39;:
## 
##     filter, lag</code></pre>
<pre><code>## The following objects are masked from &#39;package:base&#39;:
## 
##     intersect, setdiff, setequal, union</code></pre>
<div class="sourceCode" id="cb27"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb27-1"><a href="#cb27-1"></a>opt_cut &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(suicide, dsi, suicide, <span class="dt">metric =</span> sum_sens_spec, </span>
<span id="cb27-2"><a href="#cb27-2"></a>                     <span class="dt">tol_metric =</span> <span class="fl">0.05</span>, <span class="dt">break_ties =</span> c)</span></code></pre></div>
<pre><code>## Assuming the positive class is yes</code></pre>
<pre><code>## Assuming the positive class has higher x values</code></pre>
<pre><code>## Multiple optimal cutpoints found, applying break_ties.</code></pre>
<div class="sourceCode" id="cb31"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb31-1"><a href="#cb31-1"></a>opt_cut <span class="op">|</span><span class="er">&gt;</span><span class="st"> </span></span>
<span id="cb31-2"><a href="#cb31-2"></a><span class="st">    </span><span class="kw">select</span>(optimal_cutpoint, sum_sens_spec) <span class="op">|</span><span class="er">&gt;</span><span class="st"> </span></span>
<span id="cb31-3"><a href="#cb31-3"></a><span class="st">    </span><span class="kw">unnest</span>(<span class="dt">cols =</span> <span class="kw">c</span>(optimal_cutpoint, sum_sens_spec))</span></code></pre></div>
<pre><code>## # A tibble: 2 x 2
##   optimal_cutpoint sum_sens_spec
##              &lt;dbl&gt;         &lt;dbl&gt;
## 1                2          1.75
## 2                1          1.70</code></pre>
</div>
<div id="manual-and-mean-median-cutpoints" class="section level2">
<h2>Manual and mean / median cutpoints</h2>
<p>Using the <code>oc_manual</code> function the optimal cutpoint will not be determined based on, for example, a metric but is instead set manually using the <code>cutpoint</code> argument. This is useful for supplying and evaluating cutpoints that were found in the literature or in other external sources.</p>
<p>The <code>oc_manual</code> function could also be used to set the cutpoint to the sample mean using <code>cutpoint = mean(data$x)</code>. However, this may introduce bias into the bootstrap validation procedure, since the actual mean of the population is not known and thus the mean to be used as the cutpoint should be automatically determined in every resample. To do so, the <code>oc_mean</code> and <code>oc_median</code> functions can be used.</p>
<div class="sourceCode" id="cb33"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb33-1"><a href="#cb33-1"></a><span class="kw">set.seed</span>(<span class="dv">100</span>)</span>
<span id="cb33-2"><a href="#cb33-2"></a>opt_cut_manual &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(suicide, dsi, suicide, <span class="dt">method =</span> oc_manual, </span>
<span id="cb33-3"><a href="#cb33-3"></a>                       <span class="dt">cutpoint =</span> <span class="kw">mean</span>(suicide<span class="op">$</span>dsi), <span class="dt">boot_runs =</span> <span class="dv">1000</span>)</span>
<span id="cb33-4"><a href="#cb33-4"></a><span class="kw">set.seed</span>(<span class="dv">100</span>)</span>
<span id="cb33-5"><a href="#cb33-5"></a>opt_cut_mean &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(suicide, dsi, suicide, <span class="dt">method =</span> oc_mean, <span class="dt">boot_runs =</span> <span class="dv">1000</span>)</span></code></pre></div>
</div>
<div id="nonstandard-evaluation-via-tidyeval" class="section level2">
<h2>Nonstandard evaluation via tidyeval</h2>
<p>The arguments to <code>cutpointr</code> do not need to be enclosed in quotes. This is possible thanks to nonstandard evaluation of the arguments, which are evaluated on <code>data</code>.</p>
<p>Functions that use nonstandard evaluation are often not suitable for programming with. The use of nonstandard evaluation may lead to scoping problems and subsequent obvious as well as possibly subtle errors. <strong>cutpointr</strong> uses tidyeval internally and accordingly the same rules as for programming with <code>dplyr</code> apply. Arguments can be unquoted with <code>!!</code>:</p>
<div class="sourceCode" id="cb34"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb34-1"><a href="#cb34-1"></a>myvar &lt;-<span class="st"> &quot;dsi&quot;</span></span>
<span id="cb34-2"><a href="#cb34-2"></a><span class="kw">cutpointr</span>(suicide, <span class="op">!!</span>myvar, suicide)</span></code></pre></div>
</div>
<div id="midpoints" class="section level2">
<h2>Midpoints</h2>
<p>So far - which is the default in <code>cutpointr</code> - we have considered all unique values of the predictor as possible cutpoints. An alternative could be to use a sequence of equidistant values instead, for example in the case of the <code>suicide</code> data all integers in <span class="math inline">\([0, 10]\)</span>. However, with very sparse data and small intervals between the candidate cutpoints (i.e. a ‘dense’ sequence like <code>seq(0, 10, by = 0.01)</code>) this leads to the uninformative evaluation of large ranges of cutpoints that all result in the same metric value. A more elegant alternative, not only for the case of sparse data, that is supported by <strong>cutpointr</strong> is the use of a mean value of the optimal cutpoint and the next highest (if <code>direction = &quot;&gt;=&quot;</code>) or the next lowest (if <code>direction = &quot;&lt;=&quot;</code>) predictor value in the data. The result is an optimal cutpoint that is equal to the cutpoint that would be obtained using an infinitely dense sequence of candidate cutpoints and is thus usually more efficient computationally.</p>
<p>This behavior can be activated by setting <code>use_midpoints = TRUE</code>, which is the default. If we use this setting, we obtain an optimal cutpoint of 1.5 for the complete sample on the <code>suicide</code> data instead of 2 when maximizing the sum of sensitivity and specificity.</p>
<p>Assume the following small data set:</p>
<div class="sourceCode" id="cb35"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb35-1"><a href="#cb35-1"></a>dat &lt;-<span class="st"> </span><span class="kw">data.frame</span>(<span class="dt">outcome =</span> <span class="kw">c</span>(<span class="st">&quot;neg&quot;</span>, <span class="st">&quot;neg&quot;</span>, <span class="st">&quot;neg&quot;</span>, <span class="st">&quot;pos&quot;</span>, <span class="st">&quot;pos&quot;</span>, <span class="st">&quot;pos&quot;</span>, <span class="st">&quot;pos&quot;</span>),</span>
<span id="cb35-2"><a href="#cb35-2"></a>                  <span class="dt">pred    =</span> <span class="kw">c</span>(<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">8</span>, <span class="dv">11</span>, <span class="dv">11</span>, <span class="dv">12</span>))</span></code></pre></div>
<p>Since the distance of the optimal cutpoint (8) to the next lowest observation (3) is rather large we arrive at a range of possible cutpoints that all maximize the metric. In the case of this kind of sparseness it might for example be desirable to classify a new observation with a predictor value of 4 as belonging to the negative class. If <code>use_midpoints</code> is set to <code>TRUE</code>, the mean of the optimal cutpoint and the next lowest observation is returned as the optimal cutpoint, if direction is <code>&gt;=</code>. The mean of the optimal cutpoint and the next highest observation is returned as the optimal cutpoint, if <code>direction = &quot;&lt;=&quot;</code>.</p>
<div class="sourceCode" id="cb36"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb36-1"><a href="#cb36-1"></a>opt_cut &lt;-<span class="st"> </span><span class="kw">cutpointr</span>(dat, <span class="dt">x =</span> pred, <span class="dt">class =</span> outcome, <span class="dt">use_midpoints =</span> <span class="ot">TRUE</span>)</span></code></pre></div>
<pre><code>## Assuming the positive class is pos</code></pre>
<pre><code>## Assuming the positive class has higher x values</code></pre>
<div class="sourceCode" id="cb39"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb39-1"><a href="#cb39-1"></a><span class="kw">plot_x</span>(opt_cut)</span></code></pre></div>
<p><img src="data:image/png;base64,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" style="display: block; margin: auto;" /></p>
<p>A simulation demonstrates more clearly that setting <code>use_midpoints = TRUE</code> avoids biasing the cutpoints. To simulate the bias of the metric functions, the predictor values of both classes were drawn from normal distributions with constant standard deviations of 10, a constant mean of the negative class of 100 and higher mean values of the positive class that are selected in such a way that optimal Youden-Index values of 0.2, 0.4, 0.6, and 0.8 result in the population. Samples of 9 different sizes were drawn and the cutpoints that maximize the Youden-Index were estimated. The simulation was repeated 10000 times. As can be seen by the mean error, <code>use_midpoints = TRUE</code> eliminates the bias that is introduced by otherwise selecting the value of an observation as the optimal cutpoint. If <code>direction = &quot;&gt;=&quot;</code>, as in this case, the observation that represents the optimal cutpoint is the highest possible cutpoint that leads to the optimal metric value and thus the biases are positive. The methods <code>oc_youden_normal</code> and <code>oc_youden_kernel</code> are always unbiased, as they don’t select a cutpoint based on the ROC-curve or the function of metric values per cutpoint.</p>
<p><img src="data:image/png;base64,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b/v1NXZKzXETWTflEdzmrhykVdsTAdQiDwLIFwHUIg8CyBcB1CIPAshXfxNMkSYpAojUSQQQqZMIIFInEUCkTloLoPePjz/1pvO0j9LDY77R3gYrj49vyo18cJrcwezH14aOfvQCHBpOOJKt/LCzrf7f32Vr7T1wam2tclIfqFXb1joA8ffwfsZ52kdJvB48sA1GVvON74PZcgezH18bOhoG0z568bV4wn62eCedbfV/WA4P/7a1B95xLatM6gO1autatwhj7nZeLC/05Ht87LS/DTzGN9579gcwRk3soPcTa0NHvw+uuHczmnAgW7STzra69zf+5T9889E/+1d4Dze1tlah1Ads1Va1LkCMcHusvRSLnhBe/W1wSaiNzDi5A9pPDn0MHs2+RBMOZIt2wtn+i3/65uN///fwHm5qba1CqQ/Yqq1qPYAevfDsa87TPmrLi/za8LbxL3IjOFXugPbjP0D4aBiUHUs4lK3ZCWf7/t9krv53fwvvYafW2iqcejVUq7asdSNQLej3bnrb3te1OrYxeq2Gj3788lfiCYeyNTtZ2TZfqy2twqnXRKBdW7VVrd2Mv3czXtQGtt37itn4KFBbsFxtH/3ohZspmaKtZiec7eP/0FxbaGcVTr0asFXb1DoAyRBpP+2Dtj35/pvuNlHjkxvBOLkD2k8VAe7R0tORhIPZ6p2sbJ/8178D7RW8B06tvVVW6tUwrdq61opAD4+PWW0h2mMS2KYqf3xjfY+JezTq9ohm6h6odrKybeoxaW2VnfpArdq2qCea1EkEEKmTCCBSJxFApE4igEidRACROokAInUSAUTqJAKI1En7DtD59W8fzmYnuz6N8WrvATq89qA6vXp31+cxWhFAJxCGbu/6PEarvQcI2CGA1hcBRAB1EgFEAHUSAUQAdRIBRAB10r4DROooAojUSQQQqZMIIFInEUCkTiKASJ1EAJE6iQAidRIBROokAojUSf8fksdgNhwAHxEAAAAASUVORK5CYII=" style="display: block; margin: auto;" /></p>
</div>
</div>



<!-- code folding -->


<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
  (function () {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src  = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
    document.getElementsByTagName("head")[0].appendChild(script);
  })();
</script>

</body>
</html>
back to top