R rugarch: $ оператор недействителен для атомных векторов?
Я пытаюсь сделать огромный вложенный цикл (оптимизации следует оставить на потом), чтобы он соответствовал всем моделям GARCH, доступным на 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
1 ответ
На самом деле ошибка появляется после очень немногих моделей. Впоследствии многие другие модели также выдают такую же ошибку.
Это и не проблема сближения. С 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 наборов параметров не помогает. Возможно, вы могли бы поэкспериментировать с прохождением distr
из gosolnp
через solver.control
, но это не очень хорошо, так как та же проблема возникает и с другими моделями (так что, вероятно, трудно выбрать хороший набор дистрибутивов для каждого случая).
Итак, что мы можем сделать, это все еще использовать 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 минут.