【发布时间】:2015-12-12 20:30:07
【问题描述】:
我正在尝试在 data.table 中运行滚动回归。有许多问题可以解决我正在尝试做的事情,但它们通常是 3 岁以上,并且提供的答案不优雅。 (例如:here)
我想知道是否对 data.table 包进行了任何更新以使其更直观/更快?
这就是我想要做的。我的代码如下所示:
DT<-data.table(
Date = seq(as.Date("2000/1/1"), by = "day", length.out = 1000),
x1=rnorm(1000),
x2=rnorm(1000),
x3=rnorm(1000),
y=rnorm(1000),
country=rep(c("a","b","c","d"), each=25))
我想在 180 天滚动窗口中按国家/地区对 x1、x2 和 x3 上的 y 进行回归,并按日期存储系数。
理想情况下,语法应该是这样的:
DT[,.(coef.x1 := coef(y~x1+x2+x3)[2] ,
coef.x2 := coef(y~x1+x2+x3)[3],
coef(y~x1+x2+x3)[4],
by=c("country",ROLLING WINDOW)]
...但更优雅/尽可能避免重复! :)
由于某种原因,我还没有让 rollapply 语法对我很好地工作。
谢谢!
编辑:
谢谢@michaelchirico。
您的建议接近我的目标 - 也许可以修改代码以接收它,但我再次陷入困境。
这是我需要的更仔细的表述。部分代码:
DT<-data.table(
Date = rep(seq(as.Date("2000/1/1"), by = "day", length.out = 10),times=3), #same dates per country
x1=rep(rnorm(10),time=3), #x1's repeat - same per country
x2=rep(rnorm(10), times=3),#x2's repeat - same per country
x3=rep(rnorm(10), times=3), #x3's repeat - same per country
y=rnorm(30), #y's do not repeat and are unique per country per day
country=rep(c("a","b","c"), each=10))
#to calculate the coefficients by individual country:
a<-subset(DT,country=="a")
b<-subset(DT,country=="b")
window<-5 #declare window
coefs.a<-coef(lm(y~x1+x2+x3, data=a[1:window]))#initialize my coef variable
coefs.b<-coef(lm(y~x1+x2+x3, data=b[1:window]))#initialize my coef variable
##calculate coefficients per window
for(i in 1:(length(a$Date)-window)){
coefs.a<-rbind(coefs.a, coef(lm(y~x1+x2+x3, data=a[(i+1):(i+window-1)])))
coefs.b<-rbind(coefs.b, coef(lm(y~x1+x2+x3, data=b[(i+1):(i+window-1)])))
}
此数据集与前一个数据集的不同之处在于日期和 x1、x2、x3 都重复。我的 y 对每个国家都是独一无二的。
在我的实际数据集中,我有 120 个国家/地区。我可以为每个国家/地区计算这个,但它非常慢,然后我必须将所有系数重新加入一个数据集中以分析结果。
有没有一种类似于您提出的最终得到一个包含所有观察结果的 data.table 的方法?
再次感谢!!
【问题讨论】:
-
coef(y~x1+x2+x3)[1]到底是什么?你想要 y~X 表示第 1 天、...、180 天,然后是第 2 天、...、181 天,然后是第 3 天、...、182 天,等等? -
正是我想要的。我希望第一个观察结果是第 1-180 天的系数,第二个观察结果是第 2-181 天的系数等。然后向前滚动。感谢帮助
-
你是指绝对天数还是相对天数?那么第 1 天,... 180 在每个国家/地区,还是第 1 天,...180 在整个数据集中?
-
在每个国家/地区内。在我的实际数据中,每个国家/地区的 y 都不同,但日期和 X 重复。 (即时间只超过一个时间段,每个国家重复)。我应该重做模拟数据以正确设置。
-
我注意到每个国家/地区不一定每天都有观察...应该窗口是 180 天实际观察还是 180 连续天 i>(不管有没有观察)?
标签: r data.table regression