data.table分组lm回归后无法生成残差列的原因排查
问题原因与解决方案
原因分析
你遇到的问题核心在于mod的结构与赋值逻辑不匹配:
mod是按g分组后的汇总表,每个分组仅对应1行数据,model列是存储单个lm模型的list类型。residuals(model)会返回对应分组的所有残差(这里每组10个,是长度为10的向量),直接赋值给resi列时,data.table无法将长度大于1的向量存入单个单元格,导致赋值操作未按预期创建列(部分版本会触发循环回收警告,但不会生成你想要的残差列)。
解决方案
根据你的需求,分两种场景处理:
场景1:在汇总表mod中存储每组的残差向量
需要将残差向量封装为list,才能存入单个单元格:
mod[, resi := .(residuals(model)), by = g]
此时resi列是list类型,每个元素对应该分组的10个残差。
场景2:将残差直接添加到原数据集dt中
更高效的方式是直接在原数据分组计算,无需先生成模型表:
dt[, resi := residuals(lm(x~y, .SD)), by = g]
如果一定要基于已有的mod表合并,可按以下步骤:
# 先在mod中生成list类型的残差列 mod[, resi := .(residuals(model)), by = g] # 合并到原dt并展开残差 dt <- dt[mod, on = "g", allow.cartesian = TRUE] # 展开list列(需tidyr包) library(tidyr) dt <- unnest(dt, resi)
内容的提问来源于stack exchange,提问作者Fabio Correa
相关产品推荐
相关产品推荐

