plot() 不显示 lme/lmer 的所有诊断图

NLH*_*NLH 7 plot r

使用 lme/lmer 函数时,我无法让 R 使用 par(mfrow=c(2,2)) 和 plot( )。我只得到了分辨率与拟合图,没有其他任何东西。我使用 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) 
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 8

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

\n

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

\n

拟合与添加平滑线的残差

\n
plot(lmer_model, type=c("p","smooth"), col.line=1)\n
Run Code Online (Sandbox Code Playgroud)\n

(不同颜色绘制的平滑线和零线比较难)

\n

比例位置图

\n
plot(lmer_model,\n     sqrt(abs(resid(.)))~fitted(.),\n     type=c("p","smooth"), col.line=1)\n
Run Code Online (Sandbox Code Playgroud)\n

QQ剧情

\n
lattice::qqmath(lmer_model)\n
Run Code Online (Sandbox Code Playgroud)\n

残差与杠杆

\n
plot(fm1, rstudent(.) ~ hatvalues(.))\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

历史记录

\n

诊断图方法的设计和实现lme4与 不同plot.lm,这是基本 R 中的典型示例。为什么?我不确定,但这种方法源自nlmeR 之前的包;我能找到的最早版本是来自 Wayback Machine (1998) 的这个页面,它链接到1.2 版用户指南的副本,日期为 1995 年 2 月;距离1995 年 6 月首次发布 R 源代码(通过 ftp)还有三个月。

\n
    \n
  • 它使用lattice(源自 Trellis\xe2\x84\xa2 图形)而不是基本 R 图形
  • \n
  • 虽然它不会自动构建例如比例位置图,但它更灵活。您可以使用公式来显示拟合值或残差值与参数、构面等,例如plot(fm1,residuals(.)~Days|Subject)
  • \n
  • 有单独的命令用于绘制残差等 ( plot) 和 QQ 图 ( qqnormin nlme, qqmathin lme4)
  • \n
\n


Ben*_*ker 5

只要我们添加答案,性能包现在就可用:

library(lme4)
library(performance)
fm1 <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
check_model(fm1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


All*_*ron 1

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

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

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

这意味着当我调用时plot(lm_model),R 将看到我正在调用plot类的对象lmplot(1:10)R 现在知道调用专门为绘制类型对象而编写的绘图方法,而不是像我那样尝试构建基本的 xy 图"lm"。在这种情况下,它将调度 method 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"
Run Code Online (Sandbox Code Playgroud)

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

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

因此,简短的回答是,不存在需要“解决”的问题;这不是"lmerMod"绘制对象的方式。如果您对自己的健康状况的某些方面有特定的担忧,而这些诊断图可以解答这些问题,则您应该单独检查这些问题。