我试图在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进行回归,并按日期存储系数 .
理想情况下,语法看起来像这样:
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都重复 . 我的每个国家都是独一无二的 .
在我的实际数据集中,我有120个国家 . 我可以为每个国家计算这个,但它非常慢,然后我必须将所有系数重新加入到单个数据集中以分析结果 .
是否有类似于您提议的最终单个data.table,所有观察结果?
再次感谢!!
1 回答
目前还不清楚你究竟应该接近什么样的镜头(根据具体细节需要进行微调):
我真的不能说速度 .
将结果与
coefs.a
和coefs.b
进行比较:(即它是相同的,只是换位)