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

时间:2016-05-07 16:06:16

标签: r regression linear-regression lme4 mixed-models

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

  

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

通过此链接Fixed-effects model is rank deficient,我认为我应该在R包findLinearCombos中使用caret。但是,当我尝试findLinearCombos(data.df)时,它会向我显示错误消息

  

qr.default(object)中的错误:外部函数调用中的NA / NaN / Inf(arg 1)       另外:警告信息:       在qr.default(object)中:由强制引入的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中实际运行模型。但这不是一个大问题。这仍是一个非常好的帖子!

2 个答案:

答案 0 :(得分:26)

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

  

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

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

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

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

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

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

所有变量都是因子,因此X将是二进制的。虽然model.matrix applies contrasts for each factor and their interactionX仍然可能不会以完整列排名结束,因为列可能是其他一些列的线性组合(可以精确或数字关闭< / em>的)。在您的情况下,some levels of one factor may be nested in some levels of another

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

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

因此,有时我们可以解决这个问题,但并不总能实现这一目标。因此,任何编写良好的模型拟合例程,如lmglmmgcv::gam,都会对X应用QR分解,仅使用其全等级子空间,即X列的最大子集,为估计提供全等级空间fixing coefficients associated with the rest of the columns at 0 or NA。你得到的警告只是暗示了这一点。最初会计算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会为某些系数返回NA

更新1(2016-05-07):

  

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

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

更新2(2016-11-06):

让我们也听一下lme4的作者会说:rank deficiency warning mixed model lmer。 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”?所以,是的,理论上我们应该避免秩缺陷估计。但实际上,并没有所谓的“#34;真实模式&#34; :我们试图从数据中学习它。我们永远无法将估计的模型与&#34;真相&#34 ;;最好的选择是从我们建立的许多模型中选择最好的一个。所以,如果&#34;最好&#34;模型最终排名不足,我们可能对此持怀疑态度,但可能我们无法立即做任何事情。

答案 1 :(得分:3)

这个response可以很好地解释排名不足的原因,以及可能的原因。

即:

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