Block bootstrap 用于 R 中的时间序列

Block bootstrap for time series in R

我正在使用包 tseries 中的函数 tsbootstrap() 来生成块 bootstrap 样本,并计算一个机制参数估计的标准误差-切换自回归模型(我可以使用包 MSwM 中的函数 msmFit() 获得)。

这是我正在使用的代码。首先,我为要使用的统计数据定义了一个函数:

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() 函数(其中 x 是 10 年期美国政府债券的月度时间序列)

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

关于如何解决这个问题的任何见解?我认为错误来自包的函数msmFit()

您正确理解的错误来自msmFit函数收敛失败

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

solve.default 是您在使用优化器时可以看到的常见错误。通常优化器(如optim)会尝试计算hessian矩阵,以便'direct'自身达到最小化底层函数的最优解。在某些时候,hessian 矩阵需要反转,如果它是 singular,算法就会崩溃。实际上这意味着优化器无法收敛(即无法找到解决方案)。

这可能是由多种原因造成的:

  • 观测太少
  • 起始值错误
  • 要优化(或在函数中使用)的功能设计不当
  • 最大迭代次数少
  • 问题根本没有解决方案

现在让我们来解决您的问题:

msmFit 的默认最大迭代次数似乎是 100。尝试将其增加到 500,如下所示。该功能的设计对我来说似乎还可以。现在让我们来看看低数量的观察。据我从文档中了解到,tsbootstrap 函数的 b 参数是一个控制转到 switch 函数的观察值的值。设置为 9 会使 msmFit 函数失败。我将其增加到 50(假设您的 df 有 50 个观察值。小于这个值的值可能会一直失败)。此外,让它产生 1000 bootstrap 系列将需要一天的时间来计算(至少在我的机器上)。

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

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"