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

时间:2013-12-02 22:41:46

标签: r data.table

我试图使用data.table:

按组获取回归的残差
DT[, res := lm(y ~ x)$resid, by = groups]

分散在数据集中的xy中可能存在缺失值。问题是,如果某个特定组仅在NAx中包含ylm可以理解会抛出此错误:

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

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

2 个答案:

答案 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]