我试图使用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
而不是失败此错误?
将您的调用包含lm
在tryCatch
表达式中,如下所示:
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)