R 使用Data.table进行滚动回归-更新?

R 使用Data.table进行滚动回归-更新?,r,data.table,regression,R,Data.table,Regression,我正在尝试在data.table中运行滚动回归。我想问的问题有很多,但这些问题通常都是3岁以上的孩子提出的,而且回答不雅观。(例如,见:) 我想知道data.table包是否有任何更新,使其更直观/更快 这就是我要做的。我的代码如下所示: DT<-data.table( Date = seq(as.Date("2000/1/1"), by = "day", length.out = 1000), x1=rnorm(1000), x2=rnorm(1000), x3=rnor

我正在尝试在data.table中运行滚动回归。我想问的问题有很多,但这些问题通常都是3岁以上的孩子提出的,而且回答不雅观。(例如,见:)

我想知道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))
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)])))
 }
DT现在还不清楚你到底在追求什么,但是这里有一个应该很接近的镜头(只需要根据细节做一些小的调整):

我真的不能和speed说话

TT <- DT[ , uniqueN(Date), by = country][ , max(V1)]
window <- 5
#pre-declare a matrix of windows; each column represents
#one of the possible windows of days
windows <- matrix(1:TT, nrow = TT + 1, ncol = max(TT - window + 1, 1))[1:window, ]

DT[ , {
  #not all possible windows necessarily apply to each
  #  country; subset to find only the relevant windows
  windowsj <- windows[ , 1:(uniqueN(Date) - window + 1)]
  #lapply returns a list (which can be readily assigned with :=)
  lapply(1:ncol(windowsj),
         function(ii){
           #subset to relevant rows
           .SD[windowsj[ , ii],
               #regress, extract
               lm(y ~ x1 + x2 + x3)$coefficients]})},
  by = country]

(也就是说,它是相同的,只是换位)

frollapply
只接受数字向量输入和输出,因此我们必须使用
sapply()
沿行索引编写我们自己的

window <- 180
DT[, 
   {
     data.table(t(sapply(seq_len(.N - window + 1),
                         function(k) lm(y ~ x1 + x2 + x3, 
                                        data = .SD[k:(k + window)])$coefficients)))
   }, 
   by = country] 
##      country (Intercept)         x1          x2          x3
##   1:       a  0.10163170 0.09561343 -0.11123725 -0.06489867
##   2:       a  0.11029460 0.08927926 -0.10657563 -0.06035072
##   3:       a  0.11328084 0.08856627 -0.10521865 -0.06278259
##   4:       a  0.12348242 0.07503412 -0.10483616 -0.06638923
##   5:       a  0.13285512 0.09268086 -0.11239769 -0.04068656
##  ---                                                       
## 280:       d  0.08249204 0.06252626 -0.06965884 -0.09680134
## 281:       d  0.07864977 0.05395658 -0.06137728 -0.10774067
## 282:       d  0.07937867 0.06996970 -0.07991358 -0.11377039
## 283:       d  0.07654691 0.06546692 -0.06824516 -0.10902969
## 284:       d  0.06123857 0.08590249 -0.05117317 -0.11728684
``

窗口和什么是
coef(y~x1+x2+x3)[1]
,确切地说?你想要第1天,…,180天,然后第2天,…,181天,然后第3天,…,182天,等等的y~X吗?这正是我想要的。我希望第一个观察值是第1-180天的系数,第二个观察值是第2-181天的系数,等等,然后向前滚动。感谢你的帮助你是指绝对的几天还是相对的几天?所以第1天,。。。每个国家180天,或整个数据集中180天?每个国家。在我的实际数据中,每个国家的y值不同,但日期和X值重复。(即,时间仅在单个时间段内,对每个国家重复)。我应该重做模拟数据以正确设置。我注意到每个国家不一定每天都有观测数据。。。窗口应该是180天的实际观察还是180天的连续观察(不管是否有观察)?这几乎是但不完全是我想要的-也许有一种简单的方法可以将其转化为我所需要的?我刚刚在上面重新编辑了这个问题。谢谢你的帮助。
window <- 180
DT[, 
   {
     data.table(t(sapply(seq_len(.N - window + 1),
                         function(k) lm(y ~ x1 + x2 + x3, 
                                        data = .SD[k:(k + window)])$coefficients)))
   }, 
   by = country] 
##      country (Intercept)         x1          x2          x3
##   1:       a  0.10163170 0.09561343 -0.11123725 -0.06489867
##   2:       a  0.11029460 0.08927926 -0.10657563 -0.06035072
##   3:       a  0.11328084 0.08856627 -0.10521865 -0.06278259
##   4:       a  0.12348242 0.07503412 -0.10483616 -0.06638923
##   5:       a  0.13285512 0.09268086 -0.11239769 -0.04068656
##  ---                                                       
## 280:       d  0.08249204 0.06252626 -0.06965884 -0.09680134
## 281:       d  0.07864977 0.05395658 -0.06137728 -0.10774067
## 282:       d  0.07937867 0.06996970 -0.07991358 -0.11377039
## 283:       d  0.07654691 0.06546692 -0.06824516 -0.10902969
## 284:       d  0.06123857 0.08590249 -0.05117317 -0.11728684
``