---
title: Getting started with SAFEPG
author: An introductory tutorial with examples
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{SAFEPG}
  %\VignetteEngine{knitr::rmarkdown}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```
## Introduction

The `SAFEPG` package provides a frequency-severity model designed for predicting climate-related extreme losses. The model incorporates a sign-aligned regularization term that ensures consistent signs between the frequency and severity components. This enhancement improves both the interpretability and predictive performance of the model.

In this vignette, we will demonstrate how to use the core functions of the `SAFEPG` package to fit the model and make predictions.

## `safe()`: Fitting the Model

The `safe()` function is the core function of the package, used to fit the frequency-severity model. The main arguments to supply are:

- `x`: A numerical matrix representing the features (covariates).
- `y`: A numeric vector of loss values (severity), assumed to follow a Gamma distribution.
- `k`: A numeric vector representing the number of claims (frequency), assumed to follow a Poisson distribution.
- `lambda`: A user-supplied sequence of regularization parameters (`lambda`).
- `ind_p`: A belief vector indicating which features should share the same sign across frequency and severity components.

### Example: Fitting the Model

Below is an example of how to generate synthetic data and fit the model using the `safe()` function:

```{r}
library(SAFEPG)
set.seed(1)
n <- 100  # Number of observations
p <- 5    # Number of predictors

# Simulating data
x <- matrix(rnorm(n * p), nrow = n, ncol = p)
beta_true <- rep(0.1, 5)
gamma_true <- c(rep(1, 3), -1, -1)
mu <- x %*% beta_true
k <- rpois(n, lambda = exp(mu))
alpha_val <- 1
theta <- exp(x %*% gamma_true) / alpha_val
y <- rgamma(n, shape = alpha_val, scale = theta)

# Fit the model
lambda_val <- 1
fit <- safe(x, y, k, lambda = lambda_val, ind_p = c(1, 1, 1, 0, 0))
```

## `eccv.safe()`: Electoral College Cross-Validation

The `eccv.safe()` function performs electoral college cross-validation (EC-CV) to tune the regularization parameter (`lambda`). It takes the same arguments as `safe()`.

### Example: Performing Cross-Validation

```{r}
lambda_seq <- 10^seq(2, -8, length.out = 5)  # Lambda sequence
cv.fit <- eccv.safe(x, y, k, lambda = lambda_seq, ind_p = c(1, 1, 1, 0, 0))
```

## S3 Methods for `safe` Objects

Several S3 methods are provided for objects of class `safe`. These methods include:

- `coef()`: Returns a matrix of coefficients.
- `predict()`: Returns predictions of $\hat{y}$ given a new matrix `x`.

Both methods allow you to specify a particular value of $\lambda$ (not necessarily from the original sequence) via the `s` argument.

### Example: Using S3 Methods

```{r}
# Extract coefficients from the fitted model
coef(fit)

# Make predictions on new data
set.seed(234)
newx <- matrix(rnorm(n * p), nrow = n, ncol = p)
predictions <- predict(fit, newx)
```

