| pid | R Documentation |
Compute prediction intervals and other information by applying the conformal PID (Proportional-Integral-Derivative) control method.
pid(
object,
alpha = 1 - 0.01 * object$level,
symmetric = FALSE,
ncal = 10,
rolling = FALSE,
integrate = TRUE,
scorecast = !symmetric,
scorecastfun = NULL,
lr = 0.1,
Tg = NROW(object$ERROR),
delta = 0.01,
Csat = NULL,
KI = max(abs(object$ERROR), na.rm = TRUE),
update = FALSE,
...
)
object |
An object of class |
alpha |
A numeric vector of significance levels to achieve a desired
coverage level |
symmetric |
If |
ncal |
Length of the burn-in period for training the scorecaster.
If |
rolling |
If |
integrate |
If |
scorecast |
If |
scorecastfun |
A scorecaster function to return an object of class
|
lr |
A positive initial learning rate used for quantile tracking.
Defaults to |
Tg |
The time that is set to achieve the target absolute coverage
guarantee before this. It must be greater than 1 when |
delta |
A number in |
Csat |
A positive constant ensuring that by time |
KI |
A non-negative constant to place the integrator on the same scale
as the scores. Defaults to |
update |
If |
... |
Other arguments are passed to the |
The PID method combines three modules to make the final iteration:
q_{t+h|t}=\underbrace{q_{t+h-1|t-1} + \eta(\mathrm{err}_{t|t-h}-\alpha)}_{\mathrm{P}}+\underbrace{r_t\left(\sum_{i=1}^t\left(\mathrm{err}_{i|i-h}-\alpha\right)\right)}_{\mathrm{I}}+\underbrace{\hat{s}_{t+h|t}}_{\mathrm{D}}
for each individual forecast horizon h, respectively, where
Quantile tracking part (P) is q_{t+h-1|t-1} + \eta(\mathrm{err}_{t|t-h}-\alpha),
where q_{1+h|1} is set to 0 without a loss of generality,
\mathrm{err}_{t|t-h}=1 if s_{t|t-h}>q_{t|t-h}, and
\mathrm{err}_{t|t-h}=0 if s_{t|t-h} \leq q_{t|t-h}.
Error integration part (I) is r_t\left(\sum_{i=1}^t\left(\mathrm{err}_{i|i-h}-\alpha\right)\right).
Here we use a nonlinear saturation function
r_t(x)=K_{\mathrm{I}} \tan \left(x \log (t) /\left(t C_{\text {sat }}\right)\right),
where we set \tan (x)=\operatorname{sign}(x) \cdot \infty for
x \notin[-\pi / 2, \pi / 2], and C_{\text {sat }}, K_{\mathrm{I}}>0
are constants that we choose heuristically.
Scorecasting part (D) is \hat{s}_{t+h|t}, the forecast generated by
training a scorecaster based on the nonconformity scores available at
time t.
A list of class
c("pid", "cpforecast", "cvforecast", "forecast") with the
following components:
x |
The original time series. |
series |
The name of the series |
xreg |
Exogenous predictor variables used, if applicable. |
method |
A character string "pid". |
cp_times |
An integer vector giving the number of conformal predictions performed in cross-validation for each forecast horizon. |
MEAN |
Point forecasts as a multivariate time series, where the
|
ERROR |
Forecast errors given by
|
LOWER |
A list containing lower bounds for prediction intervals for
each |
UPPER |
A list containing upper bounds for prediction intervals for
each |
level |
The confidence values associated with the prediction intervals. |
call |
The matched call. |
model |
A list containing information about the conformal prediction
model: the resolved arguments in |
If mean is included in the object, the components
mean, lower, and upper will also be returned, showing
the information about the forecasts generated using all available
observations.
Angelopoulos, A., Candes, E., and Tibshirani, R. J. (2023). "Conformal PID control for time series prediction", Advances in Neural Information Processing Systems, 36, 23047–23074.
cvforecast to produce object, and
update.cpforecast to extend the results with new
observations.
Other conformal prediction methods:
acmcp(),
acp(),
conformal(),
scp()
# Simulate time series from an AR(2) model
library(forecast)
set.seed(1)
series <- arima.sim(n = 200, list(ar = c(0.8, -0.5)), sd = sqrt(1))
# Cross-validation forecasting
far2 <- function(x, h, level) {
Arima(x, order = c(2, 0, 0)) |>
forecast(h = h, level)
}
fc <- cvforecast(series, forecastfun = far2, h = 3, level = 95, window = 50)
# PID setup
Tg <- 200; delta <- 0.01
Csat <- 2 / pi * (ceiling(log(Tg) * delta) - 1 / log(Tg))
KI <- 2
# PID without scorecaster
pidfc_nsf <- pid(fc, ncal = 50, rolling = TRUE, scorecast = FALSE,
KI = KI, Csat = Csat)
print(pidfc_nsf)
summary(pidfc_nsf)
# PID with a Naive model for the scorecaster
naivefun <- function(x, h) {
naive(x) |> forecast(h = h)
}
pidfc <- pid(fc, ncal = 50, rolling = TRUE, scorecastfun = naivefun,
KI = KI, Csat = Csat)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.