lmer 失败 na.pass

lmer failing with na.pass

当我 运行 一个带有 lme4lmer 模型使用 na.pass 作为 na.action 时,我得到以下错误:

R: NA/NaN/Inf in foreign function call (arg 1)

我运行模型是这样的:

model1 <- lme4::lmer(agg_dv_singing ~ GMS.Musical.Training + 
   JAJ.ability + MDT.ability + MPT.ability + PDCT.ability + 
   PIAT.ability + agg_dv_long_note + demographics.age + 
   aggiv_entropy + aggiv_interval_complexity + 
   aggiv_rhythmic_complexity + aggiv_tonal_complexity + 
   log.freq + length + (1|p_id), 
    data = dat, na.action = na.pass)

summary(dat) 表示没有 InfNaN 值,虽然有,但有很多 NA 值。

运行 na.pass outside lmer on the same data set 不报错:

na.pass(dat)

那么 lmer 中可能出了什么问题?

previous question of yours 的评论试图解释,一般来说,混合模型机制无法处理预测变量中存在缺失值的情况下的估计;它只是行不通。如果你想用缺失数据拟合混合模型,你需要做某种形式的 imputation,即填充缺失预测变量的值(例如,参见 mice 包,它更或至少就 R 生态系统而言是最先进的)。以下是四种不同的标准 na.* 操作在混合模型的上下文中执行的操作:

  • na.fail():如果数据(预测变量或响应)中存在缺失值,则立即失败。这令人沮丧,但会立即提醒您缺少数据,并让您决定如何处理。
  • na.omit(): 在拟合之前从数据中删除不完整的案例。
  • na.exclude():类似于na.omit(),但要跟踪排除案例的位置。当使用 predict()residuals()(或每次观察产生结果的任何函数)时,用 NA 值为原始数据集中的非完整案例重建一个完整的数据集。 (我通常发现此设置是最有用的默认设置。)
  • na.pass:不删除 NA 值,但尝试继续拟合过程。正如您所发现的,这通常根本不起作用!它只会通过代码向下传递 NA 值,直到出现问题为止。通常此时会发生以下两种情况之一:
  1. 如果整个估计过程是使用可以处理和传播缺失值的 R 函数编写的,那么您通常会得到一个拟合模型对象,其中所有系数、可能性为 NA/NaN等等等等(因为缺失值会污染整个拟合过程);
  2. 如果估计过程的某些步骤无法处理 NA/NaN 值(如本例),您会从失败的过程的第一点得到难以理解的错误。

如果您查看 na.pass() 的源代码(通过在 R 提示符下键入 na.pass),您会发现实际上它所做的只是 return同一个对象,没有变化。老实说,我不太确定为什么 na.pass 甚至存在,除了完整性......(或 compatibility with S


您的 NA 值不在随机效应项中使用的参数中:如果有,您会收到更易于解释的错误消息:

library(lme4)
ss <- sleepstudy
ss[1,"Days"] <- NA
lmer(Reaction ~ Days + (Days|Subject), ss, na.action=na.pass)

Error in lme4::lFormula(formula = Reaction ~ Days + (Days | Subject), : NA in Z (random-effects model matrix): please use "na.action='na.omit'" or "na.action='na.exclude'"

如果我用 (1|Subject) 拟合模型,那么 NA 值只会影响固定效应

lmer(Reaction ~ Days + (1|Subject), ss, na.action=na.pass)

然后我们收到您的错误消息。

Error in qr.default(X, tol = tol, LAPACK = FALSE) : NA/NaN/Inf in foreign function call (arg 1)

traceback() 告诉我,这发生在内部 chkRank.drop.cols() 函数中,其中 R 试图找出是否有任何固定效应列共线。可能应该检查那里的缺失值...