如何利用';KFAS&x27;R包,带AR(1)跃迁方程?

如何利用';KFAS&x27;R包,带AR(1)跃迁方程?,r,kalman-filter,R,Kalman Filter,我正在使用R中的“KFAS”包,用卡尔曼滤波器估计状态空间模型。我的测量和转换方程为: y_t=Z_t*x_t+\eps_t(测量) x_t=t_t*x_{t-1}+R_t*\eta_t(跃迁) 使用\eps\u t~N(0,H\u t)和\eta\u 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.matri

我正在使用R中的“KFAS”包,用卡尔曼滤波器估计状态空间模型。我的测量和转换方程为:

y_t=Z_t*x_t+\eps_t(测量)

x_t=t_t*x_{t-1}+R_t*\eta_t(跃迁)

使用\eps\u t~N(0,H\u t)和\eta\u 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')
库(KFAS)
种子集(100)

eps您的示例中似乎缺少了一些内容,因为您的错误消息来自函数
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)

你说得对。我忘记了问题中的最后一行代码(已编辑)。不管怎么说,你的回答非常有效!非常感谢。
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)