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