我在数据框中导入并存储了一些变量来进行基本回归和统计分析。从这些变量的时间序列开始,我建立了我的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。
答案 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
。
希望它有所帮助。