Predicciones de 1 paso adelante con el paquete dynlm R

11

He ajustado un modelo con varias variables independientes, una de las cuales es el retraso de la variable dependiente, usando el paquete dynlm.

Suponiendo que tengo pronósticos de 1 paso adelante para mis variables independientes, ¿cómo obtengo pronósticos de 1 paso adelante para mis variables dependientes?

Aquí hay un ejemplo:

library(dynlm)

y<-arima.sim(model=list(ar=c(.9)),n=10) #Create AR(1) dependant variable
A<-rnorm(10) #Create independant variables
B<-rnorm(10)
C<-rnorm(10)
y<-y+.5*A+.2*B-.3*C #Add relationship to independant variables 
data=cbind(y,A,B,C)

#Fit linear model
model<-dynlm(y~A+B+C+L(y,1),data=data)

#Forecast
A<-c(A,rnorm(1)) #Assume we already have 1-step forecasts for A,B,C
B<-c(B,rnorm(1))
C<-c(C,rnorm(1))
y=window(y,end=end(y)+c(1,0),extend=TRUE)
newdata<-cbind(y,A,B,C)
predict(model,newdata)

Y aquí hay un ejemplo usando el paquete dyn, que funciona.

library(dyn)

#Fit linear model
model<-dyn$lm(y~A+B+C+lag(y,-1),data=data)

#Forecast
predict(model,newdata)the dyn packages, which works:
Zach
fuente
Usar solo el dynlmpaquete no proporcionará pronósticos para sus variables dependientes. Proporcionar pronósticos para sus variables dependientes requerirá un modelo para explicarlas y probablemente datos adicionales. Le sugiero que lea algo sobre la regresión multivariada, como "Análisis estadístico multivariado aplicado" de Johnson y Wichern. o un curso sobre pronósticos: duke.edu/~rnau/411home.htm
deps_stats
1
@deps_stats La variable dependiente es lo que quiero pronosticar. Supongo que ya tengo pronósticos para mis variables independientes. En mi código de ejemplo, y es la variable dependiente que intento pronosticar, y A, B, C son las variables independientes, para las que ya tengo pronósticos. Si ejecuta el código de ejemplo que publiqué, comprenderá la naturaleza de mi problema.
Zach
@Zach: ¡Buena calificación de Kaggle! (Hice clic en el enlace en su perfil de mouse-over)
Hugh Perkins

Respuestas:

13

Felicitaciones, has encontrado un error. La predicción para dynlmcon nuevos datos se rompe si se utilizan variables rezagadas. Para ver por qué mirar la salida de

predict(model)
predict(model,newdata=data)

Los resultados deberían ser los mismos, pero no lo son. Sin newdataargumento, la predictfunción básicamente toma el modelelemento de la dynlmsalida. Con newdataargumento predictintenta formar una nueva matriz modelo a partir de newdata. Dado que esto implica analizar la fórmula suministrada dynlmy la fórmula tiene una función L, que se define solo internamente en la función dynlm, se forma la matriz de modelo incorrecta. Si intenta depurar, verá que la variable dependiente retrasada no se retrasa en el caso de newdataque se proporcione un argumento.

Lo que puede hacer es retrasar la variable dependiente e incluirla en el newdata. Aquí está el código que ilustra este enfoque. Lo uso set.seedpara que sea fácilmente reproducible.

library(dynlm)

set.seed(1)
y<-arima.sim(model=list(ar=c(.9)),n=10) #Create AR(1) dependant variable
A<-rnorm(10) #Create independant variables
B<-rnorm(10)
C<-rnorm(10)
y<-y+.5*A+.2*B-.3*C #Add relationship to independant variables 
data=cbind(y,A,B,C)

#Fit linear model
model<-dynlm(y~A+B+C+L(y,1),data=data)

Aquí está el comportamiento con errores:

> predict(model)
       2        3        4        5        6        7        8        9       10 
3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738 
> predict(model,newdata=data)
        1         2         3         4         5         6         7         8         9        10 
2.1628335 3.7063579 2.9781417 2.1374301 3.2582376 1.9534558 1.3670995 2.4547626 0.8448223 1.8762437 

Formar el newdata

#Forecast fix.
A<-c(A,rnorm(1)) #Assume we already have 1-step forecasts for A,B,C
B<-c(B,rnorm(1))
C<-c(C,rnorm(1))

newdata<-ts(cbind(A,B,C),start=start(y),freq=frequency(y))

newdata<-cbind(lag(y,-1),newdata)
colnames(newdata) <- c("y","A","B","C")

Compare el pronóstico con el ajuste del modelo:

> predict(model)
       2        3        4        5        6        7        8        9       10 
3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738 
> predict(model,newdata=newdata)
       1        2        3        4        5        6        7        8        9       10       11 
      NA 3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738 1.102367 

Como puede ver para los datos históricos, el pronóstico coincide y el último elemento contiene el pronóstico de 1 paso por delante.

mpiktas
fuente
¿Cómo puede manejar el caso en el que tiene dos rezagos en la misma fórmula? lag(y,-1)+lag(y,-2)?
Hugh Perkins
1
Bueno, entonces esta solución no funciona. Necesita escribir su propia función de predicción.
mpiktas
Ah, eso es lo que hice de hecho :-P
Hugh Perkins
1
¿Consideró enviarlo a los autores de dynlm? Es una situación extraña, que no puedes predecir usando dynlm.
mpiktas
Hmmm, ¿estás diciendo que no van a monitorear mágicamente el flujo de stackover y corregir errores? ¡Supongo que probablemente sea cierto!
Hugh Perkins
2

Siguiendo la solicitud de @ md-azimul-haque, busqué en mi código fuente de 4 años y encontré la siguiente función con el nombre apropiado. ¿No está seguro de si esto es lo que está buscando @ md-azimul-haque?

# pass in training data, test data,
# it will step through one by one
# need to give dependent var name, so that it can make this into a timeseries
predictDyn <- function( model, train, test, dependentvarname ) {
    Ntrain <- nrow(train)
    Ntest <- nrow(test)
    # can't rbind ts's apparently, so convert to numeric first
    train[,dependentvarname] <- as.numeric(train[,dependentvarname])
    test[,dependentvarname] <- NA
    testtraindata <- rbind( train, test )
    testtraindata[,dependentvarname] <- ts( as.numeric( testtraindata[,dependentvarname] ) )
    for( i in 1:Ntest ) {
       cat("predicting i",i,"of",Ntest,"\n")
       result <- predict(model,newdata=testtraindata,subset=1:(Ntrain+i-1))
       testtraindata[Ntrain+i,dependentvarname] <- result[Ntrain + i + 1 - start(result)][1]
    }
    testtraindata <- testtraindata[(Ntrain+1):(Ntrain + Ntest),dependentvarname]
    names(testtraindata) <- 1:Ntest
    return( testtraindata )
}
Hugh Perkins
fuente