5 votos

Extracto de BIC y AICc de arima() del objeto

Problema: me gustaría extraer el BIC y AICc de un arima() del objeto en R.

Antecedentes: El arima() la función produce una salida de resultados, que incluye los coeficientes estimados, los errores estándar, AIC, BIC, y AICc. Vamos a ejecutar el código de ejemplo para ver cómo se ve:

# Load the sunspots dataset
data(sunspots)
# Build an ARIMA(2,0,2) model and store as an object
model <- arima(x=sunspots, order=c(2,0,2), method="ML")
# Show a summary of the model
model 

La salida de resultados para el modelo aparece como esto:

Series: sunspots 
ARIMA(2,0,2) with non-zero mean 

Coefficients:
         ar1     ar2      ma1      ma2  intercept
      0.9822  0.0004  -0.3997  -0.1135    51.2652
s.e.  0.1221  0.1196   0.1206   0.0574     8.1441

sigma^2 estimated as 247.9:  log likelihood=-11775.69
AIC=23563.39   AICc=23563.42   BIC=23599.05

En la línea inferior, podemos ver los valores de AIC, BIC, y AICc. (Nota: este es el resultado que se muestra por arima() cuando el pronóstico paquete ha sido cargado, es decir, de la biblioteca(previsión))

El acceso a la AIC valor es muy fácil. Uno puede simplemente escriba:

> model$aic
[1] 23563.39

El acceso a la AIC valor de esta manera es posible debido al hecho de que es almacenado como uno de los modelo de los atributos. El código siguiente y de salida va a dejar esto en claro:

> attributes(model)
$names
 [1] "coef"      "sigma2"    "var.coef"  "mask"      "loglik"   
 [6] "aic"       "arma"      "residuals" "call"      "series"   
[11] "code"      "n.cond"    "model"    

$class
[1] "Arima"

Observe, sin embargo, que bic y aicc no son atributos de modelo, por lo que el siguiente código es de ninguna utilidad para nosotros:

> model$bic
NULL
> model$aicc
NULL

El BIC y AICc valores son, de hecho, calculado por el arima() función, pero el objeto que devuelve no nos da acceso directo a sus valores. Esto es incómodo y me he encontrado con otros que he planteado el problema. Por desgracia, no he encontrado una solución para el problema.

Puede alguien ayudar? Que método puedo utilizar para acceder a los BIC y AICc de la Arima clase de objeto.

Nota: he sugerido una respuesta, pero quisiera escuchar mejoras y sugerencias.

Edición (Versión detalles de lo solicitado):

> R.Version()
$platform
[1] "i686-pc-linux-gnu"

$arch
[1] "i686"

$os
[1] "linux-gnu"

$system
[1] "i686, linux-gnu"

$status
[1] ""

$major
[1] "3"

$minor
[1] "0.2"

$year
[1] "2013"

$month
[1] "09"

$day
[1] "25"

$`svn rev`
[1] "63987"

$language
[1] "R"

$version.string
[1] "R version 3.0.2 (2013-09-25)"

$nickname
[1] "Frisbee Sailing"

11voto

Stat Puntos 4224

Para el BIC y AIC, usted puede simplemente utilizar AIC función como sigue:

> model <- arima(x=sunspots, order=c(2,0,2), method="ML")
> AIC(model)
[1] 23563.39
> bic=AIC(model,k = log(length(sunspots)))
> bic
[1] 23599.05

La función de la AIC pueden proporcionar la AIC y BIC. Mira ?AIC.

7voto

dicenice Puntos 11

Respuesta: Una posible solución, aunque no pretendemos ser los mejores, es como sigue; es un hack que me he encontrado con que después de mirar en algún código fuente.

npar <- length(model$coef) + 1
nstar <- length(model$residuals) - model$arma[6] - model$arma[7] * model$arma[5]

bic <- model$aic + npar * (log(nstar) - 2)
aicc <- model$aic + 2 * npar * (nstar/(nstar - npar - 1) - 1)

Ahora que el bic y aicc han sido almacenados como objetos utilizando, únicamente, la salida de la arima() función - ahora podemos establecer como atributos a los objetos del modelo.

# Give model attributes for bic and aicc
attr(model,"bic") <- bic
attr(model,"aicc") <- aicc

> attributes(model)
$names
 [1] "coef"      "sigma2"    "var.coef"  "mask"      "loglik"   
 [6] "aic"       "arma"      "residuals" "call"      "series"   
[11] "code"      "n.cond"    "model"    

$class
[1] "Arima"

$bic
[1] 23599.05

$aicc
[1] 23563.42

Pasar estos atributos a un objeto nuevo (no queremos sobrescribir modelo).

# Create new object with these attributes
model_2 <- attributes(model)

Ahora podemos acceder a los BIC y AICc en forma similar a la manera en que se accede al valor de AIC. El siguiente código debe dejar esto en claro:

> model$aic
[1] 23563.39
> model_2$bic
[1] 23599.05
> model_2$aicc
[1] 23563.42

Editar: Basado en el muy útil la información proporcionada por @Stat acerca de la AIC() función, el código siguiente puede ser útil como formas alternativas de llegar a la AIC, BIC, AICc, y HQC. Adjuntar como atributos para el objeto del modelo y trabajar fuera.

# AIC
AIC(arima(x=sunspots, order=c(2,0,2), method="ML"))
# BIC
AIC(arima(x=sunspots, order=c(2,0,2), method="ML"),k=log(length(sunspots)))
# AICc    
AIC(arima(x=sunspots, order=c(2,0,2), method="ML")) + 2 * npar * (nstar/(nstar - npar - 1) - 1)
# HQC
AIC(arima(x=sunspots, order=c(2,0,2), method="ML"), k=2*log(log(length(sunspots))))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X