添加滞后变量到LM模型?(Adding lagged variables to an lm mode

2019-07-02 18:30发布

我使用的是一个时间序列,这实际上工作得很好流明,这是超级超级快。

比方说,我的模式是:

> formula <- y ~ x

我这训练在训练集:

> train <- data.frame( x = seq(1,3), y = c(2,1,4) )
> model <- lm( formula, train )

...我可以为新数据的预测:

> test <- data.frame( x = seq(4,6) )
> test$y <- predict( model, newdata = test )
> test
  x        y
1 4 4.333333
2 5 5.333333
3 6 6.333333

这个工程很好地超强,而且它确实迅速。

我要滞后变量添加到模型。 现在,我可以通过增加我原来的训练集做到这一点:

> train$y_1 <- c(0,train$y[1:nrow(train)-1])
> train
  x y y_1
1 1 2   0
2 2 1   2
3 3 4   1

更新下式:

formula <- y ~ x * y_1

...和培训会工作得很好:

> model <- lm( formula, train )
> # no errors here

然而,问题是,有没有使用“预测”的方式,是因为没有在批处理方式测试集填充Y_1的​​方式。

现在,对于许多其他回归的事情,也有很方便的方式来表达他们的公式中,如poly(x,2)等,而这些工作直接使用未经修改的训练和测试数据。

所以,我不知道是否有公式表达滞后变量的一些方法,使predict可以用吗? 理想的情况是:

formula <- y ~ x * lag(y,-1)
model <- lm( formula, train )
test$y <- predict( model, newdata = test )

......而无需增加(不知道这是正确的字)的训练和测试数据集,并只能够使用predict直接?

Answer 1:

看一看例如dynlm包,让你落后的运营商。 更普遍的计量经济学和时间序列的任务视图将有很多更适合你看。

下面是它的例子开始 - 一个和十二个月的滞后期:

R>      data("UKDriverDeaths", package = "datasets")
R>      uk <- log10(UKDriverDeaths)
R>      dfm <- dynlm(uk ~ L(uk, 1) + L(uk, 12))
R>      dfm

Time series regression with "ts" data:
Start = 1970(1), End = 1984(12)

Call:
dynlm(formula = uk ~ L(uk, 1) + L(uk, 12))

Coefficients:
(Intercept)     L(uk, 1)    L(uk, 12)  
      0.183        0.431        0.511  

R> 


Answer 2:

继德克对建议dynlm ,我不能完全弄清楚如何预测,但搜索,导致我dyn通过包https://stats.stackexchange.com/questions/6758/1-step-ahead-predictions-with -dynlm-R-包

随后几个小时的实验后,我想出了下面的函数来处理预测。 有相当多的“在路上抓把柄的,例如,你似乎无法rbind时间序列和预测的结果是由偏移start和一大堆这样的事情,所以我觉得这个答案相比,只是显著增加命名包,虽然我已经upvoted德克的回答。

所以,一个可行的解决方案是:

  • 使用dyn
  • 使用用于预测的以下方法

predictDyn方法:

# 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] <- as.numeric(test[,dependentvarname])
    testtraindata <- rbind( train, test )
    testtraindata[,dependentvarname] <- ts( as.numeric( testtraindata[,dependentvarname] ) )
    for( i in 1:Ntest ) {
       result <- predict(model,newdata=testtraindata,subset=1:(Ntrain+i-1))
       testtraindata[Ntrain+i,dependentvarname] <- result[Ntrain + i + 1 - start(result)][1]
    }
    return( testtraindata[(Ntrain+1):(Ntrain + Ntest),] )
}

实例:

library("dyn")

# size of training and test data
N <- 6
predictN <- 10

# create training data, which we can get exact fit on, so we can check the results easily
traindata <- c(1,2)
for( i in 3:N ) { traindata[i] <- 0.5 + 1.3 * traindata[i-2] + 1.7 * traindata[i-1] }
train <- data.frame( y = ts( traindata ), foo = 1)

# create testing data, bunch of NAs
test <- data.frame( y = ts( rep(NA,predictN) ), foo = 1)

# fit a model
model <- dyn$lm( y ~ lag(y,-1) + lag(y,-2), train )
# look at the model, it's a perfect fit. Nice!
print(model)

test <- predictDyn( model, train, test, "y" )
print(test)

# nice plot
plot(test$y, type='l')

输出:

> model

Call:
lm(formula = dyn(y ~ lag(y, -1) + lag(y, -2)), data = train)

Coefficients:
(Intercept)   lag(y, -1)   lag(y, -2)  
        0.5          1.7          1.3  

> test
             y foo
7     143.2054   1
8     325.6810   1
9     740.3247   1
10   1682.4373   1
11   3823.0656   1
12   8686.8801   1
13  19738.1816   1
14  44848.3528   1
15 101902.3358   1
16 231537.3296   1

编辑:嗯,这是超级慢,但。 即使我限制了所述数据subset的数据集的恒定几行,这需要每预测大约24毫秒,或者,对于我的任务, 0.024*7*24*8*20*10/60/60 = 1.792 hours :-O



Answer 3:

尝试ARIMA功能。 所述AR参数是自回归,这意味着滞后收率 XREG =允许您添加其他X变量。 你可以用predict.ARIMA预测。



Answer 4:

这里有一个想法:

你为什么不创建一个新的数据帧? 填入你需要的回归系数的数据帧。 你可以像L1,L2,列...,LP为你想要的任何变量的所有滞后,然后,你用你的功能完全一样你会为回归的一个横截面类型。

因为你就不必每次调用拟合和预测功能,时间对数据进行操作,但将有一次改变了数据,这将是相当快。 我知道,Eviews确定和塔塔提供滞后的运营商。 的确,有一些方便吧。 但是,这也是低效的,如果你不需要像“流明”计算的一切功能。 如果你有几十万次迭代的执行,你只要避免使计算所需要的预测或预报和像BIC或者AIC信息标准值,就可以打败“流明”的速度,你不会使用 - 只写函数中的OLS估计,你是好去。



文章来源: Adding lagged variables to an lm model?
标签: r lm