R rugarch:$运算符对原子向量无效?
R rugarch: $ operator invalid for atomic vectors?
我正在尝试制作一个巨大的嵌套 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
实际上错误出现在极少数模型之后。之后许多其他模型也抛出相同的错误。
这是也不是收敛问题。使用 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 多分钟没问题。
我正在尝试制作一个巨大的嵌套 for 循环(优化留待以后使用)以适应 rugarch
.
这是我重现错误的 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
实际上错误出现在极少数模型之后。之后许多其他模型也抛出相同的错误。
这是也不是收敛问题。使用 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 多分钟没问题。