微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 match.call() 更新 glm

如何解决使用 match.call() 更新 glm

假设我有以下模型:

mod1 <- glm(cyl ~ mpg + disp,data = mtcars)

然后我想修改glm调用中的一些元素。例如新公式和新数据:

fm_new <- formula(cyl ~ mpg + disp + offset(log(gear)))
df_new <- mtcars

并将新元素组合到一个列表中:

lst1 <- list(fm = fm_new,df = df_new,mod_call = mod1$call)

然后在最后一步中,我想将此列表传递给 glm2() 以改装 glm:

glm2 <- function(x){
  fm <- x$fm
  df <- x$df
  glm(fm,data = df)
}

这将返回改装的 glm:

glm2(lst1)  

# Call:  glm(formula = fm,data = df)
#
# Coefficients:
# (Intercept)          mpg         disp  
#     4.44751     -0.09326      0.01009  
#
# degrees of Freedom: 31 Total (i.e. Null);  29 Residual
# Null Deviance:        111.5 
# Residual Deviance: 16.34  AIC: 77.3

但是,以上仅当我在 glm2() 中的 glm 调用中明确定义参数时才有效,我想要实现的是 glm() 中的 glm2() 使用完全相同的元素在调用中作为 mod1。例如:

mod2 <- glm(cyl ~ mpg + disp,family = "poisson",weights = am,data = mtcars)

然后将所有新元素添加到列表中:

lst2 <- list(fm = fm_new,mod_call = mod2$call)

此处 glm2() 还应使用来自 mod2 的 Poisson GLM 和权重。如何修改 glm2() 使其还包含 mod2 中使用的系列和权重(或传递给 mod2 的其他参数)?我知道 match.call() 但不完全了解它在这里是如何工作的。

以下是我想要实现的:

glm2(lst2)

# Call:  glm(formula = fm,data = df,weights = am)
# 
# Coefficients:
# (Intercept)          mpg         disp  
#    0.374368    -0.017450     0.001163  
#
# degrees of Freedom: 12 Total (i.e. Null);  10 Residual
# Null Deviance:        4.037 
# Residual Deviance: 1.256  AIC: 52.23

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。