使用dynlm和lm

时间:2015-04-29 15:35:38

标签: r time-series lm

我首先使用lm然后使用dynlm(来自包dynlm)运行回归。以下是我使用lm所做的事情:

Euribor3t <- ts(diff(Euribor3))
OIS3t <- ts(diff(Ois3))
x <- ts(diff(Eurepo3-Ois3))
Vstoxxt <- ts(diff(Vstoxx))
CDSt <- ts(diff(CDS))
omo2 <- ts(diff(log(Open.Market.Operations)))
l1 <- (lag(Euribor3t, k=-1))
axx <- ts.intersect(Euribor3t, OIS3t, x, Vstoxxt, CDSt, omo2, l1)
reg1 <- lm(Euribor3t~OIS3t+CDSt+x+Vstoxxt+omo2+l1, data=axx)
summary(reg1)

dynlm

zooX = zoo(test[, -1])
lmx <- dynlm(d(Euribor3)~d(Ois3)+d(CDS)+d(Eurepo3-Ois3)+d(Vstoxx)+d(log(Open.Market.Operations))+d(L(Euribor3, 1)), data=zooX)
summary(lmx)

这两种方法给出了完全相同的输出。但是,如果我将一个子集添加到1到24的所有回归中(其他条件相同):

Euribor3t <- ts(diff(Euribor3))
OIS3t <- ts(diff(Ois3))
x <- ts(diff(Eurepo3-Ois3))
Vstoxxt <- ts(diff(Vstoxx))
CDSt <- ts(diff(CDS))
omo2 <- ts(diff(log(Open.Market.Operations)))
l1 <- (lag(Euribor3t, k=-1))
axx <- ts.intersect(Euribor3t, OIS3t, x, Vstoxxt, CDSt, omo2, l1)
reg1 <- lm(Euribor3t~OIS3t+CDSt+x+Vstoxxt+omo2+l1, data=axx, subset=1:24)
summary(reg1)

zooX = zoo(test[, -1])
lmx <- dynlm(d(Euribor3)~d(Ois3)+d(CDS)+d(Eurepo3-Ois3)+d(Vstoxx)+d(log(Open.Market.Operations))+d(L(Euribor3, 1)), data=zooX[1:24])
summary(lmx)

两个输出彼此不同。导致回归输出偏差的问题可能是什么?

以下是我试验过的数据样本:

    Date    Euribor3    Ois3    Eurepo3 Vstoxx  CDS Open.Market.Operations
1   03.01.2005  2.154   2.089   2.09    14.47   17.938  344999
2   04.01.2005  2.151   2.084   2.09    14.51   17.886  344999
3   05.01.2005  2.151   2.087   2.08    14.42   17.950  333998
4   06.01.2005  2.150   2.085   2.08    13.80   17.950  333998
5   07.01.2005  2.146   2.086   2.08    13.57   17.913  333998
6   10.01.2005  2.146   2.087   2.08    12.92   17.958  333998
7   11.01.2005  2.146   2.089   2.08    13.68   17.962  333998
8   12.01.2005  2.145   2.085   2.08    14.05   17.886  339999
9   13.01.2005  2.144   2.084   2.08    13.64   17.568  339999
10  14.01.2005  2.144   2.085   2.08    13.57   17.471  339999
11  17.01.2005  2.143   2.085   2.08    13.20   17.365  339999
12  18.01.2005  2.144   2.085   2.08    13.17   17.214  347999
13  19.01.2005  2.143   2.086   2.08    13.63   17.143  354499
14  20.01.2005  2.144   2.087   2.08    14.17   17.125  354499
15  21.01.2005  2.143   2.087   2.08    13.96   17.193  354499
16  24.01.2005  2.143   2.086   2.08    14.11   17.283  354499
17  25.01.2005  2.144   2.086   2.08    13.63   17.083  354499
18  26.01.2005  2.143   2.086   2.08    13.32   17.348  347999
19  27.01.2005  2.144   2.085   2.08    12.46   17.295  352998
20  28.01.2005  2.144   2.084   2.08    12.81   17.219  352998
21  31.01.2005  2.142   2.084   2.08    12.72   17.143  352998
22  01.02.2005  2.142   2.083   2.08    12.36   17.125  352998
23  02.02.2005  2.141   2.083   2.08    12.25   17.000  357499
24  03.02.2005  2.144   2.088   2.08    12.38   16.808  357499
25  04.02.2005  2.142   2.084   2.08    11.60   16.817  357499
26  07.02.2005  2.142   2.084   2.08    11.99   16.798  359999
27  08.02.2005  2.141   2.083   2.08    11.92   16.804  355500
28  09.02.2005  2.142   2.080   2.08    12.19   16.589  355500
29  10.02.2005  2.140   2.080   2.08    12.04   16.500  355500
30  11.02.2005  2.140   2.078   2.08    11.99   16.429  355500
31  14.02.2005  2.139   2.078   2.08    12.52   16.042  355500

1 个答案:

答案 0 :(得分:2)

您不允许dynlm使用与lm中相同数量的数据。后一种模型包含两个较少的观察结果。

dim(model.frame(reg1))
# [1] 24  7
dim(model.frame(lmx))
# [1] 22  7

原因是lm使用整个数据集(31个观察值)转换变量(差异),而dynlm只传递24个观察值,因此dynlm 1}}将用24个观察值进行差分。由于差分后丢失的观察结果,在两种情况下得到的行数都不相同。

dylm中,您应该使用data=zooX[1:26]。以这种方式使用相同的子集并获得相同的结果:

reg1 <- lm(Euribor3t~OIS3t+CDSt+x+Vstoxxt+omo2+l1, data=axx, subset=1:24)
lmx <- dynlm(d(Euribor3)~d(Ois3)+d(CDS)+d(Eurepo3-Ois3)+d(Vstoxx)+
  d(log(Open.Market.Operations))+d(L(Euribor3, 1)), data=zooX[1:26])
all.equal(as.vector(fitted(reg1)), as.vector(fitted(lmx)))
# [1] TRUE
all.equal(coef(reg1), coef(lmx), check.attributes=FALSE)
# [1] TRUE