使用 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 (将#修改为@)