我试图使用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
填充输出残差而不是失败?
答案 0 :(得分:5)
将来自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)
答案 1 :(得分:2)
您只需考虑完整案例即可。 NA
值将由[.data.table
创建。
当有一些缺失值时,这也将处理。
DT[complete.cases(DT[,list(x,y)],
res := residuals(lm(y ~ x, .SD)), by = groups]