按R的Newey-West标准误差分组的时间序列回归

时间:2014-08-20 10:34:44

标签: r plyr zoo standard-error

首先,如果已经回答了这个问题,我很抱歉。这是我在stackoverflow上的第一篇文章。

我有一组股票市场数据,其结构如下工作示例所示:

d <- data.frame(Time = rep(seq.Date( Sys.Date(), length=10, by="day" )),
    Stock = rep(LETTERS[1:3], each=10 ),
    x1 = rep(sample(10:30, 10), 3),
    x2 = rep(sample(10:30, 10), 3),
    x3 = rep(sample(10:30, 10), 3))

基本上我想估计一个时间序列回归,其中x1为因变量,回归量为x3,x2为滞后和超前。我想使用Newey West标准错误对样本中的每个库存执行此操作。

在这里发了几篇文章后,我设法得到了以下内容:

因为我正在处理时间序列并且想要使用滞后和主操作符,所以我读过我应该使用zooxts格式(我选择{{1}格式,因为这与我想要使用的zoo函数兼容):

dyn$lm

请注意,我将Stock列转换为数字,因为d.z <- zoo(data.matrix(d[-1]), d$Time) 包需要所有数字变量。

但是,这会显示错误消息:

zoo

我认为这没有问题,因为最终我想分别估算每个股票的回归,这将解决问题。

对于这个对象,我想估计myLm中每个股票的回归。

Warning message:
In zoo(data.matrix(d[-1]), d$Time):some methods for “zoo” objects do not work 
if the index entries in ‘order.by’ are not unique.

使用myLm <- function(formula,df) { temp.lm <- dyn$lm(formula,data=df) temp.summ <- summary(temp.lm) temp.summ$coefficients <- unclass(coeftest(temp.lm, vcov. = NeweyWest)) lmOut<-data.frame(t(temp.summ$coefficients)) return(lmOut)} 包我尝试按库存分割功能:

plyr

不幸的是,这会带来另一个错误:

outDf <- ddply(d.z, "Stock", function(df)  myLm(x1 ~ lag(x2, -1) + lag(x2, +1) + x3, df))

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

如果不使用基本功能,请在问题中包含您的图书馆电话。

问题myLm中的

计算summary,但随后将其丢弃,因此我们省略了该部分。

要执行计算,请拆分数据框,然后将拆分的每个组件分别转换为zoo。我们在这里使用了data.table包,但你可以选择使用plyr,dplyr或by

library(data.table)
library(dyn) # this pulls in zoo
library(lmtest)
library(sandwich)

# test data as in question but use set.seed for reproducibility
set.seed(123)
d <- data.frame(Time = rep(seq.Date( Sys.Date(), length=10, by="day" )),
    Stock = rep(LETTERS[1:3], each=10 ),
    x1 = rep(sample(10:30, 10), 3),
    x2 = rep(sample(10:30, 10), 3),
    x3 = rep(sample(10:30, 10), 3))

mycoeftest <- function(fo, data) {
   fm <- dyn$lm(fo, read.zoo(data))
   unlist(as.data.frame(unclass(coeftest(fm, vcov. = NeweyWest))))
}

fo <- x1 ~ lag(x2, c(-1, 1)) + x3
data.table(d)[, as.list(mycoeftest(fo, .SD)), by = d$Stock]