线性回归的R date.table中的日期对齐

线性回归的R date.table中的日期对齐,r,data.table,linear-regression,R,Data.table,Linear Regression,我有一个data.table,其中有m种证券在n个日期的回报。我想做一个lm形式的多元线性回归(ReturnSec1~ReturnSec2+ReturnSec3+…+ReturnSecM)。我遇到的问题是,一些证券可能缺少日期,回归应该在对齐的日期。以下是我到目前为止的想法: #The data set set.seed(1) dtData <- data.table(SecId = rep(c(1,2,3), each= 4), Date = as.Date(c(1,2,3,5,1,2,

我有一个data.table,其中有m种证券在n个日期的回报。我想做一个lm形式的多元线性回归(ReturnSec1~ReturnSec2+ReturnSec3+…+ReturnSecM)。我遇到的问题是,一些证券可能缺少日期,回归应该在对齐的日期。以下是我到目前为止的想法:

#The data set
set.seed(1)
dtData <- data.table(SecId = rep(c(1,2,3), each= 4), Date = as.Date(c(1,2,3,5,1,2,4,5,1,2,4,5)), Return = round(rnorm(12),2))

#My solution so far
dtDataAligned <- merge(dtData[SecId == 1,list(Date, Return)], dtData[SecId == 2, list(Date, Return)], by='Date', all=TRUE)
dtDataAligned <- merge(dtDataAligned, dtData[SecId == 3,list(Date, Return)], by='Date',  all=TRUE)
setnames(dtDataAligned, c('Date', 'Sec1', 'Sec2', 'Sec3'))
dtDataAligned[is.na(dtDataAligned)] <- 0

#This is what i want to do
fit <- lm(dtDataAligned[, Sec1] ~ dtDataAligned[, Sec2] + dtDataAligned[, Sec3])
#数据集
种子(1)

dtData如果问题是如何以更紧凑的方式再现问题中所示代码的输出,请尝试以下方法:

library(zoo)

z <- read.zoo(dtData, split = 1, index = 2)
z0 <- na.fill(z, fill = 0)
lm(`1` ~., z0)

下面是一个使用
dcast.data.table
data.table
解决方案,它以长格式(您的输入)获取数据,并将其转换为
lm
调用所需的宽格式

lm(`1` ~ ., dcast.data.table(dtData, Date ~ SecId, fill=0))
以下是
dcast
调用的输出:

         Date     1     2     3
1: 2014-01-02 -0.63  0.33  0.58
2: 2014-01-03  0.18 -0.82 -0.31
3: 2014-01-04 -0.84  0.00  0.00
4: 2014-01-05  0.00  0.49  1.51
5: 2014-01-06  1.60  0.74  0.39

我从@G.Grothendieck偷了
lm
那块。请注意,如果实际数据中有三列以上的数据,则需要为
dcast.data.table

+1指定
value.var
参数,请不要忘记这是一个选项。感谢您的回答。这正是我打算做的。对不起,我不清楚这个循环。在我的示例中,只有3种证券,但是在我的问题中,我有更多证券,因此需要一个循环将它们合并在一起!好东西!我不知道dcast函数。我刚刚更新了我的data.table库,这很好用。
         Date     1     2     3
1: 2014-01-02 -0.63  0.33  0.58
2: 2014-01-03  0.18 -0.82 -0.31
3: 2014-01-04 -0.84  0.00  0.00
4: 2014-01-05  0.00  0.49  1.51
5: 2014-01-06  1.60  0.74  0.39