Nothing
## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>", # R console style comments
dev = "png",
dpi = 144,
fig.width = 7,
fig.height = 5,
warning = FALSE, # Suppress warnings for cleaner output
message = FALSE, # Suppress messages for cleaner output
cache = TRUE, # Cache for faster rebuilds
cache.path = "mixed-demand_cache/",
autodep = TRUE
)
library(beezdemand)
library(dplyr)
library(ggplot2)
data("apt", package = "beezdemand", envir = environment())
data("ko", package = "beezdemand", envir = environment())
cache_key_object <- function(x) {
tmp <- tempfile(fileext = ".rds")
saveRDS(x, tmp)
on.exit(unlink(tmp), add = TRUE)
unname(tools::md5sum(tmp))
}
# Invalidate cache when the package data changes.
knitr::opts_chunk$set(
cache.extra = list(
beezdemand_version = as.character(utils::packageVersion("beezdemand")),
apt = cache_key_object(apt),
ko = cache_key_object(ko)
)
)
## -----------------------------------------------------------------------------
quick_nlme_control <- nlme::nlmeControl(
msMaxIter = 100,
niterEM = 20,
maxIter = 100, # Low iterations for speed
pnlsTol = 0.1,
tolerance = 1e-4, # Looser tolerance
opt = "nlminb",
msVerbose = FALSE
)
## ----apt_zben_fit-------------------------------------------------------------
apt_ll4 <- apt |>
mutate(y_ll4 = ll4(y))
fit_apt_zben <- fit_demand_mixed(
data = apt_ll4,
y_var = "y_ll4",
x_var = "x",
id_var = "id",
equation_form = "zben",
nlme_control = quick_nlme_control,
start_value_method = "heuristic"
)
print(fit_apt_zben)
## ----apt_zben_plot, cache = FALSE---------------------------------------------
plot(
fit_apt_zben,
inv_fun = ll4_inv,
y_trans = "pseudo_log",
x_trans = "pseudo_log",
show_pred_lines = c("population", "individual")
) +
facet_wrap(
~id
)
## ----apt_simplified_fit-------------------------------------------------------
fit_apt_simplified <- fit_demand_mixed(
data = apt_ll4,
y_var = "y",
x_var = "x",
id_var = "id",
equation_form = "simplified",
nlme_control = quick_nlme_control,
start_value_method = "heuristic"
)
print(fit_apt_simplified)
## ----apt_simplified_plot, cache = FALSE---------------------------------------
plot(
fit_apt_simplified,
x_trans = "pseudo_log",
show_pred_lines = c("population", "individual")
) +
facet_wrap(
~id
)
## ----apt_exponentiated_fit----------------------------------------------------
fit_apt_exponentiated <- fit_demand_mixed(
data = apt,
y_var = "y",
x_var = "x",
id_var = "id",
equation_form = "exponentiated",
k = NULL,
nlme_control = quick_nlme_control,
start_value_method = "heuristic"
)
print(fit_apt_exponentiated)
## ----inspect_fit--------------------------------------------------------------
glance(fit_apt_zben)
tidy(fit_apt_zben) |> head()
augment(fit_apt_zben) |> head()
## ----diagnostics--------------------------------------------------------------
check_demand_model(fit_apt_zben)
plot_residuals(fit_apt_zben)$fitted
## -----------------------------------------------------------------------------
# Make sure a similar 'fit_no_factors' was created successfully in your environment
# For the vignette, let's create one that is more likely to converge quickly
# by using only Alfentanil data, which is less complex than the full dataset.
ko_alf <- ko[ko$drug == "Alfentanil", ]
fit_no_factors_vignette <- fit_demand_mixed(
data = ko_alf,
y_var = "y_ll4",
x_var = "x",
id_var = "monkey",
equation_form = "zben",
nlme_control = quick_nlme_control, # Use quicker control for vignette
start_value_method = "heuristic" # Heuristic is faster for simple model
)
print(fit_no_factors_vignette)
## -----------------------------------------------------------------------------
fit_one_factor_dose <- fit_demand_mixed(
data = ko_alf,
y_var = "y_ll4",
x_var = "x",
id_var = "monkey",
factors = "dose",
equation_form = "zben",
nlme_control = quick_nlme_control,
start_value_method = "heuristic"
)
print(fit_one_factor_dose)
## -----------------------------------------------------------------------------
# Summary
summary(fit_one_factor_dose)
# Fixed effects
coef(fit_one_factor_dose, type = "fixed")
# Random effects (deviations from fixed)
head(coef(fit_one_factor_dose, type = "random"))
# Subject-specific coefficients (fixed + random)
head(coef(fit_one_factor_dose, type = "combined"))
# Access nlme fixef/ranef directly
nlme::fixef(fit_one_factor_dose)
utils::head(nlme::ranef(fit_one_factor_dose))
# Start values that were used for the NLME fit
fit_one_factor_dose$start_values_used
## -----------------------------------------------------------------------------
# Population-level predictions (log10 scale for 'zben')
preds_pop_log <- predict(fit_one_factor_dose, level = 0)
head(preds_pop_log)
# Population-level predictions (natural scale, back-transformed)
preds_pop_natural <- predict(
fit_one_factor_dose,
level = 0,
inv_fun = ll4_inv
)
head(preds_pop_natural)
# Group-level predictions for first few data points
sample_newdata <- fit_one_factor_dose$data[1:5, ]
preds_group_log <- predict(fit_one_factor_dose, newdata = sample_newdata, level = 1)
preds_group_log
## ----plot_one_factor, cache = FALSE, fig.cap="Demand curves for Alfentanil by dose (population level). y-axis on natural scale."----
plot(
fit_one_factor_dose,
inv_fun = ll4_inv,
color_by = "dose",
shape_by = "dose",
observed_point_alpha = 0.7,
title = "Alfentanil Demand by Dose (Population Fit)"
)
## ----plot_one_factor_individual, cache = FALSE--------------------------------
plot(
fit_one_factor_dose,
show_pred_lines = "individual",
inv_fun = ll4_inv,
color_by = "dose",
observed_point_alpha = 0.4,
y_trans = "pseudo_log",
ind_line_alpha = .5,
title = "Alfentanil Demand by Dose (Subject-Specific Fits)"
) +
ggplot2::guides(color = guide_legend(override.aes = list(alpha = 1))) +
facet_grid(~monkey)
## ----plot_one_factor_axes, cache = FALSE--------------------------------------
plot(
fit_one_factor_dose,
inv_fun = ll4_inv,
color_by = "dose",
x_trans = "pseudo_log",
y_trans = "pseudo_log",
title = "Alfentanil Demand (Log10 Price Scale)"
)
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.