R:使用 dynlm 处理子集

R: Handling subsets using dynlm

我想使用 R 计算以下两个回归:

library("dynlm")

zooX = zoo(test[, -1])
lmx <- dynlm(d(Euribor3)~d(Ois3)+d(CDS)+d(Vstoxx)+d(log(omo))+d(L(Euribor3, 1)), data=zooX[1:16])
summary(lmx)

zooX = zoo(test[, -1])
lmx <- dynlm(d(Euribor3)~d(Ois3)+d(CDS)+d(Vstoxx)+d(log(omo))+d(L(Euribor3, 1)), data=zooX[17:31])
summary(lmx)

这两个模型之间的唯一区别是子集(第一个 [1:16] 和第二个 [17:31])。现在这两个模型给我以下输出:

Time series regression with "zoo" data:
Start = 3, End = 16

Call:
dynlm(formula = d(Euribor3) ~ d(Ois3) + d(CDS) + d(Vstoxx) + 
    d(log(omo)) + d(L(Euribor3, 1)), data = zooX[1:16])

Time series regression with "zoo" data:
Start = 19, End = 31

Call:
dynlm(formula = d(Euribor3) ~ d(Ois3) + d(CDS) + d(Vstoxx) + 
    d(log(omo)) + d(L(Euribor3, 1)), data = zooX[17:31])

正如您从输出中看到的(未报告系数、t 值等),第一个模型使用观测值 [3:16](因为变量差分和第一个滞后导致两个丢失因变量)。第二个模型使用 [19:31] 的观察结果(同样丢失了两个观察结果)。由于变量的转换,两个子集之间出现了差距,即第一个模型的 End=16 而第二个模型的 Start=19,这意味着在回归中观察值 17 和 18 不是 "included".现在我的问题是什么更有意义?要么让模型中的子集保持原样,要么将第二个模型的子集移回两个观察值(即 [15:31]),以缩小差距?然后输出将变为:

Time series regression with "zoo" data:
Start = 17, End = 31

Call:
dynlm(formula = d(Euribor3) ~ d(Ois3) + d(CDS) + d(Vstoxx) + 
    d(log(omo)) + d(L(Euribor3, 1)), data = zooX[15:31])

如您所见,第一个模型的 End=16,第二个模型现在的 Start=17。 非常感谢!

这是我的数据集:

Date    Euribor3    Ois3    Vstoxx  CDS omo
03.01.2005  2.154   2.089   14.47   17.938  344999
04.01.2005  2.151   2.084   14.51   17.886  344999
05.01.2005  2.151   2.087   14.42   17.95   333998
06.01.2005  2.15    2.085   13.8    17.95   333998
07.01.2005  2.146   2.086   13.57   17.913  333998
10.01.2005  2.146   2.087   12.92   17.958  333998
11.01.2005  2.146   2.089   13.68   17.962  333998
12.01.2005  2.145   2.085   14.05   17.886  339999
13.01.2005  2.144   2.084   13.64   17.568  339999
14.01.2005  2.144   2.085   13.57   17.471  339999
17.01.2005  2.143   2.085   13.2    17.365  339999
18.01.2005  2.144   2.085   13.17   17.214  347999
19.01.2005  2.143   2.086   13.63   17.143  354499
20.01.2005  2.144   2.087   14.17   17.125  354499
21.01.2005  2.143   2.087   13.96   17.193  354499
24.01.2005  2.143   2.086   14.11   17.283  354499
25.01.2005  2.144   2.086   13.63   17.083  354499
26.01.2005  2.143   2.086   13.32   17.348  347999
27.01.2005  2.144   2.085   12.46   17.295  352998
28.01.2005  2.144   2.084   12.81   17.219  352998
31.01.2005  2.142   2.084   12.72   17.143  352998
01.02.2005  2.142   2.083   12.36   17.125  352998
02.02.2005  2.141   2.083   12.25   17  357499
03.02.2005  2.144   2.088   12.38   16.808  357499
04.02.2005  2.142   2.084   11.6    16.817  357499
07.02.2005  2.142   2.084   11.99   16.798  359999
08.02.2005  2.141   2.083   11.92   16.804  355500
09.02.2005  2.142   2.08    12.19   16.589  355500
10.02.2005  2.14    2.08    12.04   16.5    355500
11.02.2005  2.14    2.078   11.99   16.429  355500
14.02.2005  2.139   2.078   12.52   16.042  355500

如果您通过 data = zooX[...,] 自己进行子集化,则 dynlm() 看不到完整样本,因此必须丢失两个观察值。如果你提供完整的data = zooX,然后分别设置end = 14start = 15,那么dynlm()可以先将完整的模型框架与所有lags/differences等放在一起,并且随后选择所需的子集。在下面的示例中,我这样做了,但使用了您的数据中可用的正确日期索引。

首先,我们将数据读入具有适当 Date 索引的 zoo 系列:

library("dynlm")
zooX <- read.zoo(textConnection("Date    Euribor3    Ois3    Vstoxx  CDS omo
03.01.2005  2.154   2.089   14.47   17.938  344999
04.01.2005  2.151   2.084   14.51   17.886  344999
05.01.2005  2.151   2.087   14.42   17.95   333998
06.01.2005  2.15    2.085   13.8    17.95   333998
07.01.2005  2.146   2.086   13.57   17.913  333998
10.01.2005  2.146   2.087   12.92   17.958  333998
11.01.2005  2.146   2.089   13.68   17.962  333998
12.01.2005  2.145   2.085   14.05   17.886  339999
13.01.2005  2.144   2.084   13.64   17.568  339999
14.01.2005  2.144   2.085   13.57   17.471  339999
17.01.2005  2.143   2.085   13.2    17.365  339999
18.01.2005  2.144   2.085   13.17   17.214  347999
19.01.2005  2.143   2.086   13.63   17.143  354499
20.01.2005  2.144   2.087   14.17   17.125  354499
21.01.2005  2.143   2.087   13.96   17.193  354499
24.01.2005  2.143   2.086   14.11   17.283  354499
25.01.2005  2.144   2.086   13.63   17.083  354499
26.01.2005  2.143   2.086   13.32   17.348  347999
27.01.2005  2.144   2.085   12.46   17.295  352998
28.01.2005  2.144   2.084   12.81   17.219  352998
31.01.2005  2.142   2.084   12.72   17.143  352998
01.02.2005  2.142   2.083   12.36   17.125  352998
02.02.2005  2.141   2.083   12.25   17  357499
03.02.2005  2.144   2.088   12.38   16.808  357499
04.02.2005  2.142   2.084   11.6    16.817  357499
07.02.2005  2.142   2.084   11.99   16.798  359999
08.02.2005  2.141   2.083   11.92   16.804  355500
09.02.2005  2.142   2.08    12.19   16.589  355500
10.02.2005  2.14    2.08    12.04   16.5    355500
11.02.2005  2.14    2.078   11.99   16.429  355500
14.02.2005  2.139   2.078   12.52   16.042  355500
"), header = TRUE, format = "%d.%m.%Y")

然后,我们select中间观察的时间索引。您可以手动执行此操作,也可以根据 zooX 系列执行此操作:

mid <- as.Date("2005-01-24")
mid <- time(zooX)[ceiling(nrow(zooX)/2)]

无论哪种情况,mid 现在都表示中间时间索引 2005-01-24。然后我们可以设置我们的模型:

f <- d(Euribor3) ~ d(Ois3) + d(CDS) + d(Vstoxx) + d(log(omo)) + d(L(Euribor3))
m1 <- dynlm(f, data = zooX, end = mid)
m2 <- dynlm(f, data = zooX, start = mid + 1)

第一个现在运行到 2005-01-24:

Time series regression with "zoo" data:
Start = 2005-01-05, End = 2005-01-24

Call:
dynlm(formula = f, data = zooX, end = mid)

Coefficients:
   (Intercept)         d(Ois3)          d(CDS)       d(Vstoxx)     d(log(omo))  
    -0.0008859      -0.0125676       0.0001073       0.0012116       0.0124502  
d(L(Euribor3))  
    -0.4217354  

第二个开始于 2005-01-25:

Time series regression with "zoo" data:
Start = 2005-01-25, End = 2005-02-14

Call:
dynlm(formula = f, data = zooX, start = mid + 1)

Coefficients:
   (Intercept)         d(Ois3)          d(CDS)       d(Vstoxx)     d(log(omo))  
    -0.0005556       0.2565964      -0.0027670      -0.0009140      -0.0152427  
d(L(Euribor3))  
    -0.5143080  

但是,我不确定我是否会建议将具有 6 个回归系数的模型拟合到仅 14 或 15 个观测值...