R rugarch: $ оператор недействителен для атомных векторов? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь создать огромный вложенный цикл (оптимизация будет оставлена ​​на потом), чтобы он подходил для всех моделей 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 Ответ

0 голосов
/ 18 января 2019

На самом деле ошибка появляется после очень немногих моделей. Впоследствии многие другие модели также выдают такую ​​же ошибку.

Это и не проблема конвергенции. С 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 минут.

...