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]]