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"
我正在使用包 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"