## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 10, fig.height = 5, fig.align = "center", warning = FALSE, message = FALSE, digits = 4 ) kbl10 <- function(x, n = 10, digits = 4, ...) { knitr::kable(utils::head(as.data.frame(x), n), digits = digits, align = "c", ...) } ## ----install, eval = FALSE---------------------------------------------------- # # Development version from GitHub: # # install.packages("remotes") # remotes::install_github("evandeilton/betaregscale") ## ----library------------------------------------------------------------------ library(betaregscale) ## ----check-response----------------------------------------------------------- # Illustrate brs_check with a 0-10 NRS scale y_example <- c(0, 3, 5, 7, 10) cr <- brs_check(y_example, ncuts = 10) kbl10(cr) ## ----bs-prepare-mode1--------------------------------------------------------- # Equivalent to brs_check - delta inferred from y d1 <- data.frame(y = c(0, 3, 5, 7, 10), x1 = rnorm(5)) kbl10(brs_prep(d1, ncuts = 10)) ## ----bs-prepare-mode2--------------------------------------------------------- # Analyst specifies delta directly d2 <- data.frame( y = c(50, 0, 99, 50), delta = c(0, 1, 2, 3), x1 = rnorm(4) ) kbl10(brs_prep(d2, ncuts = 100)) ## ----bs-prepare-mode3--------------------------------------------------------- d3 <- data.frame( left = c(NA, 20, 30, NA), right = c(5, NA, 45, NA), y = c(NA, NA, NA, 50), x1 = rnorm(4) ) kbl10(brs_prep(d3, ncuts = 100)) ## ----bs-prepare-mode4--------------------------------------------------------- d4 <- data.frame( y = c(50, 75), left = c(48, 73), right = c(52, 77), x1 = rnorm(2) ) kbl10(brs_prep(d4, ncuts = 100)) ## ----prepare-workflow--------------------------------------------------------- set.seed(42) n <- 1000 dat <- data.frame(x1 = rnorm(n), x2 = rnorm(n)) sim <- brs_sim( formula = ~ x1 + x2, data = dat, beta = c(0.2, -0.5, 0.3), phi = 0.3, link = "logit", link_phi = "logit", repar = 2 ) # Remove left, right, yt so brs_prep can rebuild them prep <- brs_prep(sim[-c(1:3)], ncuts = 100) fit_prep <- brs(y ~ x1 + x2, data = prep, repar = 2, link = "logit", link_phi = "logit" ) summary(fit_prep, digits = 4) ## ----sim-fixed---------------------------------------------------------------- set.seed(4255) n <- 1000 dat <- data.frame(x1 = rnorm(n), x2 = rnorm(n)) sim_fixed <- brs_sim( formula = ~ x1 + x2, data = dat, beta = c(0.3, -0.6, 0.4), phi = 1 / 10, link = "logit", link_phi = "logit", ncuts = 100, repar = 2 ) kbl10(head(sim_fixed, 8)) ## ----fit-fixed---------------------------------------------------------------- fit_fixed <- brs( y ~ x1 + x2, data = sim_fixed, link = "logit", link_phi = "logit", repar = 2 ) summary(fit_fixed) ## ----gof-fixed---------------------------------------------------------------- kbl10(brs_gof(fit_fixed)) ## ----compare-links------------------------------------------------------------ links <- c("logit", "probit", "cauchit", "cloglog") fits <- lapply(setNames(links, links), function(lnk) { brs(y ~ x1 + x2, data = sim_fixed, link = lnk, repar = 2) }) # Estimates est_table <- do.call(rbind, lapply(names(fits), function(lnk) { e <- brs_est(fits[[lnk]]) e$link <- lnk e })) kbl10(est_table) # Goodness of fit gof_table <- do.call(rbind, lapply(fits, brs_gof)) kbl10(gof_table) ## ----plot-fixed, fig.height = 6----------------------------------------------- plot(fit_fixed, caption = NULL, gg = TRUE, title = NULL, theme = ggplot2::theme_bw()) ## ----plot-fixed-gg, eval = requireNamespace("ggplot2", quietly = TRUE), fig.height = 6---- plot(fit_fixed, gg = TRUE) ## ----predict-fixed------------------------------------------------------------ # Fitted means kbl10( data.frame(mu_hat = head(predict(fit_fixed, type = "response"))), digits = 4 ) # Conditional variance kbl10( data.frame(var_hat = head(predict(fit_fixed, type = "variance"))), digits = 4 ) # Quantile predictions kbl10(predict(fit_fixed, type = "quantile", at = c(0.10, 0.25, 0.5, 0.75, 0.90))) ## ----confint-fixed------------------------------------------------------------ kbl10(confint(fit_fixed)) kbl10(confint(fit_fixed, model = "mean")) ## ----censoring-summary, fig.height = 5---------------------------------------- brs_cens(fit_fixed, gg = TRUE, inform = TRUE) ## ----sim-variable------------------------------------------------------------- set.seed(2222) n <- 1000 dat_z <- data.frame( x1 = rnorm(n), x2 = rnorm(n), x3 = rbinom(n, size = 1, prob = 0.5), z1 = rnorm(n), z2 = rnorm(n) ) sim_var <- brs_sim( formula = ~ x1 + x2 + x3 | z1 + z2, data = dat_z, beta = c(0.2, -0.6, 0.2, 0.2), zeta = c(0.2, -0.8, 0.6), link = "logit", link_phi = "logit", ncuts = 100, repar = 2 ) kbl10(head(sim_var, 10)) ## ----fit-variable------------------------------------------------------------- fit_var <- brs( y ~ x1 + x2 | z1, data = sim_var, link = "logit", link_phi = "logit", repar = 2 ) summary(fit_var) ## ----coef-variable------------------------------------------------------------ # Full parameter vector round(coef(fit_var), 4) # Mean submodel only round(coef(fit_var, model = "mean"), 4) # Precision submodel only round(coef(fit_var, model = "precision"), 4) # Variance-covariance matrix for the mean submodel kbl10(vcov(fit_var, model = "mean")) ## ----compare-links-var-------------------------------------------------------- links <- c("logit", "probit", "cauchit", "cloglog") fits_var <- lapply(setNames(links, links), function(lnk) { brs(y ~ x1 + x2 | z1, data = sim_var, link = lnk, repar = 2) }) # Estimates est_var <- do.call(rbind, lapply(names(fits_var), function(lnk) { e <- brs_est(fits_var[[lnk]]) e$link <- lnk e })) kbl10(est_var) # Goodness of fit gof_var <- do.call(rbind, lapply(fits_var, brs_gof)) kbl10(gof_var) ## ----plot-variable, fig.height = 6-------------------------------------------- plot(fit_var) ## ----bootstrap-fixed---------------------------------------------------------- set.seed(101) boot_ci <- brs_bootstrap( fit_fixed, R = 100, level = 0.95, ci_type = "bca", keep_draws = TRUE ) kbl10(head(boot_ci, 10)) ## ----bootstrap-forest, eval = requireNamespace("ggplot2", quietly = TRUE)----- autoplot.brs_bootstrap( boot_ci, type = "ci_forest", title = "Bootstrap (BCa) vs Wald intervals" ) ## ----marginaleffects-fixed---------------------------------------------------- set.seed(202) ame <- brs_marginaleffects( fit_fixed, model = "mean", type = "response", interval = TRUE, n_sim = 120, keep_draws = TRUE ) kbl10(ame) ## ----marginaleffects-plot, eval = requireNamespace("ggplot2", quietly = TRUE)---- autoplot.brs_marginaleffects(ame, type = "forest") ## ----scoreprob-fixed---------------------------------------------------------- prob_scores <- brs_predict_scoreprob(fit_fixed, scores = 0:10) kbl10(prob_scores[1:6, 1:6]) kbl10( data.frame(row_sum = rowSums(prob_scores)[1:6]), digits = 4 ) ## ----cv-fixed----------------------------------------------------------------- set.seed(303) # For cross-validation reproducibility cv_res <- brs_cv( y ~ x1 + x2, data = sim_fixed, k = 5, repeats = 5, repar = 2, ) kbl10(cv_res) kbl10( data.frame( metric = c("log_score", "rmse_yt", "mae_yt"), mean = c( mean(cv_res$log_score, na.rm = TRUE), mean(cv_res$rmse_yt, na.rm = TRUE), mean(cv_res$mae_yt, na.rm = TRUE) ) ), digits = 4 ) ## ----reparam------------------------------------------------------------------ # Precision parameterization: mu = 0.5, phi = 10 (high precision) brs_repar(mu = 0.5, phi = 10, repar = 1) # Mean-variance parameterization: mu = 0.5, phi = 0.1 (low dispersion) brs_repar(mu = 0.5, phi = 0.1, repar = 2)