函数内的lapply,glm和speedglm:缺少参数“ data”,没有默认值

时间:2019-11-03 00:59:57

标签: r lapply glm speedglm

我正在使用mtcars数据来显示我的问题。以下代码可与glm配合使用。它通过将vlist中的每个变量添加到glm(vs ~ mpg, family = binomial(), data = mtcars的模型中来生成新模型。

check_glm <- function(crude, vlist, data, ...){
  a <- glm(crude, data = data, family = binomial())
  lapply(vlist, function(x) update(a, as.formula(paste0(". ~ . +", x))))
}
check_glm(crude = "vs ~ mpg", vlist = c("am", "hp"), data = mtcars)

但是,当我将glm替换为speedglm时,

library(speedglm)
check_speedglm <- function(crude, vlist, data, ...){
  a <- speedglm(crude, data = data, family = binomial())
  lapply(vlist, function(x) update(a, as.formula(paste0(". ~ . +", x))))
}
check_speedglm(crude = "vs ~ mpg", vlist = c("am", "hp"), data = mtcars)

我知道了:

  

model.frame.default(formula = vs〜mpg + am,data = data,   drop.unused.levels = TRUE):缺少参数“数据”,没有   默认。

我认为问题出在lapply行中,但是我无法解决。任何解决此问题的建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

本质上,您正在混淆可能彼此不兼容的包方法。尽管它们使用相同的名称,但是这两种方法都来自不同的软件包,因此,不同的作者针对不同的目的而输出了不同的对象(glm类与speedglm类,可能是S3与S4对象)。 >

具体来说,glm方法是R在stats包中的标准库的一部分,它与相关的stats方法update一起使用。

每个update文档

  

update将更新并(默认情况下)重新拟合模型。它通过提取存储在对象中的调用,更新调用并(默认情况下)评估该调用来做到这一点。

主要论点:

  

对象,x :来自诸如lmglm等模型函数的现有拟合

因此,如果speedglm将捕获捕获公式,数据和其他参数的调用存储为glm(继承自lm类的返回对象结构),则{{ 1}}可以工作。


要解决,请考虑通过使用update通过迭代模型调用动态构建update来完成formula的工作。这将在两种方法中均有效,因为每种方法都使用lapply对象。

formula