lme4::lmer 报告 "fixed-effect model matrix is rank deficient",我需要修复吗?如何修复?

lme4::lmer reports "fixed-effect model matrix is rank deficient", do I need a fix and how to?

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

fixed-effect model matrix is rank deficient so dropping 7 columns / coefficients.

由此link、Fixed-effects model is rank deficient,我觉得应该用R包caret中的findLinearCombos。但是,当我尝试 findLinearCombos(data.df) 时,它给出了错误消息

Error in qr.default(object) : NA/NaN/Inf in foreign function call (arg 1) In addition: Warning message: In qr.default(object) : NAs introduced by coercion

我的数据没有任何 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)

编辑: 如果有帮助,这里还有一些代码。

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

lmer(formula, REML = FALSE, data = data.df)

编辑编辑:

OP 没有提供足够数量的测试数据,无法在 lmer 中为 reader 提供实际的 运行 模型。但这不是什么大问题。这个还是很不错的post!

您对警告消息有点过度关注:

fixed-effect model matrix is rank deficient so dropping 7 columns / coefficients.

这是警告,不是错误。既没有误用​​lmer,也没有错误指定模型公式,因此您将得到一个估计模型。但是为了回答你的问题,我会努力解释一下。


在执行 lmer 期间,您的模型公式被分解为 固定效应公式 随机效应公式 ,并为每个构造一个 模型矩阵 。固定的构造是通过标准模型矩阵构造器model.matrix;随机的构造比较复杂,但与你的问题无关,所以我就跳过了。

对于您的模型,您可以通过以下方式检查固定效应模型矩阵的样子:

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

X <- model.matrix (fix.formula, data.df)

你所有的变量都是因子,所以 X 将是二元的。虽然 , it is still possible that X does not end up with full column rank, as a column may be a linear combination of some others (which can either be precise or numerically close). In your case, .

排名不足的原因有很多。 分享了一个提供大量讨论的 CrossValidated 答案,我将对此发表一些评论。

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

所以,有时我们可以解决这个问题,但并不总是能够做到这一点。因此,任何编写良好的模型拟合例程,如 lmglmmgcv::gam,都将对 X 应用 QR 分解,以仅使用其全秩子 space,即 X 的列的最大子集,给出全秩 space,用于估计 。你得到的警告只是暗示这一点。本来有ncol(X)个系数估计,但由于不足,只估计了ncol(X) - 7个,其余为0或NA。这种数值解决方法确保可以以最稳定的方式获得最小二乘解。


为了更好地理解这个问题,您可以使用 lm 来拟合具有 fix.formula 的线性模型。

fix.fit <- lm(fix.formula, data.df, method = "qr", singular.ok = TRUE)

method = "qr"singular.ok = TRUE是默认的,所以实际上我们不需要设置它。但是如果我们指定 singular.ok = FALSElm 将停止并抱怨排名不足。

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

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

p <- length(coef)
coef <- fix.fit$coef
no.NA <- sum(is.na(coef))
rank <- fix.fit$rank

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

lmer 内部发生了完全相同的事情。 lm 不会报告缺陷,而 lmer 会。这实际上是提供信息的,因为我经常看到人们问为什么 lm returns NA 对于某些系数。


更新 1 (2016-05-07):

Let me see if I have this right: The short version is that one of my predictor variables is correlated with another, but I shouldn't worry about it. It is appropriate to use factors, correct? And I can still compare models with anova or by looking at the BIC?

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

更新 2 (2016-11-06):

让我们也听听 lme4 的包作者会怎么说:。 Ben Bolker 也提到了 caret::findLinearCombos,特别是因为那里的 OP 想自己解决缺陷问题。

更新3(2018-07-27):

秩不足不是有效模型估计和比较的问题,但可能是预测中的危险。我最近在 CrossValidated 上用模拟示例编写了一个详细的答案:R lm, Could anyone give me an example of the misleading case on “prediction from a rank-deficient”? 所以,是的,理论上 我们应该避免排名不足的估计。但是现实中并没有所谓的"true model":我们尝试从数据中学习。我们永远无法将估计模型与 "truth" 进行比较;最好的选择是从我们构建的多个模型中选择最好的一个。因此,如果 "best" 模型最终排名不足,我们可以对此表示怀疑,但可能我们无法立即采取任何措施。

这篇 response 很好地解释了什么是等级不足,以及可能的原因。

即:

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