我正在尝试创建一个巨大的嵌套for循环(优化留待以后),以适应rugarch提供的所有GARCH模型。
这是我复制错误的MWE:
library(rugarch)
## Small parameter space to search over
AR_terms = c(0,1,2)
I_terms = c(0,1)
MA_terms = c(0,1,2)
garch_p_terms = c(0,1,2)
garch_q_terms = c(0,1,2)
## Models to search over
var_models = c("sGARCH","eGARCH","gjrGARCH","apARCH","iGARCH","csGARCH")
for (x in var_models) {
if (x == 'fGARCH') {
for (y in sub_var_models) {
for (AR in AR_terms) {
for (MA in MA_terms) {
for (I in I_terms) {
for (p in garch_p_terms) {
for (q in garch_q_terms) {
cat(y)
spec = spec_creator('fGARCH', y, MA, AR, I, p, q)
garch = ugarchfit(spec = spec, data = apple['A'], solver = 'hybrid', solver.control = list(trace=0))
cat('Fit Success')
}
}
}
}
}
}
next ## To skip evaluating fGARCH as its own model with not submodel below.
}
for (AR in AR_terms) {
for (MA in MA_terms) {
for (I in I_terms) {
for (p in garch_p_terms) {
for (q in garch_q_terms) {
cat(x)
spec = spec_creator(x, 'null', MA, AR, I, p, q)
garch = ugarchfit(spec = spec, data = apple['A'], solver = 'hybrid', solver.control = list(trace=0))
cat('Fit Success')
}
}
}
}
}
}
)这里定义了我的spec_creator函数:( fGARCH模型允许一个子模型族,这是大多数冗余代码的原因)
## Function to create the specs, purely to make the for loop area more readable.
spec_creator = function(model, sub_model, AR_term, I_term, MA_term, garch_p_term, garch_q_term) {
require(rugarch)
if (sub_model == 'null') {
spec = ugarchspec(variance.model = list(model = model,
garchOrder = c(garch_p_term, garch_q_term),
submodel = NULL,
external.regressors = NULL,
variance.targeting = FALSE),
mean.model = list(armaOrder = c(AR_term, I_term, MA_term)))
}
else {
spec = ugarchspec(variance.model = list(model = 'fGARCH',
garchOrder = c(garch_p_term, garch_q_term),
submodel = sub_model,
external.regressors = sub_model,
variance.targeting = FALSE),
mean.model = list(armaOrder = c(AR_term, I_term, MA_term)))
}
}当我运行上面的代码时,我得到了许多sGARCH模型的成功消息,但最终得到了这个错误:Error: $ operator is invalid for atomic vectors,回溯指向ugarchfit()和一个hessian()函数。
我假设这是某种收敛问题,但不知道是哪种。
编辑:这是我的数据(尽管其他数据集也会出现同样的错误),
A
28.57223993
28.30616607
28.2447644
28.29934366
28.39485735
28.80420177
29.29541506
29.42504079
29.31588228
29.51373208
30.25737443
28.94747231
28.85195861
28.72915529
29.17943414
29.12485489
29.04298601
28.96111712
27.95822332
28.5381279
28.68822085
28.12878349
27.96504572
29.32952709
30.31877609
30.1345711
29.629713
30.01859019
30.71447569
30.55756033
29.09756526
29.72522669
29.96401093
29.96401093
28.98840675
27.59663575
28.07420423
28.89971546
28.70868807
27.75355111
28.28569885
29.21354618
31.89475207
31.29438027
31.36260434
31.41718359发布于 2019-01-18 20:08:29
实际上,错误出现在很少的模型之后。之后,许多其他模型也会抛出相同的错误。
这是,也不是一个收敛问题。使用trace = 1,您可以看到,在这种情况下,hybrid方法从solnp到nlminb再到gosolnp,当gosolnp显然也无法获得解决方案时,它无法无错误地退出。下一个求解器将是nloptr,它实际上工作得很好。
在gosolnp方面,我们有
Trying gosolnp solver...
Calculating Random Initialization Parameters...ok!
Excluding Inequality Violations...
...Excluded 500/500 Random Sequences
Evaluating Objective Function with Random Sampled Parameters...ok!
Sorting and Choosing Best Candidates for starting Solver...ok!
Starting Parameters and Starting Objective Function:
[,1]
par1 NA
par2 NA
par3 NA
objf NA这意味着所有500组随机初始参数都不能满足不等式约束。由于其他一切似乎都运行良好,我怀疑这些初始参数非常不适合GARCH。尝试多达50000组参数不会有任何帮助。您可能会尝试通过solver.control传递gosolnp的distr,但这并不是很好,因为其他模型也会出现同样的问题(因此,很可能很难为每种情况选择一组好的发行版)。
因此,我们可以做的是仍然使用hybrid,但查找错误,如果有错误,则使用nloptr
spec <- spec_creator(x, 'null', MA, AR, I, p, q)
garch <- tryCatch(ugarchfit(spec = spec, data = apple['A'],
solver = 'hybrid', solver.control = list(trace = 0)),
error = function(e) e)
if(inherits(garch, "error")) {
garch <- ugarchfit(spec = spec, data = apple['A'],
solver = 'nloptr', solver.control = list(trace = 0))
}我并没有用这段代码运行完你的代码,但是超过10分钟就没问题了。
https://stackoverflow.com/questions/54246366
复制相似问题