首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R rugarch:$运算符对原子向量无效?

R rugarch:$运算符对原子向量无效?
EN

Stack Overflow用户
提问于 2019-01-18 08:52:22
回答 1查看 557关注 0票数 0

我正在尝试创建一个巨大的嵌套for循环(优化留待以后),以适应rugarch提供的所有GARCH模型。

这是我复制错误的MWE:

代码语言:javascript
复制
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模型允许一个子模型族,这是大多数冗余代码的原因)

代码语言:javascript
复制
## 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()函数。

我假设这是某种收敛问题,但不知道是哪种。

编辑:这是我的数据(尽管其他数据集也会出现同样的错误),

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-18 20:08:29

实际上,错误出现在很少的模型之后。之后,许多其他模型也会抛出相同的错误。

这是,也不是一个收敛问题。使用trace = 1,您可以看到,在这种情况下,hybrid方法从solnpnlminb再到gosolnp,当gosolnp显然也无法获得解决方案时,它无法无错误地退出。下一个求解器将是nloptr,它实际上工作得很好。

gosolnp方面,我们有

代码语言:javascript
复制
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传递gosolnpdistr,但这并不是很好,因为其他模型也会出现同样的问题(因此,很可能很难为每种情况选择一组好的发行版)。

因此,我们可以做的是仍然使用hybrid,但查找错误,如果有错误,则使用nloptr

代码语言:javascript
复制
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分钟就没问题了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54246366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档