使用 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
我 运行 首先使用 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