Hola Jorge: Disculpa la tardanza pero me han tenido liado en otros menesteres. Yo no soy ni muchísimo menos un experto ni en series temporales ni en R de hecho retomo el tema después de muchos (demasiados) años aparcado y dedicándome a labores de programación pura y dura. Respecto a la diferencia de resultados con R y Statgraphics, no conozco el proceso de selección del modelo ARIMA que hace Statgraphics por lo que no puedo compararlo con el de R. Visto la experiencia que ha comentado Gregorio en el hilo de los Arima automatizados, no parece que el auto.arima de R sea un algoritmo del todo afinado, aun. La diferencia básica entre uno y otro resultado, tal y como yo lo interpreto, es que R aplica una diferencia regular (señal de que detecta tendencia) y Statgraphics no. En el gráfico que envías parece apreciarse una ligera tendencia creciente (que habría que confirmar observando la acf u otros métodos) de la serie para establecer si conviene o no realizar esa diferencia. Eso es el primer punto de comprobación, que junto con el chequeo de homocedasticidad y posible presencia de estacionalidad son los primeros pasos para hacer la serie estacional y posteriormente determinar el modelo Arima. Quiero decir que, una vez que hemos hecho la serie estacionaria (sin tendencia, con la estacionalidad eliminada y con homocedasticidad), ya entraríamos a determinar que ordenes p,q,P,Q son los que determinan el mejor modelo.Aquí estriba la diferencia, R considera que no es estacionaria y por eso aplica una diferencia regular para eliminar la tendencia, mientras que Statgraphics si la considera estacionaria y calcula un ARMA (1,0). Todo esto es algo muy básico en el tratamiento de series temporales, que seguro que conoces mas que de sobra, pero me ha parecido adecuado ponerlo expresamente para tener claro el punto de partida. Respecto a trabajos o documentos que te puedan ayudar no entiendo muy bien a que te refieres con lo de "que sirva de referencia para conocer como explicar la estimación de una serie", si me lo aclaras intentare comentarte los documentos que yo manejo. Por cierto el código de R que uso para conectarme al servidor de SQL, bajarme los datos, calcular los arimas y guardar los resultados es mas o menos este. Es el primer código de R medianamente largo que hago así que habrá muchas cosas a mejorar o corregir así que no lo tomes ni mucho menos como una referencia. #Inicializamos variables AnoModelo <- 2010 Tipologia <- 1 #Cargamos la libreria RODBC y forecast para calcular modelos ARIMA automaticos library(RODBC) library(forecast) #Establecemos la conexion con el SQL Server channel <- odbcDriverConnect( "case=nochange; Driver=SQL Server; Server=+++++++; Database=+++++++++; uid=++++++++; pwd=++++++++++; wsid=++++++++++++;") #Una vez establecida la conexion consultamos la tabla de la BBDD y la guardamos en un data frame llamado Total Total <- sqlQuery(channel,paste("SELECT * FROM DATOS_FOMENTO_PROVINCIAL_BASE2005 WHERE codprovi is not null ")) #Definimos funcion para calcular p-valores de los coeficientes cwp <- function (object) { coef <- coef(object) if (length(coef) > 0) { mask <- object$mask sdev <- sqrt(diag(vcov(object))) t.rat <- rep(NA, length(mask)) t.rat[mask] <- coef[mask]/sdev pt <- 2 * pnorm(-abs(t.rat)) setmp <- rep(NA, length(mask)) setmp[mask] <- sdev sum <- rbind(coef, setmp, t.rat, pt) dimnames(sum) <- list(c("coef", "s.e.", "t ratio", "p-valor"), names(coef)) return(sum) } else return(NA) } #Creamos df que contendra los datos del modelo modelo <- data.frame(Tipologia = numeric(0), Provincia = numeric(0), AnoModelo = numeric(0), ecuacion =character(0), aicc = numeric(0), bic =numeric(0), sigma2 = numeric(0), loglik = numeric(0), coeficientes = character(), signific =character(), MASE = numeric(0) ) #Creamos df con datos de las predicciones predicciones <- data.frame(Tipologia = numeric(0), Provincia = numeric(0), AnoModelo = numeric(0), ecuacion =character(0), Anio_Trimestre = character(0), estimacion = numeric(0), inf8df.modelo0 = numeric(0), sup80 = numeric(0), inf95 = numeric(0), sup95 = numeric(0) ) #Generamos bucle para recorrer las 52 provincias for (i in 1:52) { Provincia <- i #Generamos un df llamado activo donde guardaremos solo los datos de la provincia que nos interesa del df Total activo <- subset(Total, codprovi == i, select = c(codprovi,Año,Trimestre,Precio_Totales)) #Generamos, a partir de activo, un objeto ts que llameremos st para tener la serie temporal st <- ts(activo$Precio_Totales, frequency = 4, start = c(activo[1,2], activo[1,3])) #Asignamos un objeto forecast llamado fit que contiene el mejor modelo automaticamente ajustado a los datos fit <- auto.arima(st, ic ="aicc", stepwise= TRUE) #Obtenemos una variable con los coeficientes del modelo y sus p-valores pv <- as.data.frame(cwp(fit)) #Guardamos diagnosis de parametros en un df numparam <- length(colnames(pv)) #Obtenemos el numero de parametros presente en el modelo coeficientes <- data.frame( CF = character(0) ) #Inicializamos df que contendra los coeficientes del modelo signific <- TRUE #Hacemos el modelo valido por defecto for (j in 1:numparam) { parame <- colnames(pv)[j] #Obtenemos los nombres de los parametros que forman el modelo coefic <- round(pv[1,j],4) #Obtenemos los coeficientes de esos parametros pvalor <- round(pv[4,j],4) #Obtenemos los p-valores de los coeficientes (si p-valor < 0.1 --> parametro significativo) if (parame != "cwp(fit)") { if ((pvalor >= 0.1) & ( signific = TRUE) ) #Chequeamos los p-valores y si hay alguno > 0.1 marcamos modelo como no valido signific = FALSE else signific = TRUE } else signific = FALSE if (j == 1) #Construimos cadena donde se guardan los nombres de los parametros, sus coeficientes y sus p-valores asociados coeficientes <- paste("Param:" , parame, " Coefic:" , coefic, " P-Val: ", pvalor) else coeficientes <- paste(coeficientes, "| Param:" , parame, " Coefic:" , coefic, " P-Val: ", pvalor) } #Extraemos los datos de fit que nos interesa guardar a un df para añadirlos al df modelo ecuacion <- paste("ARIMA(" ,fit$arma[1],fit$arma[6],fit$arma[2],")(",fit$arma[3], fit$arma[7],fit$arma[4], ")" ) MASE <-accuracy(fit)[6] df.modelo <- data.frame(Tipologia, Provincia, AnoModelo, ecuacion, fit$aicc , fit$bic, fit$sigma2, fit$loglik, coeficientes, signific, MASE) names(df.modelo)[5] <- "aicc" names(df.modelo)[6] <- "bic" names(df.modelo)[7] <- "sigma2" names(df.modelo)[8] <- "loglik" #Acumulamos los datos del modelo en el df modelo modelo <- rbind(modelo,df.modelo) #Extraemos las predicciones a un df df.predicciones <- data.frame(Tipologia, Provincia, AnoModelo, ecuacion, row.names(data.frame(forecast(fit, h=12))),data.frame(forecast(fit, h=12))) names(df.predicciones)[5] <- "Anio_Trimestre" names(df.predicciones)[6] <- "estimacion" names(df.predicciones)[7] <- "inf80" names(df.predicciones)[8] <- "sup80" names(df.predicciones)[9] <- "inf95" names(df.predicciones)[10] <- "sup95" #Acumulamos los datos de las predicciones en el df predicciones predicciones <- rbind(predicciones, df.predicciones) #Imprimimos provincia por la que vamos en pantalla y refrescamos pantalla print (paste(i, ecuacion, signific)) flush.console() #Generamos y guardamos plot con la serie dev.new() titulo <- paste("Modelo: ", ecuacion, " en la provincia: ", i) plot(forecast(fit,h=12), main = titulo ) savePlot(filename = paste(Tipologia, "-",i),type = "jpg", device = dev.cur(), restoreConsole = TRUE) dev.off() #Generamos y guardamos plot de diagnosis del modelo dev.new() tsdiag(fit) savePlot(filename = paste("Diagnosis ",Tipologia, "-",i),type = "jpg", device = dev.cur(), restoreConsole = TRUE) dev.off() } #Cambiamos los rownames del df modelo para que nos sirvan de clave primaria de la tabla rownames(modelo) <- paste(modelo$Tipologia, modelo$Provincia, modelo$AnoModelo) #Subimos el df modelo a la tabla FE_MODELO del servidor SQL sqlSave(channel,modelo,tablename ="FE_MODELOS", addPK =TRUE, append = TRUE ) #Cambiamos los rownames del df predicciones para que nos sirvan de clave primaria de la tabla rownames(predicciones) <- paste(predicciones$Tipologia, predicciones$Provincia, predicciones$AnoModelo, predicciones$Anio_Trimestre) #Subimos el df modelo a la tabla FE_PREDICCIONES del servidor SQL sqlSave(channel,predicciones,tablename ="FE_PREDICCIONES", addPK =TRUE, append = TRUE ) #Cerramos la conexion close(channel) rm(channel) Espero que te haya aclarado algunas cosas. Si necesitas algo mas no dudes en comentarlo Un saludo From: justodejorge@gmail.com To: Jluis GILSANZ/ES/EUROPE/GROUP@BNPPARIBAS Date: 09/05/2011 11:44 Subject: Series temporales Hola Jose Luis, he estado pendiente de los correos que has mantenido en la lista. Curiosamente yo tengo un problema parecido al tuyo y me alegro que iniciaras el hilo. Aunque llevo algunos años con R, soy nuevo en series. Te rogaría si puedes ayudarme, en caso afirmativo si el código que has generado podría ayudarme. Te comento mi situación. Dirijo dos trabajos de investigación y en ambos estimamos la eficiencia técnica de las empresas. En uno de ellos referente a líneas aéreas en el período 2002-2009 con datos mensuales. El valor de la eficiencia técnica oscila entre 0-1 y pretendemos una vez estimada la eficiencia aplicar un modelo ARIMA. Hemos estimado con el comando auto.arima con y sin drift y nos muestra estos resultados el gráfico que te adjunto. Series: Eficiencia ARIMA(1,1,1) Call: auto.arima(x = Eficiencia, allowdrift = TRUE) Coefficients: ar1 ma1 0.7720 -0.9644 s.e. 0.0813 0.0363 sigma^2 estimated as 0.0001375: log likelihood = 287.15 AIC = -568.31 AICc = -568.04 BIC = -560.65 Antes te trabajar con R comence con statgraphics (es muy elemental, pero tiene una ayuda que te indica como interpretar los resultados) y el modelo que me indica después de contrastar es un ARMA (1,0). No acabo de relacionar ambos resultados aunque entiendo que el válido es el proporcionado con R aunque después de vuestros correos. Finalmente no se si conoces algún trabajo publicado (los que encuentro son muy duros) que sirva de referencia para conocer como explicar la estimación de una serie. Espero no molestarte con este correo Gracias de antemano Saludos cordiales Justo -- *************************************************** Prof. Justo de Jorge Moreno. Depart.de Ciencias Empresariales Facultad de Ciencias Económicas y Empresariales. Plaza de la Victoria 2 Alcalá de Henares 28802 Universidad de Alcalá Teléfono: 918854293; Fax: 918854294 E-mail: justo.dejorge@uah.es Web: www2.uah.es/justo_de_jorge *************************************************[attachment "serie.doc" deleted by Jluis GILSANZ/ES/EUROPE/GROUP] -- AVISO LEGAL -- Los datos personales que en esta comunicación aparecen, así como los que nuestra empresa mantiene de Vd. y de su empresa, son tratados con la finalidad de mantener el contacto así como realizar las gestiones que en esta aparecen (Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal). Puede ejercer sus derechos de acceso, rectificación, cancelación y oposición dirigiéndose a atencion.clientes@tasacionesh.com La utilización de su dirección de correo electrónico por parte de nuestra empresa queda sujeta a las disposiciones de la Ley 34/2002, de Servicios de la Sociedad de la Información y el Comercio Electrónico. Si Vd. recibe comunicación comercial por nuestra parte y desea dejar de recibirla, rogamos nos lo comunique por vía electrónica a través de la dirección atencion.clientes@tasacionesh.com [[alternative HTML version deleted]]