lmer 失败 na.pass
lmer failing with na.pass
当我 运行 一个带有 lme4
的 lmer
模型使用 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)
表示没有 Inf
或 NaN
值,虽然有,但有很多 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 值,直到出现问题为止。通常此时会发生以下两种情况之一:
- 如果整个估计过程是使用可以处理和传播缺失值的 R 函数编写的,那么您通常会得到一个拟合模型对象,其中所有系数、可能性为
NA
/NaN
等等等等(因为缺失值会污染整个拟合过程);
- 如果估计过程的某些步骤无法处理
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 试图找出是否有任何固定效应列共线。可能应该检查那里的缺失值...
当我 运行 一个带有 lme4
的 lmer
模型使用 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)
表示没有 Inf
或 NaN
值,虽然有,但有很多 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 值,直到出现问题为止。通常此时会发生以下两种情况之一:
- 如果整个估计过程是使用可以处理和传播缺失值的 R 函数编写的,那么您通常会得到一个拟合模型对象,其中所有系数、可能性为
NA
/NaN
等等等等(因为缺失值会污染整个拟合过程); - 如果估计过程的某些步骤无法处理
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 试图找出是否有任何固定效应列共线。可能应该检查那里的缺失值...