Nothing
## ----setup, include=FALSE-----------------------------------------------------
NOT_CRAN <- identical(tolower(Sys.getenv("NOT_CRAN")), "true")
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", eval = NOT_CRAN)
## ----simulate-----------------------------------------------------------------
# library(smoothbp)
#
# dat <- simulate_smoothbp(
# n_subj = 20,
# n_obs = 8,
# b0 = 5.0, # level at change-point
# b1 = -0.3, # pre-change slope
# delta = 1.2, # slope change (delta_1)
# omega = 3.0, # change-point location
# rho = 4.0, # transition sharpness
# sigma = 0.4, # residual SD
# sigma_u = 0.5, # between-subject SD
# tau_range = c(0, 6),
# seed = 42
# )
#
# head(dat)
# true_params(dat)
## ----fit-zero-bp--------------------------------------------------------------
# fit0 <- smoothbp(
# formula = y ~ tau,
# b0 = ~ 1 + (1 | subject),
# b1 = ~ 1,
# deltas = list(), # no change-points
# omega = list(),
# rho = list(),
# data = dat,
# chains = 2L, iter = 1000L, warmup = 500L, seed = 42L, .verbose = FALSE
# )
# summary(fit0)
## ----fit-one-bp---------------------------------------------------------------
# fit1 <- smoothbp(
# formula = y ~ tau,
# b0 = ~ 1 + (1 | subject),
# b1 = ~ 1,
# deltas = list(~ 1), # one slope change
# omega = list(~ 1), # one change-point location
# rho = list(~ 1), # one sharpness
# data = dat,
# priors = smoothbp_priors(
# omega = list(prior_normal(3, 2, lb = 0))
# ),
# chains = 4L, iter = 2000L, warmup = 1000L, seed = 42L
# )
# summary(fit1)
## ----fit-multi-bp-------------------------------------------------------------
# # Fit a model with 3 candidate breakpoints
# fit3 <- smoothbp(
# formula = y ~ tau,
# b0 = ~ 1 + (1 | subject),
# b1 = ~ 1,
# # Each segment gets its own formula (here, just an intercept)
# deltas = list(~ 1, ~ 1, ~ 1),
# omega = list(~ 1, ~ 1, ~ 1),
# rho = list(~ 1, ~ 1, ~ 1),
# data = dat,
# priors = smoothbp_priors(
# # Use the space_omega_priors helper to initialize the search
# omega = space_omega_priors(K = 3, tau_min = 0, tau_max = 6)
# )
# )
## ----fit-fixed----------------------------------------------------------------
# # Test for a hard kink at exactly tau = 3.0
# fit_fixed <- smoothbp_ss(
# formula = y ~ tau,
# omega = list(fixed(3.0)), # Location is known
# rho = list(fixed(100)), # Sharpness is fixed (hard kink)
# data = dat
# )
#
# # The PIP tells us the probability that the intervention had an effect
# pip(fit_fixed)
## ----fit-parallel-------------------------------------------------------------
# fit1 <- smoothbp(
# formula = y ~ tau,
# b0 = ~ 1 + (1 | subject),
# data = dat,
# chains = 4L, iter = 2000L, warmup = 1000L, seed = 42L,
# cores = 4L # run all 4 chains concurrently
# )
## ----rprofile, eval=FALSE-----------------------------------------------------
# options(smoothbp.cores = parallel::detectCores())
## ----summary------------------------------------------------------------------
# print(fit1) # fixed + ran_pars (default)
# print(fit1, effects = "fixed") # population-level only
# summary(fit1, effects = "all") # returns everything, including u[j]
## ----trace--------------------------------------------------------------------
# plot(fit1) # alias for trace_plot(fit1)
# trace_plot(fit1, type = "both") # trace + density
## ----trace-strict-------------------------------------------------------------
# trace_plot(fit1, rhat_thresh = 1.01, ess_thresh = 400)
## ----pp-check-----------------------------------------------------------------
# pp_check(fit1)
## ----priors-------------------------------------------------------------------
# smoothbp_priors(
# b0 = prior_normal(0, 10),
# b1 = prior_normal(0, 5),
# omega = list(
# prior_normal(2, 1), # change-point 1
# prior_normal(5, 1) # change-point 2
# ),
# rho = list(
# prior_normal(4, 2, lb = 0),
# prior_normal(4, 2, lb = 0)
# ),
# sigma = prior_invgamma(shape = 2, scale = 1)
# )
## ----ss-overview--------------------------------------------------------------
# fit_ss <- smoothbp_ss(
# formula = y ~ tau,
# b0 = ~ 1 + (1 | subject),
# b1 = ~ 1,
# deltas = list(~ 1, ~ 1, ~ 1), # 3 candidate breakpoints
# omega = list(~ 1, ~ 1, ~ 1),
# rho = list(~ 1, ~ 1, ~ 1),
# data = dat,
# spike = prior_spike_slab(pi = 0.1, learn_pi = TRUE),
# chains = 4L, iter = 2000L, warmup = 1000L, seed = 42L
# )
#
# # Posterior inclusion probabilities per breakpoint
# pip(fit_ss)
# #> gamma_delta1_(Intercept) gamma_delta2_(Intercept) gamma_delta3_(Intercept)
# #> 0.987 0.063 0.041
## ----hypothesis-directional---------------------------------------------------
# # Is the slope change at breakpoint 1 positive?
# smoothbp::hypothesis(fit1, "delta1_(Intercept) > 0")
#
# # Complex linear hypothesis: is the final slope (b1 + delta1) negative?
# smoothbp::hypothesis(fit1, "b1_(Intercept) + delta1_(Intercept) < 0")
#
# # Does the change-point fall before time 4?
# smoothbp::hypothesis(fit1, "omega1_(Intercept) < 4")
## ----loo----------------------------------------------------------------------
# # Compare 0-BP (linear) vs 1-BP vs 3-BP models
# loo0 <- loo(fit0)
# loo1 <- loo(fit1)
# loo3 <- loo(fit3)
#
# loo::loo_compare(loo0, loo1, loo3)
## ----bridge-sampler-----------------------------------------------------------
# library(bridgesampling)
# bs0 <- bridge_sampler(fit0)
# bs1 <- bridge_sampler(fit1)
# bayes_factor(bs1, bs0)
## ----fitted-training----------------------------------------------------------
# # Posterior mean + 95% CI at training observations
# fitted(fit1)
#
# # Full posterior draws matrix (n_draws × n_obs)
# draws_mat <- fitted(fit1, summary = FALSE)
## ----draws-manip--------------------------------------------------------------
# library(posterior)
#
# # Convert to a data frame for use with ggplot2
# draws_df <- as_draws_df(fit1$draws)
#
# # Extract a specific parameter
# b1_draws <- draws_df$`b1_(Intercept)`
#
# # Compute custom summaries
# summarise_draws(fit1$draws, "mean", "sd", ~quantile(.x, c(0.1, 0.9)))
## ----fitted-marginal----------------------------------------------------------
# # Population-level predictions at new time points
# newdata_marginal <- data.frame(tau = seq(0, 6, by = 0.1))
# fitted(fit1, newdata = newdata_marginal)
## ----fitted-conditional-------------------------------------------------------
# # Subject-specific predictions
# fitted(fit1, newdata = data.frame(tau = seq(0, 6, by = 0.1), subject = "1"))
## ----capture-example, eval=FALSE----------------------------------------------
# methods_txt <- model_methods(fit1)
# results_txt <- model_results(fit1)
## ----model-methods------------------------------------------------------------
# model_methods(fit1)
## ----model-results------------------------------------------------------------
# model_results(fit1)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.