【问题标题】:lapply, glm, and speedglm inside a function: argument "data" is missing, with no default函数内的 lapply、glm 和 speedglm:缺少参数“数据”,没有默认值
【发布时间】:2019-11-03 00:59:57
【问题描述】:

我正在使用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,数据 = 数据, drop.unused.levels = TRUE) : 参数“data”丢失,没有 默认。

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

【问题讨论】:

    标签: r lapply glm speedglm


    【解决方案1】:

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

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

    根据update 文档,

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

    主要论点:

    object, x:模型函数的现有拟合,例如 lmglm 和许多其他函数

    因此,如果speedglm 存储用于捕获公式、数据和其他参数的调用,并且类似于glm(继承自lm 类)的返回对象结构,那么update 将起作用。


    要解决此问题,请考虑通过使用lapply 使用迭代模型调用动态构建formula 来执行update 所做的事情。这在两种方法中都适用,因为每种方法都使用 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)
    

    【讨论】:

    • 非常感谢您的详细解释!对我的工作有很大帮助。 system timeglm 的 581.94 秒减少到 speedglm 的 13.21 秒。
    • 有趣!很高兴听到并很高兴我能提供帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2021-09-17
    • 1970-01-01
    • 2019-07-03
    • 2016-06-08
    相关资源
    最近更新 更多