【问题标题】:Error: Problem with `mutate()` column (...) must be size 15 or 1, not 17192错误:`mutate()` 列 (...) 的问题必须为 15 或 1,而不是 17192
【发布时间】:2022-01-08 02:44:11
【问题描述】:

我目前正在尝试在this tutorial 之后绘制lme4::lmer 函数的结果。我已经尝试了教程中的代码,它按预期工作。 在本教程中,在绘图之前将一列 pred_dist 添加到拟合函数的数据集中。当我使用自己的数据尝试此操作时,出现以下错误:

Error: Problem with `mutate()` column `pred_dist`.
ℹ `pred_dist = fitted(model0)`.
ℹ `pred_dist` must be size 15 or 1, not 17192.
ℹ The error occurred in group 1: sgroup = 578, group = 1.

Sample data

我的代码:

# Loaded libraries
library(dplyr)
library(ggplot2)
library(lme4)
library(lmerTest)
library(lattice)

# My lmer model. myData is fairly 
model0 <- lmer(outcome ~ (1|group), data=myData, REML = FALSE)
summary(model0)

myData %>% 
    # save predicted values
    mutate(pred_dist = fitted(model0)) 

我想了解的是:导致此错误消息的原因是什么,我该如何解决?


更新:

根据bouncyball 的评论,我添加了 ungroup()mutate() 之前。这适用于我的初始模型,但不适用于后续模型。 我尝试了以下方法:

> model1 <- lmer(outcome ~ predictor + (1|group), myData, REML=FALSE) 

> plotVar$pred_dist = fitted(model1). 

Error: Assigned data 'value' must be compatible with existing data. 
✖ Existing data has 17192 rows. 
✖ Assigned data has 16794 rows. 
ℹ Only vectors of size 1 are recycled.

> plotVar %>% ungroup(.) 
          %>% mutate(pred_dist = fitted(model1)) 

Error: Problem with 'mutate()' column 'pred_dist'. 
ℹ 'pred_dist = fitted(model1)'. 
ℹ 'pred_dist' must be size 17192 or 1, not 16794.

【问题讨论】:

  • 最好这样做:myData$pred_dist = fitted(model0)
  • 谢谢,成功了!你知道为什么使用mutate() 会产生错误吗?
  • 我认为myData 是一个分组数据框。如果你把ungroup() 放在mutate 调用之前会发生什么?
  • 我们有机会获得minimal reproducible example吗?
  • @bouncyball ungroup() 在我的第一个示例中工作,但两种解决方案都不适用于后续示例(请参阅“更新”)。 @BenBolker 我已经尝试尽可能减少它。我无法用较小的数据集重现错误,因为我不完全确定是什么导致了问题。这就是为什么我包含指向应该能够减少错误的示例数据集的链接。

标签: r dplyr lme4


【解决方案1】:

我非常强烈的猜测是这里发生了两种不同的事情:(1) 分组 (2) NA 值。

让我们组成一个 分组并包含 NA 值的示例:

library(dplyr)
library(lme4)
ss <- sleepstudy |> group_by(Subject)
ss$Days[1:5] <- NA

m0 <- lmer(Reaction ~ Days + (Days | Subject), ss)

试试原代码:

ss |> mutate(pred = fitted(m0))

pred 的大小必须为 10 或 1,而不是 175。
ℹ 第一组出错:Subject = 308。

试试ungroup():

ss |> ungroup() |> mutate(pred = fitted(m0))

pred = fitted(m0).
pred 的大小必须为 180 或 1,而不是 175。

我们仍然收到错误,但请注意大小不同。

现在使用na.action = na.exclude更新模型(这可以在第一个模型中完成,或者可以通过设置options(na.action = "na.exclude")来完成:

m1 <- update(m0, na.action = na.exclude)
ss |> ungroup() |> mutate(pred = fitted(m1))

【讨论】:

  • 我一直在查看您的代码示例,不禁注意到您使用|&gt; 作为管道运算符而不是%&gt;%。我以前从未见过这种语法,但文档说它是base 的一部分。写起来肯定快很多。 |&gt;%&gt;% 可以完全互换使用吗?
  • |&gt; 是 R 4.0 版的新功能。它不可互换:stackoverflow.com/questions/67633022/…。我喜欢它,因为它没有依赖关系,尽管在这种情况下这并不重要,因为我们无论如何都在使用dplyr
猜你喜欢
  • 2021-08-02
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多