如何使用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 分支下),但最终测试仍在进行中。
我正在尝试了解如何使用动态线性建模进行预测。我找到了一个用于预测的 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 分支下),但最终测试仍在进行中。