首先,对于这个问题是否已经回答,我深表歉意。这是我关于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标准错误对样本中的每种股票执行此操作。
在转到这里的几篇文章之后,我设法提出了以下几点:
因为我正在使用时间序列,并且想使用滞后和前导运算符,所以我读到我应该使用zoo
orxts
格式(我选择了zoo
格式,因为它与dyn$lm
我要使用的函数兼容):
d.z <- zoo(data.matrix(d[-1]), d$Time)
请注意,我将“库存”列转换为数字,因为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.
我在这里做错了什么?
如果不使用基本功能,请在问题中加入您的图书馆电话。
在问题中myLm
计算a 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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句