当某些组仅包含缺失值时,按组进行R data.table回归

 妖童J 发布于 2023-02-13 12:44

我试图使用data.table来获取组的回归残差:

DT[, res := lm(y ~ x)$resid, by = groups]

两者中都可能存在缺失值x并且y分散在数据集中.问题是,如果一个特定的组只包含NA在任一x或者y,lm理解引发此错误:

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases

是否有一种聪明的方法以某种方式捕获此错误并填充输出残差NA而不是失败此错误?

1 个回答
  • 将您的调用包含lmtryCatch表达式中,如下所示:

    tryCatch(lm(y ~ x)$resid, error=function(e) NA_real_)
    

    例如:

    DT <- data.table(data.frame(groups=rep(c('a', 'b'), each=3), x=rnorm(6), y=rnorm(6)))
    setkey(DT, groups)
    DT['b', y := NA_real_]
    DT[, res := tryCatch(lm(y ~ x)$resid, error=function(e) NA_real_), by = groups]
    #    groups       x       y      res
    # 1:      a -0.9224  1.1080  0.07531
    # 2:      a  0.5573 -0.6185 -0.94221
    # 3:      a  0.6858  1.1290  0.86690
    # 4:      b  1.3894      NA       NA
    # 5:      b -1.0110      NA       NA
    # 6:      b -0.4996      NA       NA
    

    您可能希望创建一个错误捕获函数,该函数也会打印错误,以便您可以验证它们是缺少数据的所有实例:

    e.catch <- function(e) {message('lm error msg: ', e);NA_real_}
    DT[, res := tryCatch(lm(y ~ x)$resid, error=e.catch), by = groups]
    

    如果由缺少数据以外的其他原因引起,则引发其他错误:

    e.catch <- function(e) if (grepl('non-NA', e)) NA_real_ else stop(e)
    

    2023-02-13 12:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有