如何在R中使用KFAS包进行动态因子分析

时间:2017-01-21 02:19:44

标签: r kalman-filter

我试图使用R中的KFAS包将此模型拟合为多变量时间序列数据:

y_t = Zx_t + a + v_t,v_t~MVN(0,R)

x_t = x_(t-1)+ w_t,w_t~MVN(0,Q)

这是一个动态因子模型。我还需要估计一些参数,即因子载荷Z的矩阵,以及观测扰动的方差 - 协方差矩阵R.我很清楚这种类型的模型可以使用MARSS包运行但是我仍然需要使用更灵活的包运行它,因为我稍后会修改状态方程(包括季节性分解)。

这是我使用的代码(使用模拟数据而不是我打算运行的实际数据):

library(KFAS)
library(mAr)

set.seed(100)

w=c(0.25,0.1)
C=rbind(c(1,0.5),c(0.5,1.5))
A=rbind(c(0.1,0,0,0),c(0.3,0,0,0))
data=as.matrix(mAr.sim(w,A,C,N=300))

N.ts = dim(data)[2]
N.ls = 1

#ASSUMING 1 FACTOR
Z.vals = matrix(NA,N.ts,N.ls)
Zt = matrix(Z.vals, nrow=N.ts, ncol=N.ls, byrow=TRUE) #MATRIX OF LOADINGS, N X P
Ht <- diag(NA,N.ts) #VAR-COV MATRIX OF OBS ERROR, N x N
Tt <- diag(N.ls) #SLOPE OF LATENT STATE AT T-1, P X P
Rt <- diag(N.ls) #SLOPE OF THE LATENT STATE DISTURBANCES, P X P
Qt <- diag(N.ls) #VAR-COV MATRIX OF THE LATENT STATE DISTURBANCES, P X P

ss_model <- SSModel(data ~ 
                  -1 + SSMcustom(Z = Zt, T = Tt, R = Rt, Q = Qt),
                  H=Ht
                  )

objf <- function(pars, model, estimate = TRUE) {
   model$Z[1] <- pars[1]
   model$H[1] <- pars[2]
  if (estimate) {
    -logLik(model)
  } else {
    model
  }
}

opt <- optim(par = rep(1,50), fn = objf, method = "L-BFGS-B", 
             model = ss_model)

ss_model_opt <- objf(opt$par, ss_model, estimate = FALSE)

updatefn <- function(pars, model) {
  model$Z[1] <- pars[1]
  model$H[1] <- pars[2]
  model
}

fit <- fitSSM(ss_model, rep(1,50), updatefn, method = "L-BFGS-B")

如果我查看模型规范,对我来说似乎是正确的:

Call:
SSModel(formula = data ~ -1 + SSMcustom(Z = Zt, T = Tt, R = Rt, 
    Q = Qt), H = Ht)

State space model object of class SSModel

Dimensions:
[1] Number of time points: 300
[1] Number of time series: 2
[1] Number of disturbances: 1
[1] Number of states: 1
Names of the states:
[1]  custom1
Distributions of the time series:
[1]  gaussian

Object is a valid object of class SSModel.

然而,它返回此错误消息:     is.SSModel中的错误(do.call(updatefn,args = c(list(inits,model),update_args)),:     系统矩阵(不包括Z)包含NA或无穷大值,协方差矩阵包含大于1e + 07的值

希望有人可以指导我这样做。非常感谢!

1 个答案:

答案 0 :(得分:0)

你可以在谷歌上查找方差协方差矩阵。季节性成分; a'a 是 在找到分数矩阵 a=A-11A(1/n) 的向量/偏差后应用。 1 表示 N1 个的分数。 p=1,n=行数; 2行数据给出方差。红色表示作为矩阵对角线的方差。 Na 是方差的值。我们不知道矩阵中的缺失元素,所以我们假设 T-1=Np 个其中 p=1,对于矩阵的向量分数,我们用 T-1=N 填充潜在的*p 个,其中 p=1。输入错误信息,ssmodel