我正在使用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
行中,但是我无法解决。任何解决此问题的建议将不胜感激。
答案 0 :(得分:3)
本质上,您正在混淆可能彼此不兼容的包方法。尽管它们使用相同的名称,但是这两种方法都来自不同的软件包,因此,不同的作者针对不同的目的而输出了不同的对象(glm
类与speedglm
类,可能是S3与S4对象)。 >
具体来说,glm
方法是R在stats
包中的标准库的一部分,它与相关的stats
方法update
一起使用。
每个update
文档
update
将更新并(默认情况下)重新拟合模型。它通过提取存储在对象中的调用,更新调用并(默认情况下)评估该调用来做到这一点。
主要论点:
对象,x :来自诸如
lm
,glm
等模型函数的现有拟合
因此,如果speedglm
将捕获捕获公式,数据和其他参数的调用存储为glm
(继承自lm
类的返回对象结构),则{{ 1}}可以工作。
要解决,请考虑通过使用update
通过迭代模型调用动态构建update
来完成formula
的工作。这将在两种方法中均有效,因为每种方法都使用lapply
对象。
formula