R 使用Data.table进行滚动回归-更新?
我正在尝试在data.table中运行滚动回归。我想问的问题有很多,但这些问题通常都是3岁以上的孩子提出的,而且回答不雅观。(例如,见:) 我想知道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
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
``