R - LMERConvenienceFunctions 的替代方案或修复方案,用于 LME4?

R - Alternatives to, or fix for, LMERConvenienceFunctions, for use with LME4?

我从 https://stats.stackexchange.com/questions/488201/alternatives-to-or-fix-for-lmerconveniencefunctions-for-use-with-lme4 交叉发布这篇文章,因为它表明人们可能在这里有更多相关知识。

最近我从 R 版本 3.6 更新到版本 4.0 进行分析,并注意到 LMERConvenienceFunctions 停止工作。具体来说,我是配合LME4使用的。

每当我尝试使用 bfFixefLMER_F.fnc(LMER 模型中固定效应的反拟合)或 pamer.fnc(计算上下限 p 值以分析方差或偏差)对于通过 LME4 拟合的 LMER 模型,无论数据集如何,我都会遇到错误“pf(anova.table[term, "F value"], anova.table[term, "Df"], nrow(model@frame) - :数学函数的非数字参数”。我在两台不同的计算机上尝试过这个,结果相同。现在,据我所知,LMERConvenienceFunctions 自 2015 年以来就没有更新过,所以我我不希望修复即将到来。

我尝试恢复到 R 3.6.2,但在使用 R 4.0 发布前不久发布的 LME4 版本时发现了同样的错误。我终于找到了我使用的以前的版本,所以这将(希望)修复它以用于我当前的分析,但如果我想继续使用最新版本的 R 和 LME4 则无济于事。

LMERConvenience 的其他功能(即 fitLMER.fnc 和 mcp.fnc)似乎可以正常工作,所以这似乎不是系统问题,但绝对是一个严重阻碍我的问题工作。

是否有人对替代包有任何建议,或者有人可以提供任何关于编辑 LMERConvenienceFunctions 包的建议,以便我可以使损坏的功能再次运行?我没有任何更改包内编码的经验,因此将从那里的基础知识开始。

我也知道通过在我的 R 脚本中添加额外的代码有一些解决方法,因为我在搜索答案时确实发现它在 2014 年曾是同一个包的问题 (https://stat.ethz.ch/pipermail/r-sig-mixed-models/2014q2/022264.html),但我不熟悉编写此类代码,因此也希望能提供任何指导。

我设法从 github 上使用 LME4 的可爱的人们那里得到了一些帮助;对于以后遇到此问题的任何人,请注意以下几点:

  1. 我已经通过电子邮件向列出的 LMERConvenienceFunctions 维护者发送电子邮件,要求他们更新 CRAN 版本,以便它遵守 CRAN 的规则。希望他能做到。

  2. 为了修复那些使用 LME4 和 LMERConvenienceFunctions 但不使用 lmerTest 的人,最近 anova table headers“Chi Df”和“Df”是分别更新为“Df”和“npar”(此处列出的原因:https://github.com/lme4/lme4/issues/528)。这是 LMERConvenienceFunctions 的问题,因为 pamer.fnc 调用了 Df,因此需要更新为调用 npar。此外,bfFixefLMER_F.fnc 调用 pamer.fnc,因此在更新 pamer.fnc 时已修复。对于不确定如何使用的人,我找到了使用 getAnywhere() 的代码并对其进行了修改,因此只需复制下面的代码并将其粘贴到文件开头附近:

pamer.fnc <- function (model, ndigits = 4) 
{
    if (length(rownames(anova(model))) == 0) {
        cat("nothing to evaluate: model has only an intercept.\n\n")
        cat("printing model fixed effects:\n")
        fixef(model)
    }
    else {
        dims <- NULL
        rank.X = qr(model@pp$X)$rank
        anova.table = anova(model)
        anova.table = cbind(anova.table, upper.den.df = nrow(model@frame) - 
            rank.X)
        p.values.upper = as.numeric()
        p.values.lower = as.numeric()
        for (term in row.names(anova.table)) {
            p.values.upper = c(p.values.upper, round(1 - pf(anova.table[term, 
                "F value"], anova.table[term, "npar"], 
                nrow(model@frame) - rank.X), ndigits))
            model.ranef <- ranef(model)
            lower.bound <- 0
            for (i in 1:length(names(model.ranef))) {
                dims <- dim(model.ranef[[i]])
                lower.bound <- lower.bound + dims[1] * dims[2]
            }
            p.values.lower = c(p.values.lower, 1 - pf(anova.table[term, 
                "F value"], anova.table[term, "npar"], 
                nrow(model@frame) - rank.X - lower.bound))
        }
        dv <- gsub(" ", "", gsub("(.*)~.*", 
            "\1", as.character(model@call)[2]))
        ss.tot <- sum((model@frame[, dv] - mean(model@frame[, 
            dv]))^2)
        aov.table <- as.data.frame(anova(model))
        expl.dev <- vector("numeric")
        for (i in rownames(aov.table)) {
            expl.dev <- c(expl.dev, aov.table[i, 2]/ss.tot)
        }
        names(expl.dev) <- rownames(aov.table)
        anova.table = round(cbind(anova.table, upper.p.val = p.values.upper, 
            lower.den.df = nrow(model@frame) - rank.X - lower.bound, 
            lower.p.val = p.values.lower, `expl.dev.(%)` = expl.dev * 
                100), ndigits)
        return(anova.table)
    }
}

(您可能还需要再次 运行 bfFixefLMER_F.fnc 的函数脚本,让 R 知道 bfFixefLMER_F.fnc 应该从 [=30= 的更新版本调用])

  1. 对于那些使用 LME4 和 LMERConvenienceFunctions 但同时也在使用 lmerTest 的用户,您需要 1) 使用 numDF 而不是 npar,或 2) 替换“anova.table = anova(model) " with "anova.table = anova(model, dff = "lme4") in versions of lmerTest 3.0 onwards. 这似乎是由于 anova.lmerModLmerTest 函数(在 lmerTest 3.0 中添加)覆盖了对anova() 确实如此,在 lme4 之前列出了 Type III Satterthwaite 分析,导致它在未指定 dff 时默认为。