【问题标题】:Time series regression by group with Newey-West standard errors in RR 中具有 Newey-West 标准误差的组时间序列回归
【发布时间】:2014-10-13 16:21:41
【问题描述】:

首先,如果这个问题已经得到解答,我深表歉意。这是我在 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 格式(我选择了 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.

我在这里做错了什么?

【问题讨论】:

    标签: r plyr zoo standard-error


    【解决方案1】:

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

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

    为了执行计算,拆分数据帧,然后将拆分的每个组件分别转换为动物园。我们在这里使用了 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]
    

    【讨论】:

    • 非常感谢,这很好用!您能否详细说明为什么unlistas.list 是必要的?我对 R 很陌生。顺便说一句:我会赞成你的回应,但我现在没有足够的声望点。
    • unlist 将其参数扁平化为向量,但 data.table 会将向量视为单个列,因此我们应用 as.list 以便 data.table 将向量的每个组件视为单独的列.
    猜你喜欢
    • 2018-11-15
    • 2018-11-17
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2016-01-24
    • 2013-05-06
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多