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

时间:2020-06-07 19:21:56

标签: r prediction forecasting

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

任何帮助将不胜感激。

# 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
}

1 个答案:

答案 0 :(得分:0)

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分支下),但最终测试仍在进行中。