我正在使用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中的错误(公式= vs ~ mpg + am,data = data,drop.unused.levels = TRUE):参数"data“缺失,没有默认值。
我认为问题出在lapply线上,但我想不出解决办法。任何解决这一问题的建议都将不胜感激。
发布于 2019-11-03 03:00:45
本质上,您正在混合可能不兼容的包方法。虽然它们同名,但这两种方法都来自不同的包,因此不同的作者出于不同的目的,并输出不同的对象(glm类与speedglm类,后者可能是S3与S4对象)。
具体来说,glm方法是stats包中R标准库的一部分,它与其相关的stats方法update一起工作。
根据update文档,
update将更新并(默认情况下)重新安装模型。它通过提取存储在对象中的调用、更新调用以及(默认情况下)评估该调用来实现这一点。
主要论点:
object,x:来自于模型函数的现有的fit,如
lm、andglm和许多其他
因此,如果speedglm存储捕获公式、数据和其他args的调用,并且类似于返回对象结构为glm (从lm类继承),那么update就可以工作。
要解决这个问题,可以考虑通过使用使用update的迭代模型调用动态构建formula来完成lapply的工作。这在这两种方法中都是可行的,因为每个方法都使用formula对象。
library(speedglm)
check_speedglm <- function(crude, vlist, data, ...){
lapply(seq_along(vlist), function(i)
speedglm(as.formula(paste(crude, "+", paste(vlist[1:i], collapse=" + "))),
data = data, family = binomial())
)
}
check_speedglm(crude = "vs ~ mpg", vlist = c("am", "hp"), data = mtcars)https://stackoverflow.com/questions/58676599
复制相似问题