## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")

## ----gaussian-ls-syntax, eval = FALSE-----------------------------------------
# fit <- drmTMB(
#   drm_formula(
#     y ~ x,
#     sigma ~ x
#   ),
#   family = gaussian(),
#   data = dat
# )

## ----lme4-comparator-syntax, eval = FALSE-------------------------------------
# fit <- drmTMB(
#   drm_formula(y ~ x + (1 | id)),
#   family = gaussian(),
#   data = dat
# )
# 
# fit_lme4 <- lme4::lmer(
#   y ~ x + (1 | id),
#   data = dat,
#   REML = FALSE
# )

## ----dense-meta-syntax, eval = FALSE------------------------------------------
# fit <- drmTMB(
#   drm_formula(yi ~ x + meta_V(V = V)),
#   family = gaussian(),
#   data = dat
# )

## ----metafor-comparator-syntax, eval = FALSE----------------------------------
# fit_metafor <- metafor::rma.mv(
#   yi = yi,
#   V = V,
#   mods = ~ x,
#   random = ~ 1 | obs,
#   data = dat,
#   method = "ML"
# )

## ----metafor-comparator-checks, eval = FALSE----------------------------------
# expect_equal(unname(coef(fit, "mu")),
#              unname(stats::coef(fit_metafor)),
#              tolerance = 1e-4)
# expect_equal(stats::sigma(fit)[[1L]]^2,
#              fit_metafor$sigma2[[1L]],
#              tolerance = 1e-4)
# expect_equal(as.numeric(stats::logLik(fit)),
#              as.numeric(stats::logLik(fit_metafor)),
#              tolerance = 1e-4)

## ----mass-nb-comparator-syntax, eval = FALSE----------------------------------
# fit <- drmTMB(
#   drm_formula(count ~ x, sigma ~ 1),
#   family = nbinom2(),
#   data = dat
# )
# 
# fit_mass <- MASS::glm.nb(count ~ x, data = dat)

## ----mass-nb-comparator-checks, eval = FALSE----------------------------------
# expect_equal(unname(coef(fit, "mu")),
#              unname(stats::coef(fit_mass)),
#              tolerance = 1e-4)
# expect_equal(sigma(fit)[[1L]],
#              1 / sqrt(fit_mass$theta),
#              tolerance = 1e-4)
# expect_equal(as.numeric(stats::logLik(fit)),
#              as.numeric(stats::logLik(fit_mass)),
#              tolerance = 1e-4)

## ----beta-comparator-checks, eval = FALSE-------------------------------------
# eta_mu <- as.vector(fit$model$X$mu %*% coef(fit, "mu"))
# eta_sigma <- as.vector(fit$model$X$sigma %*% coef(fit, "sigma"))
# mu <- plogis(eta_mu)
# sigma <- exp(eta_sigma)
# phi <- 1 / sigma^2
# ll_independent <- sum(stats::dbeta(
#   fit$model$y,
#   shape1 = mu * phi,
#   shape2 = (1 - mu) * phi,
#   log = TRUE
# ))
# expect_equal(as.numeric(logLik(fit)), ll_independent, tolerance = 1e-6)

## ----student-syntax, eval = FALSE---------------------------------------------
# fit <- drmTMB(
#   drm_formula(
#     y ~ x,
#     sigma ~ x,
#     nu ~ x
#   ),
#   family = student(),
#   data = dat
# )

## ----independent-student-likelihood, eval = FALSE-----------------------------
# eta_mu <- X_mu %*% beta_mu
# eta_sigma <- X_sigma %*% beta_sigma
# eta_nu <- X_nu %*% beta_nu
# 
# mu <- as.vector(eta_mu)
# sigma <- exp(as.vector(eta_sigma))
# nu <- 2 + exp(as.vector(eta_nu))
# 
# loglik <- sum(
#   stats::dt((y - mu) / sigma, df = nu, log = TRUE) - log(sigma)
# )

## ----independent-truncated-nbinom2-likelihood, eval = FALSE-------------------
# eta_mu <- X_mu %*% beta_mu
# eta_sigma <- X_sigma %*% beta_sigma
# 
# mu <- exp(as.vector(eta_mu))
# sigma <- exp(as.vector(eta_sigma))
# size <- 1 / sigma^2
# 
# log_p0 <- stats::dnbinom(0, mu = mu, size = size, log = TRUE)
# log_positive <- log1p(-exp(log_p0))
# loglik <- sum(
#   stats::dnbinom(y, mu = mu, size = size, log = TRUE) - log_positive
# )

## ----independent-hurdle-nbinom2-likelihood, eval = FALSE----------------------
# eta_mu <- X_mu %*% beta_mu
# eta_sigma <- X_sigma %*% beta_sigma
# eta_hu <- X_hu %*% beta_hu
# 
# mu <- exp(as.vector(eta_mu))
# sigma <- exp(as.vector(eta_sigma))
# hu <- plogis(as.vector(eta_hu))
# size <- 1 / sigma^2
# 
# log_p0 <- stats::dnbinom(0, mu = mu, size = size, log = TRUE)
# log_positive <- log1p(-exp(log_p0))
# loglik <- sum(ifelse(
#   y == 0,
#   log(hu),
#   log1p(-hu) + stats::dnbinom(y, mu = mu, size = size, log = TRUE) -
#     log_positive
# ))

## ----bivariate-rho12-syntax, eval = FALSE-------------------------------------
# fit <- drmTMB(
#   drm_formula(
#     mu1 = y1 ~ x1 + x2,
#     mu2 = y2 ~ x1,
#     sigma1 = ~ x1 + x2,
#     sigma2 = ~ x1,
#     rho12 = ~ x1 + x2
#   ),
#   family = c(gaussian(), gaussian()),
#   data = dat
# )

## ----rejection-test-examples, eval = FALSE------------------------------------
# expect_snapshot(
#   {
#     drmTMB(
#       drm_formula(y ~ x + meta_V(V = V), nu ~ x),
#       family = student(),
#       data = dat
#     )
#   },
#   error = TRUE
# )
# 
# expect_snapshot(
#   {
#     drmTMB(
#       drm_formula(
#         mu1 = y1 ~ x + (1 | id),
#         mu2 = y2 ~ x,
#         sigma1 = ~ 1,
#         sigma2 = ~ 1,
#         rho12 = ~ 1
#       ),
#       family = c(gaussian(), gaussian()),
#       data = dat
#     )
#   },
#   error = TRUE
# )

