使用Dynlm R包进行1步提前预测


11

我已经使用dynlm包对具有多个自变量的模型进行了拟合,其中一个是因变量的滞后。

假设我对自变量有1步超前预测,如何对因变量有1步超前预测?

这是一个例子:

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)

这是使用dyn包的示例,该示例有效。

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:

仅使用dynlm软件包将无法提供因变量的预测。提供因变量的预测将需要一个模型来解释它们以及可能的其他数据。我建议您阅读有关多元回归的内容,例如Johnson和Wichern的“应用多元统计分析”。或预测课程:duke.edu/~rnau/411home.htm
deps_stats 2011年

1
@deps_stats因变量是我要预测的。我假设我已经对我的自变量进行了预测。在我的示例代码中,y是我要预测的因变量,而A,B,C是我已经对其进行预测的自变量。如果运行我发布的示例代码,您将了解问题的本质。
Zach

@Zach:不错的Kaggle评分!(我点击了鼠标悬停配置文件中的链接)
休·珀金斯

Answers:


13

恭喜,您已找到一个错误。dynlm如果使用了滞后变量,则对新数据的预测将被破坏。看看为什么要看输出

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

结果应该是相同的,但事实并非如此。没有newdata参数,该predict函数基本上modeldynlm输出中获取元素。带newdata参数的predict尝试从中形成新的模型矩阵newdata。由于这涉及解析提供给dynlm的公式,并且该公式具有function L,该函数仅在函数内部定义dynlm,因此形成了错误的模型矩阵。如果尝试调试,则会看到在newdata提供参数的情况下,滞后因变量不会被滞后。

您可以做的就是将因变量滞后并将其包含在中newdata。这是说明此方法的代码。我使用set.seed它,因此很容易复制。

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)

这是越野车的行为:

> 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 

形成 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")

将预测与模型拟合进行比较:

> 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 

如您所见,对于历史数据,预测是一致的,最后一个元素包含提前1步的预测。


在相同的公式中有两个滞后时,您该如何处理? lag(y,-1)+lag(y,-2)
休·帕金斯

1
好吧,那么这个解决方案不起作用。您需要编写自己的预测函数。
mpiktas 2012年

啊,那是我实际上所做的:-P
休·帕金斯

1
您是否考虑过将其提交给动态作者?这是一种奇怪的情况,您无法预测使用dynlm。
mpiktas 2012年

嗯,您是说他们不会神奇地监视stackoverflow和修复错误?我想那可能是真的!
休·珀金斯

2

按照@ md-azimul-haque的请求,我浏览了4岁的源代码,并找到了以下适当命名的函数。不知道这是@ 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 )
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.