【问题标题】:Different regression output using dynlm and lm使用 dynlm 和 lm 的不同回归输出
【发布时间】:2015-04-29 15:35:37
【问题描述】:

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

【问题讨论】:

    标签: r time-series lm


    【解决方案1】:

    您不允许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
    

    【讨论】:

    • 我还有一个关于子集使用的问题。假设我想将我的数据框分成几个子集(例如:1:10、11:20 和 21:31),然后为每个子集运行回归。在这种情况下,lm 方法更合适,因为与dynlm 方法相比,我失去的观察更少,这是否正确?在 1:10 和 11:20 的情况下使用 dynlm 我可以更正您在答案中提到的子集,但是对于最后一个子集 (21:31),这不起作用(因为我只有 31 个观察值。所以我认为lm 方法更合适。这是正确的吗?谢谢
    • 我没有检查它,但如果我是正确的,在lm 1:10、11:20、21:31 和 1:12、11:22、21 中使用以下索引: dynlm 中的 31 将产生相同的结果。无需在 21:31 调整最后一个子样本,因为在任何一种情况下,右侧都没有更多的观察值(与在系列中间取一个子样本时发生的情况相反)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2017-07-25
    相关资源
    最近更新 更多