首先,如果已经回答了这个问题,我很抱歉。这是我在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
或xts
格式(我选择{{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))
我在这里做错了什么?
答案 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]