我正在使用' KFAS'来自R的包来估计具有卡尔曼滤波器的状态空间模型。我的测量和转换方程是:
y_t = Z_t * x_t + \ eps_t(测量)
x_t = T_t * x_ {t-1} + R_t * \ eta_t(过渡),
用\ eps_t~N(0,H_t)和\ eta_t~N(0,Q_t)。
所以,我想估计方差H_t和Q_t,还要估算T_t,即AR(1)系数。我的代码如下:
library(KFAS)
set.seed(100)
eps <- rt(200, 4, 1)
meas <- as.matrix((arima.sim(n=200, list(ar=0.6), innov = rnorm(200)*sqrt(0.5)) + eps),
ncol=1)
Zt <- 1
Ht <- matrix(NA)
Tt <- matrix(NA)
Rt <- 1
Qt <- matrix(NA)
ss_model <- SSModel(meas ~ -1 + SSMcustom(Z = Zt, T = Tt, R = Rt,
Q = Qt), H = Ht)
fit <- fitSSM(ss_model, inits = c(0,0.6,0), method = 'L-BFGS-B')
但它返回:&#34;错误在is.SSModel(do.call(updatefn,args = c(list(inits,model),update_args)),:系统矩阵(不包括Z)包含NA或无限值,协方差矩阵包含大于1e + 07&#34的值;
方差的NA定义很有效,如包装论文中所述。但是,似乎无法对AR系数进行此操作。有谁知道我该怎么做?
请注意,我知道SSMarima函数,它将转换方程的定义简化为ARIMA模型。虽然我能估计AR(1)coef。和Q_t这样,我仍然无法估计\ eps_t方差(H_t)。此外,我正在将我的卡尔曼滤波器代码从EViews迁移到R,所以我需要学习更复杂的其他模型的SSMcustom。
谢谢!
答案 0 :(得分:0)
您的示例中似乎缺少某些内容,因为您的错误消息来自函数fitSSM
。如果要使用fitSSM
来估计一般状态空间模型,则需要提供自己的模型更新功能。默认行为只能处理协方差矩阵H和Q中的NA。fitSSM
的主要目标只是开始使用简单的东西。对于复杂模型和/或大数据,我建议使用您自己编写的目标函数(借助logLik
方法)和您最喜欢的数值优化程序,以获得最佳性能。像这样:
library(KFAS)
set.seed(100)
eps <- rt(200, 4, 1)
meas <- as.matrix((arima.sim(n=200, list(ar=0.6), innov = rnorm(200)*sqrt(0.5)) + eps),
ncol=1)
Zt <- 1
Ht <- matrix(NA)
Tt <- matrix(NA)
Rt <- 1
Qt <- matrix(NA)
ss_model <- SSModel(meas ~ -1 + SSMcustom(Z = Zt, T = Tt, R = Rt,
Q = Qt), H = Ht)
objf <- function(pars, model, estimate = TRUE) {
model$H[1] <- pars[1]
model$T[1] <- pars[2]
model$Q[1] <- pars[3]
if (estimate) {
-logLik(model)
} else {
model
}
}
opt <- optim(c(1, 0.5, 1), objf, method = "L-BFGS-B",
lower = c(0, -0.99, 0), upper = c(100, 0.99, 100), model = ss_model)
ss_model_opt <- objf(opt$par, ss_model, estimate = FALSE)
与fitSSM
相同:
updatefn <- function(pars, model) {
model$H[1] <- pars[1]
model$T[1] <- pars[2]
model$Q[1] <- pars[3]
model
}
fit <- fitSSM(ss_model, c(1, 0.5, 1), updatefn, method = "L-BFGS-B",
lower = c(0, -0.99, 0), upper = c(100, 0.99, 100))
identical(ss_model_opt, fit$model)