---
title: "Gaussian Copula Time Series Models for Count Data"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Gaussian Copula Time Series Models for Count Data}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---


```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.align = "center",
  fig.width = 6,
  fig.height = 4
)
library(gctsc)
set.seed(1)
```

The `gctsc` package provides fast and scalable tools for fitting
**Gaussian copula models for count time series**, supporting a wide range of discrete marginals:

- Poisson  
- Negative Binomial  
- Binomial  
- Beta Binomial
- Zero-Inflated Poisson (ZIP)  
- Zero-Inflated Binomial (ZIB)  
- Zero-Inflated Beta-Binomial (ZIBB)

These models are constructed from a latent **Gaussian ARMA process**
combined with a discrete marginal distribution. Likelihood evaluation
requires the multivariate normal rectangle probability

\[
P\big( a_t(y_t;\psi) \le Z_t \le b_t(y_t;\psi),\ t=1,\ldots,n \big),
\]

where \((Z_t)\) follows a Gaussian ARMA\((p,q)\) process with correlation matrix
\(\Psi\), and the marginal-specific truncation bounds are

\[
a_t = \Phi^{-1}\!\big(F_t(y_t - 1;\psi)\big), \qquad 
b_t = \Phi^{-1}\!\big(F_t(y_t;\psi)\big).
\]

The package provides several likelihood approximation methods:

- **TMET** — Time Series Minimax Exponential Tilting (proposed method)  
- **GHK** — Geweke–Hajivassiliou–Keane simulator  
- **CE** — Continuous Extension approximation  

In addition, the package offers:

- Simulation of count time series with ARMA latent structure  
- Maximum likelihood estimation using the above likelihoods  
- Residual diagnostic tools  
- One-step-ahead prediction  

The TMET method is an adaptation of minimax exponential tilting to
**causal and invertible ARMA processes**, enabling fast, stable, and accurate
likelihood computation even for large \(n\). The package also includes
utilities for simulating count time series under various marginal models,
fitting Gaussian copula models, performing diagnostics, and generating forecasts.

This section illustrates basic usage of the `gctsc` package, including data simulation, 
likelihood approximation, and model fitting under several margins.

---
### Example 1: Simulation of Count Data for Poisson marginal with AR(1) latent process:
```{r}
library(gctsc)

n  <- 100
mu <- 10
phi <- 0.2
arma_order <- c(1, 0)
tau <- c(phi)

# Simulate Poisson count data
sim_data <- sim_poisson(mu, tau, arma_order, nsim = n, seed = 7)
y <- sim_data$y

plot(y, type = "l", main = "Simulated Poisson AR(1) Counts")

```

### Example 2: Simulating Zero–Inflated Beta–Binomial (ZIBB) AR(1) Count Time Series
```{r}
n <- 100
phi <- 0.5
tau <- c(phi)

beta_0 <- 1.2
prob   <- plogis(beta_0)
rho    <- 0.1
pi0    <- 0.8
size   <- 24

set.seed(7)
sim_data <- sim_zibb(prob = prob * rep(1,n),
                     rho = rho, pi0 = pi0,
                     size = size, tau = tau,
                     arma_order = c(1,0),
                     nsim = n)
y <- sim_data$y

plot(y, type = "l", main = "Simulated ZIBB AR(1) Counts")

```

### Example 3: Likelihood Approximation (TMET vs GHK)
#### This example shows how to compute the Gaussian copula log-likelihood using the TMET and GHK methods.
```{r}
n <- 300
mu <- 10
phi <- 0.5
theta <- 0.2
arma_order <- c(1,1)
tau <- c(phi, theta)

# Simulate Poisson count data
sim_data <- sim_poisson(mu, tau, arma_order, nsim = n, seed = 1)
y <- sim_data$y

# Compute bounds for truncated MVN using marginal object
marg <- poisson.marg()
X    <- matrix(1, nrow = n)
ab   <- marg$bounds(y, X, lambda = mu)
lower <- ab[,1]
upper <- ab[,2]

# Likelihood approximation
llk_tmet <- pmvn_tmet(lower, upper, tau, od = arma_order, pm = 30, QMC = TRUE)
llk_ghk  <- pmvn_ghk(lower, upper, tau, od = arma_order, QMC = TRUE)

c(TMET = llk_tmet, GHK = llk_ghk)

```

### Example 4: Fitting a Gaussian Copula Count Model

```{r}
fit <- gctsc(
  formula  = y ~ 1,
  marginal = poisson.marg(),
  cormat   = arma.cormat(p = 1, q = 1),
  method   = "CE"
)

summary(fit)

predict(fit)

```

### Example 5: Residual diagnostics
```{r}
plot(fit)
```


### Example 6: One-step-ahead prediction
```{r}
pred_tmet <- predict(
  fit,
  method  = "TMET",
  y_obs   = 10
)

pred_tmet
```


### Example 7: Real Data Analysis — Campylobacter Time Series

```{r}
## Load weekly Campylobacter incidence data
data("campyl", package = "gctsc")
y <- campyl[,"X1"]
n <- length(y)

## Plot the time series
ts_y <- ts(y, start = c(2001, 1), frequency = 52)
plot(ts_y, main = "Weekly Campylobacter Incidence",
     ylab = "Cases", xlab = "Year")

## ---------------------------------------------------------------
## Construct seasonal covariates
## ---------------------------------------------------------------
## Seasonal structure appears to have yearly periodicity,
## so we include sine/cosine terms with period = 52 weeks.

time <- 1:n
X <- data.frame(
  intercept = 1,
  sin52 = sin(2 * pi * time / 52),
  cos52 = cos(2 * pi * time / 52)
)

## Combine response and covariates
data_df <- data.frame(Y = y, X)

## Use the first 800 observations for model fitting
train_end <- 1000
data_train <- data_df[1:train_end, ]

## ---------------------------------------------------------------
## Fit a Negative Binomial Gaussian Copula model
## ---------------------------------------------------------------
## We use:
##   - Negative Binomial marginal (log link)
##   - ARMA(1,1) latent correlation structure
##   - GHK likelihood approximation
##
## The model is:
##     E[Y_t] = exp(β0 + β1 sin + β2 cos)
##
## Covariates enter only through the marginal mean.

fit <- gctsc(
  formula  = Y ~ sin52 + cos52,
  data     = data_train,
  marginal = negbin.marg(link = "log"),
  cormat   = arma.cormat(p = 1, q = 1),
  method   = "CE",  ### method can be changed to TMET or GHK
  options  = gctsc.opts(seed = 1)   # fixed seed for reproducibility
)

summary(fit)

## ---------------------------------------------------------------
## Residual diagnostics
## ---------------------------------------------------------------
plot(fit)

## ---------------------------------------------------------------
## One-step-ahead prediction
## ---------------------------------------------------------------
## Predict Y_{801} using fitted model
new_obs_index <- train_end + 1
pred <- predict(
  fit,
  X_test = data_df[new_obs_index, ],
  y_obs  = data_df[new_obs_index, "Y"]
)

pred

```

*Further examples (Negative Binomial, Binomial,Beta-Binomial, ZIP, ZIB, ZIBB, including cases with covariates) and another real data analysis are available in the `inst/examples/` directory of the package source.*
