## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)
library(TKApprox)

## -----------------------------------------------------------------------------
# Gamma prior for exponential rate parameter
pdf_exp <- function(x, param) dexp(x, rate = param)
cdf_exp <- function(x, param) pexp(x, rate = param)

prior_spec <- list(
  rate = list(family = "gamma", hyperparameters = list(shape = 2, rate = 1))
)

set.seed(123)
data <- rexp(20, rate = 1.5)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_exp,
  cdf = cdf_exp,
  prior_spec = prior_spec,
  initial_values = c(rate = 1),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Normal prior for log-normal meanlog parameter
pdf_lognormal <- function(x, param) dlnorm(x, meanlog = param[1], sdlog = param[2])
cdf_lognormal <- function(x, param) plnorm(x, meanlog = param[1], sdlog = param[2])

prior_spec <- list(
  meanlog = list(family = "normal", hyperparameters = list(mean = 0, sd = 1)),
  sdlog = list(family = "gamma", hyperparameters = list(shape = 2, rate = 1))
)

set.seed(123)
data <- rlnorm(20, meanlog = 0, sdlog = 0.5)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_lognormal,
  cdf = cdf_lognormal,
  prior_spec = prior_spec,
  initial_values = c(meanlog = 0, sdlog = 0.5),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Beta prior for probability parameter
pdf_bernoulli <- function(x, param) {
  p <- param[1]
  ifelse(x == 1, p, 1 - p)
}

cdf_bernoulli <- function(x, param) {
  p <- param[1]
  ifelse(x == 0, 1 - p, 1)
}

prior_spec <- list(
  p = list(family = "beta", hyperparameters = list(shape1 = 2, shape2 = 2))
)

# Bernoulli data
set.seed(123)
data <- rbinom(20, size = 1, prob = 0.6)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_bernoulli,
  cdf = cdf_bernoulli,
  prior_spec = prior_spec,
  initial_values = c(p = 0.5),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Uniform prior for Weibull shape parameter
pdf_weibull <- function(x, param) dweibull(x, shape = param[1], scale = param[2])
cdf_weibull <- function(x, param) pweibull(x, shape = param[1], scale = param[2])

prior_spec <- list(
  shape = list(family = "uniform", hyperparameters = list(lower = 0.1, upper = 10)),
  scale = list(family = "gamma", hyperparameters = list(shape = 2, rate = 1))
)

set.seed(123)
data <- rweibull(20, shape = 2, scale = 1)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_weibull,
  cdf = cdf_weibull,
  prior_spec = prior_spec,
  initial_values = c(shape = 1.5, scale = 1),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Exponential prior for Poisson rate
pdf_poisson <- function(x, param) dpois(x, lambda = param[1])
cdf_poisson <- function(x, param) ppois(x, lambda = param[1])

prior_spec <- list(
  lambda = list(family = "exponential", hyperparameters = list(rate = 1))
)

set.seed(123)
data <- rpois(20, lambda = 3)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_poisson,
  cdf = cdf_poisson,
  prior_spec = prior_spec,
  initial_values = c(lambda = 2),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Log-Normal prior for Pareto scale parameter
pdf_pareto <- function(x, param) {
  xm <- param[1]
  alpha <- param[2]
  ifelse(x >= xm, (alpha * xm^alpha) / (x^(alpha + 1)), 0)
}

cdf_pareto <- function(x, param) {
  xm <- param[1]
  alpha <- param[2]
  ifelse(x >= xm, 1 - (xm / x)^alpha, 0)
}

prior_spec <- list(
  xm = list(family = "lognormal", hyperparameters = list(meanlog = 0, sdlog = 0.5)),
  alpha = list(family = "gamma", hyperparameters = list(shape = 2, rate = 1))
)

set.seed(123)
data <- (1 / (1 - runif(20)))^(1/2)  # Pareto(1, 2)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_pareto,
  cdf = cdf_pareto,
  prior_spec = prior_spec,
  initial_values = c(xm = 0.5, alpha = 1.5),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Weibull prior for gamma shape parameter
pdf_gamma <- function(x, param) dgamma(x, shape = param[1], rate = param[2])
cdf_gamma <- function(x, param) pgamma(x, shape = param[1], rate = param[2])

prior_spec <- list(
  shape = list(family = "weibull", hyperparameters = list(shape = 2, scale = 1)),
  rate = list(family = "gamma", hyperparameters = list(shape = 2, rate = 1))
)

set.seed(123)
data <- rgamma(20, shape = 2, rate = 1.5)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_gamma,
  cdf = cdf_gamma,
  prior_spec = prior_spec,
  initial_values = c(shape = 1.5, rate = 1),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Inverse Gamma prior for normal variance
pdf_normal <- function(x, param) dnorm(x, mean = param[1], sd = sqrt(param[2]))
cdf_normal <- function(x, param) pnorm(x, mean = param[1], sd = sqrt(param[2]))

prior_spec <- list(
  mean = list(family = "normal", hyperparameters = list(mean = 0, sd = 10)),
  variance = list(family = "invgamma", hyperparameters = list(shape = 2, scale = 1))
)

set.seed(123)
data <- rnorm(20, mean = 0, sd = 2)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_normal,
  cdf = cdf_normal,
  prior_spec = prior_spec,
  initial_values = c(mean = 0, variance = 4),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Two-parameter Weibull distribution
pdf_weibull <- function(x, param) dweibull(x, shape = param[1], scale = param[2])
cdf_weibull <- function(x, param) pweibull(x, shape = param[1], scale = param[2])

# Independent priors for each parameter
prior_spec <- list(
  shape = list(family = "gamma", hyperparameters = list(shape = 2, rate = 1)),
  scale = list(family = "gamma", hyperparameters = list(shape = 2, rate = 1))
)

set.seed(123)
data <- rweibull(20, shape = 2, scale = 1)

fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_weibull,
  cdf = cdf_weibull,
  prior_spec = prior_spec,
  initial_values = c(shape = 1.5, scale = 1),
  loss_function = "sel"
)

summary(fit)

## -----------------------------------------------------------------------------
# Custom prior function
custom_logprior <- function(param) {
  # Example: hierarchical prior
  # param[1] = theta, param[2] = hyperparameter
  theta <- param[1]
  hyper <- param[2]
  
  # Prior for theta given hyper
  log_prior_theta <- dnorm(theta, mean = 0, sd = hyper, log = TRUE)
  
  # Prior for hyper
  log_prior_hyper <- dgamma(hyper, shape = 2, rate = 1, log = TRUE)
  
  log_prior_theta + log_prior_hyper
}

# Use custom prior in tk_fit
fit <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_exp,
  cdf = cdf_exp,
  prior_spec = custom_logprior,
  initial_values = c(rate = 1),
  loss_function = "sel"
)

## -----------------------------------------------------------------------------
fit_flat <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_exp,
  cdf = cdf_exp,
  prior_spec = NULL,  # Flat prior
  initial_values = c(rate = 1),
  loss_function = "sel"
)

summary(fit_flat)

## -----------------------------------------------------------------------------
# Fit with informative prior
prior_informative <- list(
  rate = list(family = "gamma", hyperparameters = list(shape = 10, rate = 5))
)

fit_informative <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_exp,
  cdf = cdf_exp,
  prior_spec = prior_informative,
  initial_values = c(rate = 1),
  loss_function = "sel"
)

# Fit with weakly informative prior
prior_weak <- list(
  rate = list(family = "gamma", hyperparameters = list(shape = 0.1, rate = 0.1))
)

fit_weak <- tk_fit(
  data = data,
  censoring_scheme = "complete",
  pdf = pdf_exp,
  cdf = cdf_exp,
  prior_spec = prior_weak,
  initial_values = c(rate = 1),
  loss_function = "sel"
)

# Compare estimates
data.frame(
  Informative = coef(fit_informative),
  Weak = coef(fit_weak),
  Flat = coef(fit_flat)
)

## -----------------------------------------------------------------------------
sensitivity <- tk_sensitivity(
  fit = fit_informative,
  parameter_name = "rate",
  hyperparameter_name = "shape",
  hyperparameter_values = c(0.1, 0.5, 1, 2, 5, 10)
)

print(sensitivity)
plot(sensitivity)

