将DF转换为动态lm估计的时间序列

时间:2016-04-13 15:14:17

标签: r time-series lag lm

我在数据框中导入并存储了一些变量来进行基本回归和统计分析。从这些变量的时间序列开始,我建立了我的DF并附加了一个Date变量,以便在绘图时有一个明确的参考时间。 DF看起来大致如此(我只是随机部分):

     time        ffr      cpi          gap
266 2013-04-01    0.12   0.75         -4.17
267 2013-07-01    0.09   1.90         -3.85
268 2013-10-01    0.09   1.28         -3.34
269 2014-01-01    0.07   1.32         -3.94
270 2014-04-01    0.09   1.98         -3.24
271 2014-07-01    0.09   1.31         -2.60
272 2014-10-01    0.10  -0.02         -2.47
273 2015-01-01    0.11  -0.06         -2.68
274 2015-04-01    0.12   2.02         -2.10
275 2015-07-01    0.13   1.24         -1.98
276 2015-10-01    0.16   0.78         -2.11

现在,当我运行像

这样的简单回归时
reg1<-lm(df, ffr ~ cpi + gap)

一切正常,预期结果。但是,当我尝试使用具有自回归部分,滞后和前进的更复杂的模型时,事情变得非常混乱,我在网上找到的解决方案似乎不适用于我的情况。以下是一些例子:

reg2<-lm(df, ffr ~ cpi + gap + lag(ffr))

这给出了一个完美的契合,因为实际发生的是ffr在没有滞后的情况下自我回归。 然后我按照我在其他地方找到的内容,按照

以时间序列格式转换数据帧
df<-xts(df, order.by=df$time)

然后

reg3<-lm(df, ffr ~ cpi + gap + lag(ffr))

实际上给出了超级奇怪的结果,因为在我的理解中它出现了所有cpi,gap和ffr的观察被用作变量。 这里是回归的输出

Call:
lm(formula = ffr ~ cpi + gap + lag(ffr), data = small2)

Residuals:
ALL 11 residuals are 0: no residual degrees of freedom!

Coefficients: (16 not defined because of singularities)
             Estimate Std. Error t value Pr(>|t|)
(Intercept)         3         NA      NA       NA
cpi-0.06            1         NA      NA       NA
cpi 0.75            2         NA      NA       NA
cpi 0.78            4         NA      NA       NA
cpi 1.24            3         NA      NA       NA
cpi 1.28           -1         NA      NA       NA
cpi 1.31           -1         NA      NA       NA
cpi 1.32           -2         NA      NA       NA
cpi 1.90           -1         NA      NA       NA
cpi 1.98           -1         NA      NA       NA
cpi 2.02            2         NA      NA       NA
gap-2.10           NA         NA      NA       NA
gap-2.11           NA         NA      NA       NA
gap-2.47           NA         NA      NA       NA
gap-2.60           NA         NA      NA       NA
gap-2.68           NA         NA      NA       NA
gap-3.24           NA         NA      NA       NA
gap-3.34           NA         NA      NA       NA
gap-3.85           NA         NA      NA       NA
gap-3.94           NA         NA      NA       NA
gap-4.17           NA         NA      NA       NA
lag(ffr)0.09       NA         NA      NA       NA
lag(ffr)0.10       NA         NA      NA       NA
lag(ffr)0.11       NA         NA      NA       NA
lag(ffr)0.12       NA         NA      NA       NA
lag(ffr)0.13       NA         NA      NA       NA

lag(ffr)0.16       NA         NA      NA       NA

Residual standard error: NA on 0 degrees of freedom
Multiple R-squared:     NA, Adjusted R-squared:     NA 
F-statistic:    NA on 10 and 0 DF,  p-value: NA

以及以下警告

Warning messages:
1: In model.response(mf, "numeric") :
  using type = "numeric" with a factor response will be ignored
2: In Ops.factor(y, z$residuals) : ‘-’ not meaningful for factors
3: In Ops.factor(r, 2) : ‘^’ not meaningful for factors

使用zoo代替xts时同样适用。然后我尝试dyn包,数据以数据帧和xts / zoo对象的形式存在:没有任何作用,我分别得到了完美的拟合和通常的错误。使用包dynlm,没有任何变化。什么是关于什么的提示或想法?

啊,在转换xts中的原始数据帧后,它看起来像这样

           time         ffr    cpi     gap    
2013-04-01 "2013-04-01" "0.12" " 0.75" "-4.17"
2013-07-01 "2013-07-01" "0.09" " 1.90" "-3.85"
2013-10-01 "2013-10-01" "0.09" " 1.28" "-3.34"
2014-01-01 "2014-01-01" "0.07" " 1.32" "-3.94"
2014-04-01 "2014-04-01" "0.09" " 1.98" "-3.24"
2014-07-01 "2014-07-01" "0.09" " 1.31" "-2.60"
2014-10-01 "2014-10-01" "0.10" "-0.02" "-2.47"
2015-01-01 "2015-01-01" "0.11" "-0.06" "-2.68"
2015-04-01 "2015-04-01" "0.12" " 2.02" "-2.10"
2015-07-01 "2015-07-01" "0.13" " 1.24" "-1.98"
2015-10-01 "2015-10-01" "0.16" " 0.78" "-2.11"

所以我想知道整个问题是转换无法转换DF。

1 个答案:

答案 0 :(得分:0)

您可以自行计算延迟,使用shift向数据框添加新列:

df$lag1 <- shift(df$ffr)
reg3<-lm(ffr ~ cpi + gap + lag1, df)

使用11行的结果:

> summary(reg3)

Call:
lm(formula = ffr ~ cpi + gap + lag1, data = df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.012355 -0.006234 -0.004345  0.003007  0.019277 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.0983353  0.0362563   2.712   0.0350 *
cpi         -0.0009486  0.0058926  -0.161   0.8774  
gap          0.0215892  0.0066774   3.233   0.0178 *
lag1         0.6821619  0.2476126   2.755   0.0331 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01254 on 6 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.844, Adjusted R-squared:  0.7659 
F-statistic: 10.82 on 3 and 6 DF,  p-value: 0.007808

或者,转换为时间序列并使用dynlm

dft <- as.ts(df)
library(dynlm)
reg4 <- dynlm(ffr ~ cpi + gap + L(ffr,1), dft)

结果:

> summary(reg4)

Time series regression with "ts" data:
Start = 2, End = 11

Call:
dynlm(formula = ffr ~ cpi + gap + L(ffr, 1), data = dft)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.012355 -0.006234 -0.004345  0.003007  0.019277 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.0983353  0.0362563   2.712   0.0350 *
cpi         -0.0009486  0.0058926  -0.161   0.8774  
gap          0.0215892  0.0066774   3.233   0.0178 *
L(ffr, 1)    0.6821619  0.2476126   2.755   0.0331 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01254 on 6 degrees of freedom
Multiple R-squared:  0.844, Adjusted R-squared:  0.7659 
F-statistic: 10.82 on 3 and 6 DF,  p-value: 0.007808

希望它有所帮助。

评论后编辑:lag无效的原因进行了一些澄清。

也许你会更清楚地看到lag在这个玩具示例的时间序列中如何运作,其中该系列具有适当的时间值:

> test <- ts(rnorm(48), start=c(2012), frequency=12)
             Jan         Feb         Mar         Apr         May         Jun         Jul         Aug         Sep         Oct
2012  0.55388567 -1.44187059 -1.81896266 -1.44285425 -1.37991005 -0.49844787 -1.26719606 -0.49876644  1.89507307 -0.74584888
2013  1.55083914  0.15779179  0.58075346  0.90677437  0.31632688 -0.20882555  0.05336465 -0.22241098 -0.11031220  0.12591051
2014  1.49442765  1.87654149 -1.18599539  1.72865701 -0.90245650  0.19460586  0.16168719  0.16245094  1.30435313  1.27952402
2015  0.53370893 -0.74539203 -0.47584512  0.19720682 -1.50906070 -0.21765018  1.03436621 -0.42588233 -0.15680010 -1.46725844
             Nov         Dec
2012  0.64720686 -0.88955517
2013  0.53687326 -0.04852013
2014  0.02273335  0.33675748
2015 -0.24954432 -0.89610509
> lag(test)
             Jan         Feb         Mar         Apr         May         Jun         Jul         Aug         Sep         Oct
2011                                                                                                                        
2012 -1.44187059 -1.81896266 -1.44285425 -1.37991005 -0.49844787 -1.26719606 -0.49876644  1.89507307 -0.74584888  0.64720686
2013  0.15779179  0.58075346  0.90677437  0.31632688 -0.20882555  0.05336465 -0.22241098 -0.11031220  0.12591051  0.53687326
2014  1.87654149 -1.18599539  1.72865701 -0.90245650  0.19460586  0.16168719  0.16245094  1.30435313  1.27952402  0.02273335
2015 -0.74539203 -0.47584512  0.19720682 -1.50906070 -0.21765018  1.03436621 -0.42588233 -0.15680010 -1.46725844 -0.24954432
             Nov         Dec
2011              0.55388567
2012 -0.88955517  1.55083914
2013 -0.04852013  1.49442765
2014  0.33675748  0.53370893
2015 -0.89610509

该函数并未真正更改列本身,而是更改它与之关联的时间值。但是,在示例中使用“普通”数据框执行此操作:

> df$ffr
 [1] 0.12 0.09 0.09 0.07 0.09 0.09 0.10 0.11 0.12 0.13 0.16
> lag(df$ffr)
 [1] 0.12 0.09 0.09 0.07 0.09 0.09 0.10 0.11 0.12 0.13 0.16
attr(,"tsp")
[1]  0 10  1

您会看到,即使它不是时间序列,lag也会向其添加tsp属性(请参阅?tsp),但值本身不会更改,也不会索引,这就是当你使用lm时看到完美契合的原因。

另一方面,如果您使用转换为时间序列的数据框来执行此操作,

> dft[,2]
Time Series:
Start = 1 
End = 11 
Frequency = 1 
 [1] 0.12 0.09 0.09 0.07 0.09 0.09 0.10 0.11 0.12 0.13 0.16
> lag(dft[,2])
Time Series:
Start = 0 
End = 10 
Frequency = 1 
 [1] 0.12 0.09 0.09 0.07 0.09 0.09 0.10 0.11 0.12 0.13 0.16

它再次改变了元数据,但没有改变值或索引,lm无法理解差异。

作为一个侧面点,您可以在使用shift时选择滞后,默认情况下第二个参数为1,请参阅?shift

希望它有所帮助。