lme4 :: lmer报告"固定效应模型矩阵排名不足",我需要修复吗?如何?

Lis*_*isa 17 regression r linear-regression lme4 mixed-models

我正在尝试运行混合效果模型,F2_difference该模型预测其余列作为预测变量,但我收到一条错误消息

固定效应模型矩阵排名不足,因此下降7列/系数.

从这个链接,固定效果模型是排名不足,我想我应该findLinearCombos在R包中使用caret.但是,当我尝试时findLinearCombos(data.df),它给了我错误信息

qr.default(object)中的错误:外部函数调用中的NA/NaN/Inf(arg 1)另外:警告消息:在qr.default(object)中:强制引入的NAs

我的数据没有任何NA - 可能导致这种情况的原因是什么?(对不起,如果答案很明显 - 我是R的新手).

我的所有数据都是除了我试图预测的数值之外的因素.这是我的数据的一小部分样本.

sex <- c("f", "m", "f", "m")
nasal <- c("TRUE", "TRUE", "FALSE", "FALSE")
vowelLabel <- c("a", "e", "i", "o")
speaker <- c("Jim", "John", "Ben", "Sally")
word_1 <- c("going", "back", "bag", "back")
type <- c("coronal", "coronal", "labial", "velar")
F2_difference <- c(345.6, -765.8, 800, 900.5)
data.df <- data.frame(sex, nasal, vowelLabel, speaker,
                      word_1, type, F2_difference
                      stringsAsFactors = TRUE)
Run Code Online (Sandbox Code Playgroud)

编辑:这是一些更多的代码,如果它有帮助.

formula <- F2_difference ~ sex + nasal + type + vowelLabel + 
           type * vowelLabel + nasal * type +
           (1|speaker) + (1|word_1)

lmer(formula, REML = FALSE, data = data.df)
Run Code Online (Sandbox Code Playgroud)

编辑编辑:

OP没有提供足够数量的测试数据以允许模型实际运行lmer到阅读器中.但这不是一个大问题.这仍然是一个非常好的帖子!

李哲源*_*李哲源 28

您稍微过度关注警告消息:

固定效应模型矩阵排名不足,因此下降7列/系数.

这是一个警告而不是错误.既没有误用lmer也没有错误的模型公式,因此您将获得估计的模型.但要回答你的问题,我会努力解释.


在执行过程中lmer,您的模型公式被分解为固定效果公式随机效果公式,并为每个模型矩阵构建.固定的构造是通过标准模型矩阵构造器model.matrix; 随机构造很复杂,但与你的问题无关,所以我就跳过它.

对于您的模型,您可以通过以下方式检查固定效果模型矩阵的外观:

fix.formula <- F2_difference ~ sex + nasal + type + vowelLabel + 
               type * vowelLabel + nasal * type

X <- model.matrix (fix.formula, data.df)
Run Code Online (Sandbox Code Playgroud)

你的所有变量都是因子,因此X是二元的.虽然model.matrix适用contrasts于每个因素及其相互作用,但仍然可能X不会以完整列等级结束,因为列可能是其他一些列的线性组合(可以是精确的或数字上接近的).在您的情况下,一个因素的某些级别可能嵌套在另一个级别的某些级别中.

排名不足可以以许多不同的方式出现.另一个答案分享了CrossValidated答案,提供了实质性的讨论,我将在其上发表一些评论.

  • 对于案例1,人们实际上可以通过LASSO来做一个特征选择模型.
  • 案例2和案例3与数据收集过程有关.良好的实验设计是防止等级缺陷的最佳方法,但对于许多构建模型的人来说,数据已经存在,并且没有任何改进(如获取更多数据)是可能的.但是,我想强调的是,即使对于没有等级缺陷的数据集,如果我们不仔细使用它,我们仍然可以解决这个问题.例如,交叉验证是模型比较的好方法.要做到这一点,我们需要将完整的数据集拆分为训练数据集和测试数据集,但是我们可以毫不在意地从训练数据集中获得排名不足的模型.
  • 案例4是一个可能完全不受我们控制的大问题.也许一个自然的选择是降低模型的复杂性,但另一种选择是尝试惩罚回归.
  • 案例5是导致数值秩不足的数值问题,是一个很好的例子.
  • 案例6和7说明了数值计算以有限精度执行的事实.如果正确处理案例5,通常这些都不是问题.

因此,有时我们可以解决这个问题,但并不总能实现这一目标.因此,任何写得很好的模型拟合程序,比如lm,glm,mgcv::gam,将申请QR分解为X只使用了全秩子空间,即,最大子集X,给出了一个满秩空间的列,用于估计,固定系数在0或0处与其余列相关联NA.你得到的警告只是暗示了这一点.有原始ncol(X)系数要估计,但由于缺陷,只会ncol(X) - 7估计,其余为0或NA.这种数值解决方案确保可以以最稳定的方式获得最小二乘解.


为了更好地消化此问题,您可以使用lm拟合线性模型fix.formula.

fix.fit <- lm(fix.formula, data.df, method = "qr", singular.ok = TRUE)
Run Code Online (Sandbox Code Playgroud)

method = "qr"并且singular.ok = TRUE是默认值,所以实际上我们不需要设置它.但是,如果我们指明singular.ok = FALSE,lm将停止并抱怨排名缺陷.

lm(fix.formula, data.df, method = "qr", singular.ok = FALSE)
#Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
#  singular fit encountered
Run Code Online (Sandbox Code Playgroud)

然后,您可以检查返回的值fix.fit.

p <- length(coef)
coef <- fix.fit$coef
no.NA <- sum(is.na(coef))
rank <- fix.fit$rank
Run Code Online (Sandbox Code Playgroud)

保证p = ncol(X),但你应该看到no.NA = 7rank + no.NA = p.

里面发生了完全相同的事情lmer.lm不会报告缺陷lmer.这实际上是信息性的,因为我经常看到人们问为什么lm返回NA一些系数.


更新1(2016-05-07):

让我看看我是否有这个权利:简短的版本是我的一个预测变量与另一个相关,但我不应该担心它.使用因素是否合适,对吗?我仍然可以anova通过查看BIC或通过查看BIC 来比较模型?

不要担心使用summaryanova.编写方法以便使用正确数量的参数(自由度)来产生有效的汇总统计.

更新2(2016-11-06):

让我们也听一下包的作者lme4会说:排名缺陷警告混合型号lmer.Ben Bolker也提到caret::findLinearCombos过,特别是因为那里的OP希望自己解决缺陷问题.

更新3(2018-07-27):

秩有缺陷对于有效的模型估计和比较不是问题,但可能是预测中的危险.我最近用CrossValidated的模拟例子编写了一个详细的答案:R lm,有没有人能给我一个关于"从排名缺陷预测"的误导性案例的例子?所以,是的,理论上我们应该避免排名不足的估计.但实际上,没有所谓的"真实模型":我们试图从数据中学习它.我们永远无法将估计的模型与"真相"进行比较; 最好的选择是从我们建造的许多模型中选择最好的一个.因此,如果"最佳"模型最终排名不足,我们可能会对此持怀疑态度,但可能我们无法立即做到.


Mox*_*Mox 5

响应在解释什么是等级不足以及可能的原因方面做得很好。

即:

  1. 数据太少:您无法唯一估计少于n个数据点的n个参数
  2. 重复点太多。
  3. 信息放置在错误的地方。
  4. 复杂的模型(变量太多)
  5. 单位和比例
  6. 数字变化:12.001与12.005、44566与44555
  7. 数据精度:即使双精度变量也有限制