r语言 - lmer failing with na.pass



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

R:NA/NaN/Inf在外部函数调用(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值。

在同一数据集的lmer之外运行na.pass不会产生错误:

na.pass(dat)

那么lmer内部可能出了什么问题呢?

对您之前的一个问题的评论试图解释,通常,混合模型机器无法处理预测因子中缺少值的情况下的估计;它就是不起作用。如果你想拟合具有缺失数据的混合模型,你需要进行某种形式的插补,即填写缺失预测因子的值(例如,参见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(,您会发现实际上它所做的只是返回相同的对象,保持不变。老实说,我真的不确定na.pass为什么存在,除了完整性。。。(或与S兼容(


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

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

lme4中的错误::lFormula(formula=反应~天数+(天数|受试者(,:Z中的NA(随机效应模型矩阵(:请使用";na.action=‘na.egnore’"或";na.action=‘na.exclude’">

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

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

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

qr.default中的错误(X,tol=tol,LAPACK=FALSE(:外部函数调用(arg 1(中的NA/NaN/Inf

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

最新更新