如果$操作符没有为这个S4类定义,我如何从glmerMod对象中提取模型组件



我想提取模型列表的模型调用。该列表包括glm和glmm。

这似乎适用于glm对象,但不适用于glmerMod对象

gm1 <- glm(cbind(incidence, size - incidence) ~ period,
data = cbpp, family = binomial)
gm1$call
>glm(formula = cbind(incidence, size - incidence) ~ period, family = binomial, 
data = cbpp)
gm2 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd),
data = cbpp, family = binomial)
gm2$call
>Error in gm2$call : $ operator not defined for this S4 class

我可以看到,当我点击rstudio环境窗格中的glmerMod对象时,该对象似乎有一个与之关联的调用值。

是否有一种方法可以使用相同的函数从两种类型的模型中提取此信息?这将是我的首选,因为我希望将其设置为应用于模型列表的lapply函数。

models <- list(gm1, gm2)
calls <- lapply(models, function(x) x$call)

你根本不需要summary()

getCall(lmm)getCall(lm)都能工作。(如果你深入研究,你会发现getCall的默认方法只是getElement(., "call");getElement是一个实用函数,它查找元素,或者列表元素($...)或S4槽(@...)。

您可以使用summary(gm2)$call获得呼叫

我想这样可以:

library(lme4)
head(iris)
lmm<-lmer(Petal.Length~Petal.Width+(1|Species),data=iris)
lm<-lm(Petal.Length~Petal.Width+Species,data=iris)
lm$call
summary(lmm)$call
getcall<-function(x){if(class(x)=="lmerMod"|class(x)=="glmerMod"){return(summary(x)$call)}else{return(x$call)}}

getcall(lm)
## lm(formula = Petal.Length ~ Petal.Width + Species, data = iris)
getcall(lmm)
## glmer(formula = Petal.Length ~ Petal.Width + (1 | Species), data = iris, 
family = Gamma)

现在添加lapply代码:

models <- list(lm, lmm)
calls <- lapply(models, getcall)
calls
## [[1]]
## lm(formula = Petal.Length ~ Petal.Width + Species, data = iris)
## [[2]]
## glmer(formula = Petal.Length ~ Petal.Width + (1 | Species), data = iris, 
family = Gamma)

最新更新