代码之家  ›  专栏  ›  技术社区  ›  krassowski

如何将'VGAM::cumulative'包装到助手函数中('object not found'问题)?

  •  0
  • krassowski  · 技术社区  · 2 年前

    当我执行以下代码来测试有序logit模型中的比例优势假设时,它工作得很好:

    data = transform(VGAM::pneumo, let=log(exposure.time))
    formula = cbind(normal, mild, severe) ~ let
    
    fit_po = VGAM::vglm(formula, family=VGAM::cumulative(parallel=TRUE, link='logitlink'), data=data)
    fit_h0 = VGAM::vglm(formula, family=VGAM::cumulative(parallel=FALSE, link='logitlink'), data=data)
    VGAM::lrtest(fit_po, fit_h0)
    

    然而,当我试图将其包装成一个helper函数时 log_lr_po_assumption :

    log_lr_po_assumption = function(formula, data, method='logitlink') {
        fit_po = VGAM::vglm(formula, family=VGAM::cumulative(parallel=TRUE, link=method), data=data)
        fit_h0 = VGAM::vglm(formula, family=VGAM::cumulative(parallel=FALSE, link=method), data=data)
        VGAM::lrtest(fit_po, fit_h0)
    }
    log_lr_po_assumption(formula, data)
    

    出现以下故障:

    Error in get(fun.name) : object 'method' not found
    

    为什么会这样?我如何创建一个方便的包装,这将工作?

    1 回复  |  直到 2 年前
        1
  •  0
  •   krassowski    2 年前

    解决此问题的一种方法是使用 do.call (默认情况下 quote=FALSE ):

    log_lr_po_assumption = function(formula, data, method='logitlink') {
        po_family = do.call(VGAM::cumulative, list(parallel=TRUE, link=method))
        np_family = do.call(VGAM::cumulative, list(parallel=FALSE, link=method))
    
        fit_po = VGAM::vglm(formula, family=po_family, data=data)
        fit_h0 = VGAM::vglm(formula, family=np_family, data=data)
        VGAM::lrtest(fit_po, fit_h0)
    }
    

    虽然我相信应该有一个更简单的解决方案。。。

    推荐文章