在 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" 对象的绘制方式。如果您对这些诊断图可以回答的适合您的某些方面有特定的担忧,您应该单独检查这些方面。