如何获取R语言lme4包predict方法帮助及类方法查询技巧
问题场景
我在学习lme4包的教程时,用到了带re.form=NA参数的predict函数:
m_lmer <- lmer(log(beakh) ~ log(wingl) + (1 | taxon), data = d) d$predict_lmer_population <- predict(m_lmer, re.form = NA)
直接用?predict查不到这个调用的专属帮助。我先查了模型的类:
> class(m_lmer) [1] "lmerMod" attr(,"package") [1] "lme4"
尝试用?lmerMod查询时,RStudio自动转成了?lmerMod-class``,我知道加反引号是因为名称里有特殊字符,但搞不懂-class后缀的来源。而且打开的帮助文档讲的是merMod类而非lmerMod类,为什么前缀l被去掉了?后来我在这个帮助里找到了predict.merMod的链接,也能用methods('predict')查到标记为predict.merMod*的方法。我想搞清楚这些疑问,同时掌握R中类方法帮助查询的正确方式,比如S4或R6类是否遵循同样逻辑,lmerMod和merMod的名称差异、-class后缀的必要性。
核心疑问解答
1. -class后缀的来源
-class是S4类帮助文档的命名惯例。lme4中的lmerMod是S4类,R中S4类的帮助文档通常会以类名-class的形式命名,这样R的帮助系统能识别这是类的文档而非普通函数。RStudio自动补全-class后缀,就是遵循这个S4类的帮助查询规则。
2. lmerMod与merMod的关系
merMod是lme4中所有混合效应模型类的父类(基类),lmerMod是拟合线性混合模型(用lmer()函数得到)的子类,另外还有glmerMod(广义线性混合模型)、nlmerMod(非线性混合模型)等子类。这些子类都继承了merMod的核心方法,包括predict(),所以predict.merMod是所有这些子类共用的预测方法,帮助文档也统一放在父类merMod的文档里,这就是为什么打开lmerMod-class的帮助会看到merMod的内容——子类的帮助通常会指向父类的通用文档。
3. 不同类型类的帮助查询逻辑
S3类(最常见的基础类)
- 方法命名是
函数名.类名的形式,比如predict.lm - 查询专属方法帮助:直接用
?函数名.类名,比如?predict.lm;或者用help("函数名.类名") - 查看某个函数针对不同类的所有方法:
methods(函数名),比如methods(predict)
S4类(如lme4的模型类)
- 类的帮助文档用
?类名-class,比如`?`merMod-class - 方法查询:用
showMethods(函数名)查看S4方法,比如showMethods(predict);或者直接查方法的帮助,比如?predict.merMod - 也可以用
getMethod(predict, signature = "merMod")查看具体方法的代码
R6类(面向对象的类)
- R6类的方法通常是类的成员,帮助文档一般会放在类的构造函数里,比如
?R6Class(如果是自定义R6类,需要在文档里说明) - 也可以直接查看类的定义:
print(类名),或者用?类名查询类的专属文档
4. 类方法帮助查询的正确步骤
- 确定对象的类:用
class(对象名),比如class(m_lmer) - 查看函数的可用方法:
- S3/S4通用:
methods(predict) - S4专属:
showMethods(predict)
- S3/S4通用:
- 直接查询对应方法的帮助:
- 不管S3/S4,直接用
?函数名.类名,比如?predict.merMod,这是最直接的方式
- 不管S3/S4,直接用
- 如果是S4类,查询类的文档:用
?类名-class``了解类的结构和继承关系,进而找到关联方法
总结
针对lme4的predict调用,最快的帮助查询方式是直接用?predict.merMod;如果想了解模型类的整体结构,就查?merMod-class``。不同类型的类在帮助查询上有细微差异,但核心都是先明确对象的类,再定位到对应的方法或类文档。
内容的提问来源于stack exchange,提问作者Jimbo

