---
title: "Prior Specification"
author: "Your Name"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Prior Specification}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(TKApprox)
```

## Introduction

TKApprox provides flexible prior specification options, from standard conjugate priors to fully custom prior functions. This vignette covers all available prior families and how to use them effectively.

## Standard Prior Families

### Gamma Prior

The Gamma prior is commonly used for positive parameters like rates and scales.

**Parameters:** shape (α), rate (β)

**PDF:** $f(x) = \frac{\beta^\alpha}{\Gamma(\alpha)} x^{\alpha-1} e^{-\beta x}$

```{r}
# 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

The Normal prior is used for parameters that can take any real value.

**Parameters:** mean (μ), standard deviation (σ)

**PDF:** $f(x) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$

```{r}
# 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

The Beta prior is used for parameters bounded between 0 and 1.

**Parameters:** shape1 (α), shape2 (β)

**PDF:** $f(x) = \frac{x^{\alpha-1}(1-x)^{\beta-1}}{B(\alpha,\beta)}$

```{r}
# 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

The Uniform prior represents a non-informative prior over a bounded interval.

**Parameters:** lower (a), upper (b)

**PDF:** $f(x) = \frac{1}{b-a}$ for $a \leq x \leq b$

```{r}
# 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

The Exponential prior is a special case of Gamma with shape = 1.

**Parameters:** rate (λ)

**PDF:** $f(x) = \lambda e^{-\lambda x}$

```{r}
# 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

The Log-Normal prior is useful for parameters that are log-normally distributed.

**Parameters:** meanlog (μ), sdlog (σ)

**PDF:** $f(x) = \frac{1}{x\sigma\sqrt{2\pi}} \exp\left(-\frac{(\log x - \mu)^2}{2\sigma^2}\right)$

```{r}
# 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

The Weibull prior is useful for reliability and survival analysis parameters.

**Parameters:** shape (k), scale (λ)

**PDF:** $f(x) = \frac{k}{\lambda}\left(\frac{x}{\lambda}\right)^{k-1} e^{-(x/\lambda)^k}$

```{r}
# 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

The Inverse Gamma prior is commonly used for variance parameters.

**Parameters:** shape (α), scale (β)

**PDF:** $f(x) = \frac{\beta^\alpha}{\Gamma(\alpha)} x^{-\alpha-1} e^{-\beta/x}$

```{r}
# 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)
```

## Independent Priors for Multiple Parameters

For multi-parameter models, you can specify independent priors for each parameter:

```{r}
# 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 Functions

You can also specify a custom prior function directly:

```{r}
# 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"
)
```

## Non-Informative (Flat) Priors

To use a non-informative flat prior, simply set `prior_spec = NULL`:

```{r}
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)
```

## Prior Sensitivity Analysis

It's important to check how sensitive your results are to prior specifications:

```{r}
# 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)
)
```

## Systematic Prior Sensitivity

Use `tk_sensitivity()` for systematic examination of prior hyperparameters:

```{r}
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)
```

## Choosing Prior Hyperparameters

### Conjugate Priors

For common distributions, conjugate priors provide computational advantages:

- **Exponential likelihood + Gamma prior**: Conjugate
- **Normal likelihood (known variance) + Normal prior**: Conjugate
- **Normal likelihood (known mean) + Inverse Gamma prior**: Conjugate
- **Binomial likelihood + Beta prior**: Conjugate
- **Poisson likelihood + Gamma prior**: Conjugate

### Weakly Informative Priors

When you have little prior information, use weakly informative priors:

- **Gamma(0.1, 0.1)**: Very weak prior for positive parameters
- **Normal(0, 100)**: Very weak prior for real-valued parameters
- **Beta(1, 1)**: Uniform prior for probabilities

### Informative Priors

When you have strong prior information (e.g., from previous studies):

- Use hyperparameters that reflect your prior knowledge
- Consider the prior variance relative to expected data information
- Always perform sensitivity analysis

## Tips for Prior Specification

1. **Check prior support**: Ensure the prior support matches the parameter domain
2. **Scale matters**: Consider the scale of your parameters when setting hyperparameters
3. **Sensitivity analysis**: Always check how sensitive results are to prior choices
4. **Conjugate when possible**: Use conjugate priors for computational efficiency
5. **Document choices**: Document your prior specification rationale

## Next Steps

- See "Loss Functions" for information on Bayesian estimation methods
- See "Simulation Studies" for comparing prior specifications in simulation
