如何使用MARSS包的动态线性模型进行样本外预测?

How to make out-of-sample forecasts with Dynamic Linear Model of MARSS package?

我正在尝试了解如何使用动态线性建模进行预测。我找到了一个用于预测的 R 中 MARSS 包的 DLM 功能示例。下面是示例中的所有代码,从加载数据开始到创建样本内预测结束。 我不明白的是如何进行样本外预测?下面的代码生成 "in-sample" 预测,它使用已知信息生成关于现有数据的预测。 假设我想预测明天而不是过去几周的鲑鱼存活率。我该怎么做?

如有任何帮助,我们将不胜感激。

# load the data
data(SalmonSurvCUI, package = "MARSS")

# get time indices
years <- SalmonSurvCUI[, 1]

# number of years of data
TT <- length(years)

# get response variable: logit(survival)
dat <- matrix(SalmonSurvCUI[, 2], nrow = 1)

# get predictor variable
CUI <- SalmonSurvCUI[, 3]

## z-score the CUI
CUI.z <- matrix((CUI - mean(CUI))/sqrt(var(CUI)), nrow = 1)

# number of regr params (slope + intercept)
m <- dim(CUI.z)[1] + 1

# for process eqn
B <- diag(m)  ## 2x2; Identity
U <- matrix(0, nrow = m, ncol = 1)  ## 2x1; both elements = 0
Q <- matrix(list(0), m, m)  ## 2x2; all 0 for now
diag(Q) <- c("q.alpha", "q.beta")  ## 2x2; diag = (q1,q2)

# for observation eqn
Z <- array(NA, c(1, m, TT))  ## NxMxT; empty for now
Z[1, 1, ] <- rep(1, TT)  ## Nx1; 1's for intercept
Z[1, 2, ] <- CUI.z  ## Nx1; predictor variable
A <- matrix(0)  ## 1x1; scalar = 0
R <- matrix("r")  ## 1x1; scalar = r

# only need starting values for regr parameters
inits.list <- list(x0 = matrix(c(0, 0), nrow = m))

# list of model matrices & vectors
mod.list <- list(B = B, U = U, Q = Q, Z = Z, A = A, R = R)

# fit univariate DLM
dlm1 <- MARSS(dat, inits = inits.list, model = mod.list)

# get list of Kalman filter output
kf.out <- MARSSkfss(dlm1)
## forecasts of regr parameters; 2xT matrix
eta <- kf.out$xtt1

## ts of E(forecasts)
fore.mean <- vector()
for (t in 1:TT) {
    fore.mean[t] <- Z[, , t] %*% eta[, t, drop = FALSE]
}
# variance of regr parameters; 1x2xT array
Phi <- kf.out$Vtt1
## obs variance; 1x1 matrix
R.est <- coef(dlm1, type = "matrix")$R
## ts of Var(forecasts)
fore.var <- vector()
for (t in 1:TT) {
    tZ <- matrix(Z[, , t], m, 1)  ## transpose of Z
    fore.var[t] <- Z[, , t] %*% Phi[, , t] %*% tZ + R.est
}

beta 和 alpha 的模型是无漂移的随机游走,因此 beta(TT+k)alpha(TT+k) 的预测将只是 beta(TT)alpha(TT),其中 TT 是数据中的最后一个时间步长(在本例中为 CUI.z)。

所以你的预测是

logit.survival(TT+k) = alpha(TT) + beta(TT)*CUI.z(TT+k)

alpha(TT)beta(TT) 将通过 kf.out$xtT[,TT] 输出,即最后状态估计。您需要在 t=TT+k 时提供 CUI.z

MARSS 3.11.0 版将具有预测功能并将这些预测与预测区间一起输出。但发布日期是 2020 年夏末的某个时候。该功能位于 GitHub 开发站点(在 resids_update 分支下),但最终测试仍在进行中。