2017-01-18 1 views
0

Предположим, что у меня есть следующий цикл «для». В частности, этот код, который я построил, сначала вычисляет AIC для ARCH (1) моделей всех указанных ароматов и, во-вторых, вычисляет AIC для моделей GARCH (1,1) указанных ароматов.Добавление аромата EGARCH в петлю над моделями вкуса fGARCH

library(rugarch) 
bchain_2012_logreturns=diff(log(prices)) 
aic_2012=matrix(NA,14,1) 
garch_flavor=c("GARCH","AVGARCH","TGARCH","GJRGARCH","NGARCH","NAGARCH","APARCH") 
k=1 
for (i in 0:1){ 
for (j in garch_flavor){ 
model_2012=ugarchspec(variance.model = list(model="fGARCH", submodel = j, garchOrder = c(1, i)),mean.model = list(armaOrder = c(0, 0))) 
modelfit_2012=ugarchfit(spec=model_2012, data=bchain_2012_logreturns, solver="hybrid") 
aic_2012[k,]=infocriteria(modelfit_2012)[1] 
k=k+1 
} 
} 

Как указано в "rugarch" пакета виньетка на R CRAN (ссылка: https://cran.r-project.org/web/packages/rugarch/vignette/Introduction_to_the_rugarch_package.pdf), модель аромата "EGARCH" НЕ входит среди семейства GARCH (т.е. "fGARCH") подмоделями. Нужна команда, чтобы оценить модель EGARCH с пакетом «rugarch» заключается в следующем:

model_2012=ugarchspec(variance.model = list(model="eGARCH",garchOrder = c(1, 1)),mean.model = list(armaOrder = c(0, 0))) 
modelfit_2012=ugarchfit(spec=model_2012, data=bchain_2012_logreturns, solver="hybrid") 

Что мне нужно сделать ОДНОВРЕМЕННО заключается в следующем:

1) интегрировать последнюю команду для оценки EGARCH в петлю так что у меня есть только одна команда для вычисления AIC всех моделей 8 GARCH.

2) Установите «единый» цикл, чтобы перебирать только по eGARCH порядка (1,1).

Я новичок в программировании R, и для меня это нетривиальная проблема.

Заранее спасибо.

ответ

1

Использование lapply и условными вы могли бы сделать:

#Combine all model names into one vector 
model_names =c("eGARCH","GARCH","AVGARCH","TGARCH","GJRGARCH","NGARCH","NAGARCH","APARCH") 

#If model name equals "eGARCH" use formula1 else formula2, compute for order (1,1) only 
#for other models compute for orders (1,0) and (1,1) 
#calculate AIC for each model and rbind to form a combined data.frame 


AIC_2012 = do.call(rbind,lapply(model_names,function(x) { 

    if (x=="eGARCH"){ 

    model_2012_0 = ugarchspec(variance.model = list(model= x,garchOrder = c(1, 1)),mean.model = list(armaOrder = c(0, 0))) 
    modelfit_2012_0 =ugarchfit(spec=model_2012_0 , data=bchain_2012_logreturns, solver="hybrid") 

    DF = data.frame(model_name = x,order= "1,1" ,AIC = infocriteria(modelfit_2012_0)[1]) 

    }else { 

    model_2012_0 = ugarchspec(variance.model = list(model="fGARCH", submodel = x, garchOrder = c(1, 0)),mean.model = list(armaOrder = c(0, 0))) 
    model_2012_1 = ugarchspec(variance.model = list(model="fGARCH", submodel = x, garchOrder = c(1, 1)),mean.model = list(armaOrder = c(0, 0))) 

    modelfit_2012_0 =ugarchfit(spec=model_2012_0 , data=bchain_2012_logreturns, solver="hybrid") 
    modelfit_2012_1 =ugarchfit(spec=model_2012_1, data=bchain_2012_logreturns, solver="hybrid") 

    DF_0 = data.frame(model_name = x, order= "1,0" , AIC = infocriteria(modelfit_2012_0)[1]) 
    DF_1 = data.frame(model_name = x, order= "1,1" , AIC = infocriteria(modelfit_2012_1)[1]) 

    DF = rbind(DF_0,DF_1) 

    } 

    return(DF) 

})) 
+0

Да, я пытался обойти, если заявление. Но мне было слишком сложно структурировать такую ​​команду. Так что спасибо тебе. В любом случае, запустив код, я наткнулся на это сообщение об ошибке «object x not found». – msmna93

+0

Вы по-прежнему сталкиваетесь с ошибкой, если бы вы могли попробовать 'traceback()' и указать вывод – OdeToMyFiddle

+0

Извините, но мой CTRL + K для форматирования мини-уценки не работает. Это сообщение об ошибке я получаю: + еще { Ошибка: неожиданный 'еще' в: " еще" > > model_2012_0 = ugarchspec (variance.model = лист (модель = "fGARCH" подмодели = х, garchOrder = c (1, 0)), mean.model = list (armaOrder = c (0, 0))) Ошибка в ugarchspec (variance.model = list (model = "fGARCH", subodel = x,: объект " х»не найдено – msmna93

Смежные вопросы