【问题标题】:plot() does not show all diagnostic plots for lme/lmerplot() 不显示 lme/lmer 的所有诊断图
【发布时间】:2020-12-24 08:07:47
【问题描述】:

当使用 lme/lmer 函数时,我无法通过 par(mfrow=c(2,2)) 让 R 显示所有 4 个诊断图(res 与拟合、正常 QQ、比例位置、res 与杠杆)和情节()。 我只得到 res vs fit 图,没有别的。 使用 lm 功能时我没有问题。 有人知道怎么做吗?

library(lme4)
m0<-lmer(hematology~Treatment*day+Gender+(1|ID),data=long,na.action=na.omit,REML=FALSE)
par(mfrow=c(2,2))
plot(m0) 

【问题讨论】:

    标签: r plot


    【解决方案1】:

    tl;dr ?plot.merMod 非常详细地解释了绘图方法如何适用于 [g]lmer 产生的拟合...

    您至少可以相当容易地获得与plot.lm 对应的前三个图:

    拟合与残差添加平滑线

    plot(lmer_model, type=c("p","smooth"), col.line=1)
    

    (用不同颜色绘制平滑和零线更难)

    比例位置图

    plot(lmer_model,
         sqrt(abs(resid(.)))~fitted(.),
         type=c("p","smooth"), col.line=1)
    

    Q-Q 图

    lattice::qqmath(lmer_model)
    

    残差与杠杆

    plot(fm1, rstudent(.) ~ hatvalues(.))
    

    (Cook 的距离可以通过 cooks.distance() 计算,但叠加 CD={0.5,1} 的轮廓并不容易......)

    历史记录

    lme4 诊断图方法的设计和实现与plot.lm 不同,plot.lm 是 base R 中的典型示例。为什么?我不确定,但这种方法源自于 R 之前的 nlme 包;我能找到的最早版本是this page from the Wayback Machine(1998 年),它链接到 1.2 版的copy of the user's guide,日期为 1995 年 2 月;那是在June 1995 首次发布 R 源代码(通过 ftp)前三个月。

    • 它使用 lattice(源自 Trellis™ 图形)而不是 base-R 图形
    • 虽然它不会自动构造,例如比例位置图,它更灵活。您可以使用公式来显示拟合值或残差值与参数、方面等,例如plot(fm1,residuals(.)~Days|Subject)
    • 有用于绘制残差等 (plot) 和 Q-Q 图的单独命令(nlme 中的qqnormlme4 中的qqmath

    【讨论】:

    • 谢谢。这真的很有帮助
    【解决方案2】:

    在 R 中,plot 是一个通用函数。这意味着当您调用plot 时,R 会检查您传递给第一个参数的对象的类,并根据该类选择绘图方法。

    让我们举个例子。假设我使用lm 函数来创建模型。生成的模型对象将具有类 "lm":

    lm_model <- lm(Sepal.Length ~ Sepal.Width, data = iris)
    class(lm_model)
    #> [1] "lm"
    

    这意味着当我调用plot(lm_model) 时,R 会看到我正在对lm 类的对象调用plot。 R 不再像 plot(1:10) 那样尝试构建基本的 xy 图,而是知道调用专门编写的绘图方法来绘制 "lm" 类型的对象。在这种情况下,它将调度方法 stats:::plot.lm,这是一个长函数,它接受 "lm" 对象并创建 4 个诊断图。

    现在让我们看看使用lmer 创建模型时会得到什么:

    library(lme4)
    lmer_model <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
    class(lmer_model)
    #> [1] "lmerMod"
    #> attr(,"package")
    #> [1] "lme4"
    

    我们的模型是"lmerMod" 类型的对象。当我们在这个对象上调用plot 时,R 会查找正确的方法来绘制这个类的对象。由于它与"lm" 类的对象具有完全不同的结构,因此用plot.lm 绘制它是没有意义的,因此创建lme4 包的作者必须确定绘制"lmerMod" 类的对象是。他们编写了 lme4:::plot.merMod 方法,该方法绘制了您在模型上调用 plot 时看到的单个图。

    这是为什么?这是作者要回答的问题,但似乎主要原因是他们想要一种涵盖 GLMM、LMM 和 REML 模型的绘图方法。 lm 的诊断图不适用于所有这些模型类型。

    所以简短的回答是“解决”这样的问题是没有问题的;这不是 "lmerMod" 对象的绘制方式。如果您对这些诊断图可以回答的适合您的某些方面有特定的担忧,您应该单独检查这些方面。

    【讨论】:

    • 感谢您的回复,非常感谢 :) !
    • 为什么?可能没有你建议的那么有原则。有可能产生与plot.lm 类似的图...
    • @BenBolker 正如我所说,这是作者要回答的问题。如果只有其中一个人可以在此线程上对此发表评论...
    • @BenBolker 可能是 plot.lmerMod 的单独方法?我的猜测是,您认为某些 GLMM 会得到一些丑陋/无用的 QQ 图,因此您坚持使用仅残差图,但这可能是完全错误的。我很想知道,因为几年前我自己也曾想过这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2021-02-23
    • 2017-05-18
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多