簡體   English   中英

如何使用帶有AR(1)轉換方程的'KFAS'R包估計卡爾曼濾波器?

[英]How to estimate the Kalman Filter with 'KFAS' R package, with an AR(1) transition equation?

我正在使用R中的“ KFAS”軟件包來估計帶有卡爾曼濾波器的狀態空間模型。 我的測量和過渡方程為:

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,還要估算AR(1)系數T_t。 我的代碼如下:

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')

但它返回: “ is.SSModel(do.call(updatefn,args = c(list(inits,model),update_args))中的錯誤,:系統矩陣(不包括Z)包含NA或無限值,協方差矩陣包含更大的值比1e + 07“

如包裝文件中所記錄,差異的NA定義效果很好。 但是,對於AR系數似乎無法做到這一點。 有人知道我該怎么做嗎?

請注意,我知道SSMarima函數,它簡化了將轉換方程定義為ARIMA模型的過程。 雖然我能夠估計AR(1)系數。 和Q_t這樣,我仍然無法估計\\ eps_t方差(H_t)。 此外,我將Kalman過濾器代碼從EViews遷移到R,所以我需要學習SSMcustom來了解其他更復雜的模型。

謝謝!

似乎您的示例中缺少某些內容,因為錯誤消息來自功能fitSSM 如果要使用fitSSM估計一般狀態空間模型,則需要提供自己的模型更新功能。 默認行為只能處理協方差矩陣H和Q中的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM