####################################################################################################################### # # En este script, se crea una función (mejor.garch) cuya salida nos da los órdenes (r y s) # del mejor GARCH(r,s) según uno de los criterios siguientes: AIC, AICC, BIC, # y estimado a través del método de máximo verosimilitud condicionada # # # Argumentos: # x ==> objeto de la clase "time series" al cual se le quiere ajustar un GARCH # ord.max ==> vector de longitud 2, cuyas componentes indican los órdenes máximos permitidos para r y s # criterio ==> criterio a seguir para la selección del modelo: "AIC", "AICC" o "BIC" # dist.max.crit ==> la función dará los órdenes de todos los modelos GARCH cuya función criterio tenga un valor que diste del mínimo a lo sumo dist.max.crit unidades # # # Salida: órdenes y valores de la función criterio para los GARCHs seleccionados # ######################################################################################################################## mejor.garch <- function(x=x.ts, ord.max=c(4,4), criterio="AIC", dist.max.crit=2) { # Chequeamos que no haya ningún problema con los argumentos de la función if (! is.ts(x)) stop("El argumento x debe ser un objeto de la clase ts") if ((criterio != "AIC") & (criterio != "AICC") & (criterio != "BIC")) stop("El argumento criterio debe ser igual a: AIC, AICC o BIC") if (length(ord.max) != 2) stop("El argumento ord.max debe tener longitud 2") for (i in 1:2) if ((ord.max[i] != round(ord.max[i])) | (ord.max[i] < 0)) stop("Cada valor del argumento ord.max debe ser un número entero no negativo") if (dist.max.crit < 0) stop("El argumento dist.max.crit no puede tomar un valor negativo") T <- length(x) # Creamos una matriz que posteriormente contendrá todas las combinaciones de los órdenes considerados y los valores de la función criterio para los GARCHs correspondientes VALORES.CRITERIO <- matrix(0,(ord.max[1]+1)*(ord.max[2]+1), 3) # La penalización que sobre la cantidad de parámetros imponen las funciones criterio AIC o BIC depende del factor definido abajo if (criterio=="AIC") factor <- 2 else if (criterio=="BIC") factor <- log(T) fila <- 0 library(tseries) for (r in 0:ord.max[1]) for (s in 0:ord.max[2]) { if (!((r==0) & (s==0))) ajuste <- garch(x=x, order=c(s,r), trace=FALSE) # La penalización que sobre la cantidad de parámetros impone la función criterio AICC depende del factor definido abajo if (criterio=="AICC") factor <- 2*T/(T-length(ajuste$coef)-2) if (!((r==0) & (s==0))) criterio.ajuste <- AIC(ajuste, k=factor) else criterio.ajuste <- 10000000000000000000000000000000000000000000 fila <- fila +1 VALORES.CRITERIO[fila, ] <- c(r, s, criterio.ajuste) } # Obtenemos la distancia de cada valor de la función criterio a su valor mínimo DISTANCIAS.AL.MINIMO <- VALORES.CRITERIO[,3] - min(VALORES.CRITERIO[,3]) # Creamos un vector con valores TRUE o FALSE dependiendo de si queremos que la fila correspondiente a cada componente del vector sea presentada en la salida o no, respectivamente FILAS.OK <- rep(FALSE,length=(ord.max[1]+1)*(ord.max[2]+1)) FILAS.OK[ DISTANCIAS.AL.MINIMO<= dist.max.crit] <- TRUE # Cargamos únicamente los resultados (órdenes y valor de la función criterio) que queremos mostrar VALORES.CRITERIO.OK <- VALORES.CRITERIO[FILAS.OK,] if (!is.matrix(VALORES.CRITERIO.OK)) VALORES.CRITERIO.OK <- t(as.matrix(VALORES.CRITERIO.OK)) # Ordenamos VALORES.CRITERIO.OK de forma descendente según el valor de la función criterio DISTANCIA.MAXIMA.OK <- VALORES.CRITERIO.OK[order(VALORES.CRITERIO.OK[,3]),] if (!is.matrix(DISTANCIA.MAXIMA.OK)) DISTANCIA.MAXIMA.OK <- t(as.matrix(DISTANCIA.MAXIMA.OK)) DISTANCIA.MAXIMA.OK <- data.frame(DISTANCIA.MAXIMA.OK) if (criterio=="AIC") names(DISTANCIA.MAXIMA.OK) <- c("r", "s", "AIC") else if (criterio=="AICC") names(DISTANCIA.MAXIMA.OK) <- c("r", "s", "AICC") else names(DISTANCIA.MAXIMA.OK) <- c("r", "s", "BIC") return(DISTANCIA.MAXIMA.OK) }