【问题标题】:data.table residual variance for multiple factors and keys多个因素和键的数据表残差
【发布时间】:2015-08-16 10:21:15
【问题描述】:

我有一个大型“data.table”,其中包含多只股票的每日收益。

rm(list = ls())
library(data.table)
set.seed(1080)
Firm1 <- rbind(data.table(Month = rep(200001, 3), Firm = rep(1, 3), Rt = rnorm(3)) ,data.table(Month = rep(200002, 4), Firm = rep(1, 4), Rt = rnorm(4)),
           data.table(Month = rep(200003, 5), Firm = rep(1, 5), Rt = rnorm(5)), data.table(Month = rep(200004, 2), Firm = rep(1, 2), Rt = rnorm(2)),
           data.table(Month = rep(200005, 3), Firm = rep(1, 3), Rt = rnorm(3)))
Firm2 <- rbind(data.table(Month = rep(200001, 1), Firm = rep(2, 1), Rt = rnorm(1)) , data.table(Month = rep(200002, 3), Firm = rep(2, 3), Rt = rnorm(3)),
           data.table(Month = rep(200003, 4), Firm = rep(2, 4), Rt = rnorm(4)), data.table(Month = rep(200004, 1), Firm = rep(2, 1), Rt = rnorm(1)),
           data.table(Month = rep(200005, 3), Firm = rep(2, 3), Rt = rnorm(3)))
Firm3 <- rbind(data.table(Month = rep(200001, 3), Firm = rep(3, 3), Rt = rnorm(3)) ,data.table(Month = rep(200002, 6), Firm = rep(3, 6), Rt = rnorm(6)),
           data.table(Month = rep(200003, 5), Firm = rep(3, 5), Rt = rnorm(5)), data.table(Month = rep(200004, 5), Firm = rep(3, 5), Rt = rnorm(5)),
           data.table(Month = rep(200005, 2), Firm = rep(3, 2), Rt = rnorm(2)))

DT <- rbind(Firm1, Firm2, Firm3)

DT[, Mar := rnorm(50)]

这给了

Month Firm          Rt          Mar
200001    1 -1.34767475  0.865598407
200001    1 -0.70741105 -0.782668556
200001    1  0.61342578  0.021440129
200002    1 -1.53156217  1.988291260
200002    1 -0.42512876 -0.384017585
...       

在此示例中,多个“月份”因素与每日观察有关。每个公司每个月都有不同数量的每日观察。

我想做的是从 Rt 与 Mar 的线性回归中估计残差的方差。要每月进行一次,我会使用

DT[, var(lm(Rt ~ Mar)$residuals), by = c("Firm", "Month")] 

与上述不同,我想每个月都做同样的事情,使用前 n 个月的观察结果。一个天真的尝试可能看起来像

DT[, var(lm(Rt ~ Mar)$residuals), by = c("Firm", Month[t : t-2])]

最终输出

Month Firm          Rt          Mar      resVariance
200001    1 -1.34767475  0.865598407  NA
200001    1 -0.70741105 -0.782668556  NA
200001    1  0.61342578  0.021440129  NA
200002    1 -1.53156217  1.988291260  NA
200002    1 -0.42512876 -0.384017585  NA
200002    1  1.06399050 -1.123293332  NA
200002    1 -1.59751358 -0.188190495  NA
200003    1  0.08854875  0.897471055  0.8745559
200003    1  0.37822085 -0.654418019  0.8745559
200003    1  1.07786336  1.665720591  0.8745559
200003    1  0.92820233 -1.983931767  0.8745559
200003    1 -0.43148095 -0.286302699  0.8745559
200004    1 -0.80384703 -0.927657523  0.841801
200004    1 -0.79383439  1.281582524  0.841801
...

对此的任何建议将不胜感激。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    目前没有简单的方法可以访问以前组中的任何/所有行同时在当前组上工作。我添加了一个新的FR #1278。不知道我们什么时候会来。

    但我将在此处提供一些关于如何处理它的指示(直到那时)。例如,如果我们要提取 all 之前的行,我们可以在 .BY 参数的帮助下做到这一点:

    # returns the unique values of each group
    DT[, print(.BY), by=.(Firm, Month)]
    

    使用它,我们可以只提取直到前一组的行

    cols = c("Firm", "Month")
    DT[, seq_len(DT[.BY, on=cols, which=TRUE, mult="first"]-1L), by=c(cols)]
    

    上面给出了直到前一组的所有行的行索引(对应于DT)。

    或者,我们可以提取直到当前组为:

    DT[, seq_len(DT[.BY, on=cols, which=TRUE, mult="last"]), by=c(cols)]
    

    当然,如果您必须提取前 'k' 组的行,它会变得有点棘手。但是,我仍然认为这个想法是相同的..您需要提取所有这些组的相应 Firm, Month 组合,并在分组时执行 join 以提取它们...

    【讨论】:

    • 谢谢@Arun。虽然解决方法需要更多思考,但我感谢您的反馈。 data.table 1.9.5 已安装,我很喜欢玩一些新功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2012-01-26
    相关资源
    最近更新 更多