将 DF 转换为时间序列以进行动态 lm 估计

transforming DF into time series for dynamic lm estimation

我已经在数据框中导入并存储了一些变量来执行基本回归和统计分析。从这些变量的时间序列开始,我建立了我的 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)

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

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

这给出了一个完美的契合,因为实际发生的是 ffr 没有滞后地自行回归。 然后我按照我在别处找到的,将数据框转为时间序列格式,by

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,没有任何变化。关于正在发生的事情有什么提示或想法吗?

啊,原来的dataframe在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。

您可以简单地自己计算延迟,使用 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

该函数并没有真正改变列本身,而是改变了它关联的时间值。但是,在您的示例中使用 "normal" 数据框进行操作:

> 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 不明白其中的区别。

附带一点,您可以 select 使用 shift 时的延迟,第二个参数默认为 1,请参阅 ?shift

希望对您有所帮助。