## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(fig.width = 6, fig.height = 5, fig.align = "center")
options(rmarkdown.html_vignette.check_title = FALSE)
load("vignettedata/vignettedata.Rdata")

## ----CRAN, eval = FALSE-------------------------------------------------------
#  install.packages("cutpointr")

## -----------------------------------------------------------------------------
library(cutpointr)
data(suicide)
head(suicide)
cp <- cutpointr(suicide, dsi, suicide, 
                method = maximize_metric, metric = sum_sens_spec)

## -----------------------------------------------------------------------------
summary(cp)

## -----------------------------------------------------------------------------
plot(cp)

## -----------------------------------------------------------------------------
opt_cut <- cutpointr(suicide, dsi, suicide, direction = ">=", pos_class = "yes",
                     neg_class = "no", method = maximize_metric, metric = youden)

## -----------------------------------------------------------------------------
plot_metric(opt_cut)

## -----------------------------------------------------------------------------
predict(opt_cut, newdata = data.frame(dsi = 0:5))

## ----separate subgroups and bootstrapping, eval = FALSE-----------------------
#  set.seed(12)
#  opt_cut_b <- cutpointr(suicide, dsi, suicide, boot_runs = 1000)

## -----------------------------------------------------------------------------
opt_cut_b

## -----------------------------------------------------------------------------
opt_cut_b$boot

## -----------------------------------------------------------------------------
summary(opt_cut_b)
plot(opt_cut_b)

## ----eval = FALSE-------------------------------------------------------------
#  library(doParallel)
#  cl <- makeCluster(2) # 2 cores
#  registerDoParallel(cl)
#  registerDoRNG(12) # Reproducible parallel loops using doRNG
#  opt_cut <- cutpointr(suicide, dsi, suicide, gender, pos_class = "yes",
#                       direction = ">=", boot_runs = 1000, allowParallel = TRUE)
#  stopCluster(cl)
#  opt_cut

## -----------------------------------------------------------------------------
library(tidyr)
library(dplyr)
opt_cut <- cutpointr(suicide, dsi, suicide, metric = sum_sens_spec, 
                     tol_metric = 0.05, break_ties = c)
opt_cut |> 
    select(optimal_cutpoint, sum_sens_spec) |> 
    unnest(cols = c(optimal_cutpoint, sum_sens_spec))

## ----eval = FALSE-------------------------------------------------------------
#  set.seed(100)
#  opt_cut_manual <- cutpointr(suicide, dsi, suicide, method = oc_manual,
#                         cutpoint = mean(suicide$dsi), boot_runs = 1000)
#  set.seed(100)
#  opt_cut_mean <- cutpointr(suicide, dsi, suicide, method = oc_mean, boot_runs = 1000)

## ----eval = FALSE-------------------------------------------------------------
#  myvar <- "dsi"
#  cutpointr(suicide, !!myvar, suicide)

## -----------------------------------------------------------------------------
dat <- data.frame(outcome = c("neg", "neg", "neg", "pos", "pos", "pos", "pos"),
                  pred    = c(1, 2, 3, 8, 11, 11, 12))

## -----------------------------------------------------------------------------
opt_cut <- cutpointr(dat, x = pred, class = outcome, use_midpoints = TRUE)
plot_x(opt_cut)

## ----echo = FALSE-------------------------------------------------------------
plotdat_nomidpoints <- structure(list(sim_nr = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 
7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 
10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 
12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 
14L, 14L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 16L, 
16L, 17L, 17L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 
19L, 19L, 19L, 19L, 19L, 19L, 20L, 20L, 20L, 20L, 20L, 20L, 21L, 
21L, 21L, 21L, 21L, 21L, 22L, 22L, 22L, 22L, 22L, 22L, 23L, 23L, 
23L, 23L, 23L, 23L, 24L, 24L, 24L, 24L, 24L, 24L, 25L, 25L, 25L, 
25L, 25L, 25L, 26L, 26L, 26L, 26L, 26L, 26L, 27L, 27L, 27L, 27L, 
27L, 27L, 28L, 28L, 28L, 28L, 28L, 28L, 29L, 29L, 29L, 29L, 29L, 
29L, 30L, 30L, 30L, 30L, 30L, 30L, 31L, 31L, 31L, 31L, 31L, 31L, 
32L, 32L, 32L, 32L, 32L, 32L, 33L, 33L, 33L, 33L, 33L, 33L, 34L, 
34L, 34L, 34L, 34L, 34L, 35L, 35L, 35L, 35L, 35L, 35L, 36L, 36L, 
36L, 36L, 36L, 36L), method = structure(c(1L, 2L, 3L, 4L, 7L, 
8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 
4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 
2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 
8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 
4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 
2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 
8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 
4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 
2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 
8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 
4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 
2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 
8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 4L, 7L, 8L, 1L, 2L, 3L, 
4L, 7L, 8L), levels = c("emp", "normal", "loess", "boot", "spline", 
"spline_20", "kernel", "gam"), class = "factor"), n = c(30, 30, 
30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 75, 75, 75, 75, 75, 75, 
100, 100, 100, 100, 100, 100, 150, 150, 150, 150, 150, 150, 250, 
250, 250, 250, 250, 250, 500, 500, 500, 500, 500, 500, 750, 750, 
750, 750, 750, 750, 1000, 1000, 1000, 1000, 1000, 1000, 30, 30, 
30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 75, 75, 75, 75, 75, 75, 
100, 100, 100, 100, 100, 100, 150, 150, 150, 150, 150, 150, 250, 
250, 250, 250, 250, 250, 500, 500, 500, 500, 500, 500, 750, 750, 
750, 750, 750, 750, 1000, 1000, 1000, 1000, 1000, 1000, 30, 30, 
30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 75, 75, 75, 75, 75, 75, 
100, 100, 100, 100, 100, 100, 150, 150, 150, 150, 150, 150, 250, 
250, 250, 250, 250, 250, 500, 500, 500, 500, 500, 500, 750, 750, 
750, 750, 750, 750, 1000, 1000, 1000, 1000, 1000, 1000, 30, 30, 
30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 75, 75, 75, 75, 75, 75, 
100, 100, 100, 100, 100, 100, 150, 150, 150, 150, 150, 150, 250, 
250, 250, 250, 250, 250, 500, 500, 500, 500, 500, 500, 750, 750, 
750, 750, 750, 750, 1000, 1000, 1000, 1000, 1000, 1000), mean_err = c(0.532157164015659, 
0.0344907054484091, 1.09430750651166, 0.847845162156675, 0.0430309247027736, 
0.785821459035346, 0.368063404388512, 0.0256197760404459, 0.54480529648463, 
0.54385597929651, 0.0400491342691897, 0.515688005217413, 0.256713912589642, 
0.0444582875885996, 0.326975493112402, 0.371128780921122, 0.105044360789378, 
0.301924717299333, 0.207750921776918, -0.00318128936770314, 0.215170156089776, 
0.27218780048926, 0.0209319074923902, 0.232957055204834, 0.0726605917614469, 
-0.00282823355849125, 0.0753216783313991, 0.147121931849656, 
-0.0117861260923649, 0.0650845904350442, 0.0985144485083747, 
0.00601003227249322, 0.107439979908118, 0.120777421732797, 0.0340166854141625, 
0.107851118082414, 0.0249685210781582, -0.00275219600614378, 
0.0258069390207201, 0.0303381972274654, -0.0172319489562159, 
0.0230957871932473, 0.00787486424680835, -0.018438041997315, 
-0.000808033567394628, -0.00151904153864496, -0.0411584927473141, 
-0.0462075435919094, 0.0481149217843661, -0.0115241085997692, 
0.0278045708419731, 0.0358588316426625, 0.0298772985879321, 0.0494939492036379, 
0.561286668337778, 0.0210874502384648, 0.607711822769155, 0.944733906256477, 
0.0138075109769806, 0.640859854412358, 0.284873604303057, -0.0170357985365701, 
0.273426417633118, 0.524432737895336, -0.0316296929553873, 0.270109834098986, 
0.174110335581819, 0.0253101719615279, 0.199956222742702, 0.375485416120771, 
0.0325126314233263, 0.253352659868514, 0.154840760004461, 0.00231589709639472, 
0.154412480165179, 0.264847742842386, 0.0207139021497755, 0.17351041376412, 
0.14190910348156, -0.000766834484010096, 0.159975205214477, 0.191222128926019, 
-0.00429047209392067, 0.120982527821078, 0.0756304869484406, 
-0.00890884219048113, 0.0727782693168392, 0.118690444738942, 
0.0182926240912726, 0.0887155007804252, 0.00799604720502299, 
0.000599148388616836, -0.00567769035990384, 0.0358412514670032, 
-0.000180318451026095, 0.0180733341290925, 0.00456876236626807, 
0.00150574966485876, 0.011152095953916, 0.0176039119729626, -0.0108877417404102, 
0.00341198000323035, -0.00198459880370283, 0.0026551895445694, 
0.00199040664534129, 0.0150165794544221, -0.00850278571195971, 
0.000833666619266177, 0.714730067273087, -0.00916546079360956, 
0.662799490366986, 1.18552468844156, 0.0311066140197676, 0.699068058809396, 
0.451908043813962, 0.0131716226592205, 0.429551369887738, 0.697928133235757, 
0.0318707241721211, 0.406284953982951, 0.257736307754364, -0.00525924423719458, 
0.236977000055322, 0.429144726596141, 0.0103657879176852, 0.254728590646094, 
0.187783398487578, -0.00216064381479362, 0.209025103860707, 0.318293592390017, 
-0.00355723971644246, 0.174111826408428, 0.151010324964235, 0.0152409223899092, 
0.159002511320467, 0.214643583389694, 0.00736196817594524, 0.115637867729083, 
0.0491348055596302, -0.00133957946235943, 0.0507437758212659, 
0.103956325245849, -0.0124376134651938, 0.0632317888879588, 0.0322195712438111, 
0.00170122889182022, 0.0287526766624194, 0.0589662164030242, 
-0.00617539706415593, 0.0274246010641889, 0.0325877909680824, 
0.00530528253248245, 0.0221776555499961, 0.0389702052631117, 
-0.0016189234058987, 0.0197144417326668, -0.00632485262604172, 
-0.00364979854195596, -0.00276076468388984, 0.0126267527301874, 
-0.00591512196680815, 0.0098685016547149, 1.19276916750486, -0.0296831640401583, 
0.99406393593888, 1.95758669445116, -0.0240222410217233, 1.00771193034927, 
0.748151091428865, 0.001671855025917, 0.665180535306263, 1.1777049634557, 
0.0292152981607387, 0.615230814912951, 0.417886753756131, 0.00324593885807739, 
0.406076310942717, 0.732191741449251, -0.000759357576337989, 
0.350075431324921, 0.310927617707656, -0.0107255472998434, 0.28102101085112, 
0.514683023356017, -0.0220885572014814, 0.243370611433649, 0.209652330609093, 
-0.00502865663759991, 0.2172246261346, 0.356540958804122, 0.00365942442127361, 
0.176594681455494, 0.126956927057327, -0.00270525933073803, 0.120116234221594, 
0.210827536708082, 0.00238043252144371, 0.113027315928011, 0.0598624378953727, 
-0.00538838415690431, 0.0568400730102315, 0.0978115258288965, 
-0.00165813015281622, 0.0521772135812508, 0.0530224090961669, 
-0.000416993405198653, 0.0353236911458531, 0.0605493601241619, 
-0.00446984887315054, 0.0328807595695966, 0.0396438546423947, 
-0.00331466369719113, 0.0379029847219126, 0.0572435100638761, 
0.00220241478536399, 0.0307132312422208), youden = c(0.2, 0.2, 
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 
0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 
0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 
0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 
0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 
0.4, 0.4, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 
0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 
0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 
0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 
0.6, 0.6, 0.6, 0.6, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 
0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 
0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 
0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 
0.8, 0.8, 0.8, 0.8, 0.8, 0.8)), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -216L), groups = structure(list(
    sim_nr = 1:36, .rows = structure(list(1:6, 7:12, 13:18, 19:24, 
        25:30, 31:36, 37:42, 43:48, 49:54, 55:60, 61:66, 67:72, 
        73:78, 79:84, 85:90, 91:96, 97:102, 103:108, 109:114, 
        115:120, 121:126, 127:132, 133:138, 139:144, 145:150, 
        151:156, 157:162, 163:168, 169:174, 175:180, 181:186, 
        187:192, 193:198, 199:204, 205:210, 211:216), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -36L), .drop = TRUE, class = c("tbl_df", 
"tbl", "data.frame")))

## ----echo = FALSE-------------------------------------------------------------
library(ggplot2)
ggplot(plotdat_nomidpoints, 
       aes(x = n, y = mean_err, color = method, shape = method)) + 
    geom_line() + geom_point() +
    facet_wrap(~ youden, scales = "fixed") +
    scale_shape_manual(values = 1:nlevels(plotdat_nomidpoints$method)) +
    scale_x_log10(breaks = c(30, 50, 75, 100, 150, 250, 500, 750, 1000)) +
    ggtitle("Bias of all methods when use_midpoints = FALSE",
            "normally distributed data, 10000 repetitions of simulation")