使用 dynlm 和 lm 的不同回归输出

Different regression output using dynlm and 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

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

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

原因是,lm 是用整个数据集(31 个观察值)转换变量(差分),而在 dynlm 中,您只传递 24 个观察值,因此, dynlm 将对 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