阻止R中的时间序列的自举

时间:2015-07-18 22:21:51

标签: r time-series hidden-markov-models

我使用包String hql = "select d from Dept d inner join d.emp"; // add additional where clause Query query = session.createQuery(hql); List<Dept> listDepts = query.list(); 中的函数tsbootstrap()生成块引导样本,并计算制度转换自回归模型参数估计的标准误差(我可以使用包tseries)中的函数msmFit()获得。

以下是我正在使用的代码。首先,我为我想要使用的统计信息定义一个函数:

MSwM

然后我使用switching.par <- function(z) { n<-length(z) x<-z[1:(n-1)] y<-z[2:n] my.xy<- data.frame(x,y) mod<-lm(y~x,data=my.xy) mod.mswm=msmFit(mod,k=2,sw=c(T,T,T)) b1 <- mod.mswm@Coef[1,2] b2 <- mod.mswm@Coef[2,2] c1 <- mod.mswm@Coef[1,1] c2 <- mod.mswm@Coef[2,1] del1 <- mod.mswm@std[1] del2 <- mod.mswm@std[2] parameters<-c(b1, b2, c1, c2, del1, del2) names(parameters)<-c("b1", "b2", "c1", "c2", "del1", "del2") parameters } 函数(其中tsbootstrap()是10年期美国政府债券的月度时间序列)

x

但是我收到以下错误消息:

use.boot <- tsbootstrap(x, nb=1000, statistic=switching.par, type="block", b=9)

有关如何解决此问题的任何见解?我认为错误来自包的函数Error in solve.default(res$Hessian) : Lapack routine dgesv: system is exactly singular: U[4,4] = 0

1 个答案:

答案 0 :(得分:1)

正确理解的错误来自msmFit无法收敛的函数。

我将对错误给出一些见解,然后提供一个对我有用的解决方案:

solve.default是您在使用优化器时可以看到的常见错误。通常,优化器(例如optim)将尝试计算粗体矩阵,以便将自身“引导”到最小化基础函数的最优解。在某些时候,需要反转粗体矩阵,如果它是singular,算法会崩溃。实际上,这意味着优化器未能收敛(即找不到解决方案)。

这可能是由于多种原因:

  • 观察次数太少
  • 错误的起始值
  • 要优化(或在功能中使用)的功能设计不合理
  • 最大迭代次数
  • 字面上没有解决问题的方法

现在让我们回答你的问题:

似乎msmFit的默认最大迭代次数是100.尝试将其增加到500,如下所示。功能的设计对我来说似乎没问题。现在让我们进行少量的观察。据我所知,b函数的tsbootstrap参数是一个控制切换函数观察值的值。将它设为9会使msmFit函数失败。我把它增加到50(假设你的df有50个观察值。任何小于此的东西都可能会一直失败)。此外,生成1000个引导程序系列需要一天的时间来计算(至少在我的机器上)。

考虑到以上所有因素,以下内容似乎适用于我的机器(仅适用于10个自举系列)并且需要很长时间。

switching.par <- function(z) {
  n<-length(z)
  x<-z[1:(n-1)]
  y<-z[2:n]
  my.xy<- data.frame(x,y)
  mod<-lm(y~x,data=my.xy)
  mod.mswm=msmFit(mod,k=2,sw=c(T,T,T), control=list(maxiter=500))

  b1 <- mod.mswm@Coef[1,2]
  b2 <- mod.mswm@Coef[2,2]

  c1 <- mod.mswm@Coef[1,1]
  c2 <- mod.mswm@Coef[2,1]

  del1 <- mod.mswm@std[1]
  del2 <- mod.mswm@std[2]

  parameters<-c(b1, b2, c1, c2, del1, del2)
  names(parameters)<-c("b1", "b2", "c1", "c2", "del1", "del2")
  parameters
}


use.boot <- tsbootstrap(x, nb=10, statistic=switching.par, type="block", b=50)

输出:

> str(use.boot)
List of 5
 $ statistic     : num [1:10, 1:6] -0.0275 -0.1692 -0.0199 -0.0587 -0.0763 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:6] "t1" "t2" "t3" "t4" ...
 $ orig.statistic: Named num [1:6] 0.0114 -0.1002 0.5155 0.5319 0.2868 ...
  ..- attr(*, "names")= chr [1:6] "t1" "t2" "t3" "t4" ...
 $ bias          : Named num [1:6] -0.2029 0.2041 0.0307 -0.0217 -0.036 ...
  ..- attr(*, "names")= chr [1:6] "t1" "t2" "t3" "t4" ...
 $ se            : Named num [1:6] 0.2076 0.1774 0.1686 0.1375 0.0533 ...
  ..- attr(*, "names")= chr [1:6] "t1" "t2" "t3" "t4" ...
 $ call          : language tsbootstrap(x = x, nb = 10, statistic = switching.par, b = 50, type = "block")
 - attr(*, "class")= chr "resample.statistic"