2

首先,如果这个问题已经得到回答,我深表歉意。这是我在 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 标准误差对样本中的每只股票执行此操作。

在这里看了几个帖子之后,我设法提出了以下几点:

因为我正在使用时间序列并且想要使用滞后和领先运算符,所以我读到我应该使用zooorxts格式(我选择了格式,因为这与我想要使用zoo的函数兼容):dyn$lm

d.z <- zoo(data.matrix(d[-1]), d$Time)

请注意,我将 Stock 列转换为数字,因为该zoo包需要所有数字变量。

但是,这会带来一条错误消息:

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 中的回归。

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))

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

Error in eval.quoted(.variables, data) : 
envir must be either NULL, a list, or an environment.

我在这里做错了什么?

4

1 回答 1

0

不使用基本功能时,请在问题中包含您的库调用。

在问题myLm中计算 asummary但随后将其丢弃,因此我们省略了该部分。

要执行计算,请拆分数据帧,然后将拆分的每个组件分别转换为 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]
于 2014-08-20T11:46:53.540 回答