【问题标题】:Error in funtrans(sort(unique(model_frame[[y]]))) : non-numeric argument to mathematical functionfuntrans(sort(unique(model_frame[[y]]))) 中的错误:数学函数的非数字参数
【发布时间】:2023-03-16 02:01:01
【问题描述】:

首先 - 有没有什么好的参考资料可以帮助我更好地解释错误消息?我目前的策略是先检查脚本,然后检查数据,然后在谷歌上冲浪几个小时/在这里发布问题。

我有一个模型(如下),我正在尝试使用ggpredict 来拟合显示冬季火灾与时间之间关系的曲线。

data <- read.csv('StacksOverflow.csv')
dput(head(data))

数据:

structure(list(X = 1:6, yrblock15 = c(2004L, 2004L, 2004L, 2004L, 
2004L, 2004L), circleID = 1:6, time = c(5.270172597, 4.270172617, 
3.348596103, 3.019112219, 2.905252281, 2.773856447), ThreeYearRain = c(748.9863518, 
744.4805429, 748.6081666, 747.5941999, 746.3382951, 740.9514718
), summer = c(2L, 2L, 2L, 3L, 2L, 3L), winter = c(1L, 1L, 1L, 
5L, 4L, 4L), total = c(3L, 3L, 3L, 8L, 6L, 7L), claylake = c(0, 
0, 0, 0, 0.01, 0), spinsandplain = c(99.53, 90.39, 50.7, 63.8, 
73.65, 82.73), rain15 = c(412.5357625, 412.1096373, 414.7593319, 
416.1126083, 416.1484008, 413.5668281), coefrain15 = c(48.03688416, 
48.05843172, 47.98508211, 48.13217304, 48.39476675, 48.51635011
)), row.names = c(NA, 6L), class = "data.frame")

包:

library(lme4)
library(ggeffects)

型号:

m3 <- lmer(winter~scale(log(time))+scale(spinsandplain)+scale(rain15)+
           scale(claylake)+scale(rain15)*scale(log(time))+(1|circleID),
           na.action=na.fail, data=data, REML=FALSE)

d <- ggeffect(m3, terms = "time[exp]")

产生此错误的原因:

funtrans(sort(unique(model_frame[[y]]))) 中的错误: 数学函数的非数字参数

任何建议为什么会发生这种情况??

【问题讨论】:

  • 谢谢。一旦我这样做了,我该如何让它进入堆栈溢出?
  • 如果你通过library()展示你使用过的包会很有帮助。
  • 别担心,我已经添加了我正在使用的包

标签: r lme4


【解决方案1】:

除了您现有的 error-message-fu(谷歌搜索并在论坛上发帖)之外,我唯一的其他建议是有时您可以尝试在源代码中找到相关代码,例如如果你在 ggeffects Github repo 上搜索错误消息,你可以得到 here。不过,这可能有帮助,也可能没有帮助。 (我诊断您的问题的方式更基本;我从一个只有log(time)(或同等学历)的模型开始,看到它有效,然后尝试了一个带有scale(log(time)) 的模型,发现它没有...... )



如果我使用scale(log(x)),我可以重现这个

library(lme4)
library(ggeffects)
sleepstudy$Days1 <- 1 + sleepstudy$Days

这很好:

fm <- lmer(Reaction ~ log(Days1) + (1|Subject), sleepstudy)
ggeffect(fm, term = "Days1 [exp]")

然而,

fm <- lmer(Reaction ~ scale(log(Days1)) + (1|Subject), sleepstudy)
ggeffect(fm, term = "Days1 [exp]")

funtrans(sort(unique(model_frame[[y]]))) 中的错误:数学函数的非数字参数

看起来scale(log(.)) 通常有问题。 ggeffect(fm) 也给出了错误(尽管略有不同)。如果我们使用scale(Days)log(Days1),我们可以,但scale(log(Days)) 不起作用。

解决方法是定义您自己的变量,例如sleepstudy$sl_Days1 &lt;- scale(log(sleepstudy$Days+1)),然后从那里开始(即lmer(...); ggeffect(fm, terms="sl_Days1 [exp]")

您可以尝试在 issues list for ggeffects 上发布问题/功能请求(首先是为了更有用的错误消息,其次是为了让这项工作更加无缝)

【讨论】:

  • 查看了代码后,如果有帮助的话,我可以为您提供更具体的问题诊断...
  • 您好 Ben,我只是尝试应用您的上述建议,看看我是否能解决问题 - 但绝对不会拒绝更具体的诊断。谢谢!
  • 我已经检查过了,我希望有一天能拥有你所拥有的一盎司 R 智慧!
【解决方案2】:

这是一个评论,而不是一个答案(Ben 已经回答了你的问题,这里只是一些额外的信息,对于评论来说太长了......)。

ggeffects 使用 insight-package 访问模型信息,例如 - 在这个特定示例中 - 模型框架。为了轻松地将模型框架中的列名与ggpredict()ggeffect() 中的terms-参数中提供的变量名匹配,使用insight::clean_names()“清理”列名。但是,像 scale()log() 这样的嵌套命令是导致您报告错误的边缘情况。

在您的情况下,代码model_frame[[y]] 查找Days1(即y 在您的情况下具有值"Days1"),但是,列名被转换(“清理”)为"log""Days1",因此ggpredict() 尝试访问model_frame[["Days1"]],尽管列名为"log"

library(lme4)
#> Loading required package: Matrix
library(insight)
sleepstudy$Days1 <- 1 + sleepstudy$Days
fm <- lmer(Reaction ~ scale(log(Days1)) + (1|Subject), sleepstudy)

colnames(model.frame(fm))
#> [1] "Reaction"          "scale(log(Days1))" "Subject"

clean_names(colnames(model.frame(fm)))
#> [1] "Reaction" "log"      "Subject"

reprex package (v0.3.0) 于 2020-01-03 创建

我必须检查如何解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多