我使用包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
。
答案 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"