【问题标题】:lazyeval not finding `C_logit_link` when using binomial in the glm function在 glm 函数中使用二项式时,lazyeval 找不到“C_logit_link”
【发布时间】:2017-03-11 17:00:55
【问题描述】:

我真的在这里摸不着头脑。我真的不明白发生了什么。这是一个 MWE,但实际代码和目的比这更复杂。所以代码:

library(dplyr)
ds <- mutate(iris, Species = as.numeric(Species == 'setosa'))

ds %>%
    do_(
        .dots = lazyeval::interp(
            "broom::tidy(stats::glm(form, data = ., family = distr))",
            form = Species ~ Sepal.Length,
            distr = binomial()
        )
    )

返回:Error in family$linkfun(mustart) : object 'C_logit_link' not found ...但此代码位工作正常:

ds %>%
    do_(
        .dots = lazyeval::interp(
            "broom::tidy(stats::glm(form, data = ., family = distr))",
            form = Sepal.Width ~ Sepal.Length,
            distr = gaussian()
        )
    )

两者之间的唯一区别是使用的族分布(高斯与二项式)和使用的变量。

那么问题来了:为什么lazyeval 找不到C_logit_link

【问题讨论】:

    标签: r lazy-evaluation lazyeval


    【解决方案1】:

    当您调用interp(x, *) 时,它会计算要插入x 的参数。在binomial() 的情况下,结果是一个表示 GLM 中二项式分布的结构。

    interp(~x, x=binomial())
    
    #~list(family = "binomial", link = "logit", linkfun = function (mu) 
    #.Call(C_logit_link, mu), linkinv = function (eta) 
    #.Call(C_logit_linkinv, eta), variance = function (mu) 
    #mu * (1 - mu), dev.resids = function (y, mu, wt) 
    #.Call(C_binomial_dev_resids, y, mu, wt), aic = function (y, n, 
    #    mu, wt, dev) 
    #{
    #    m <- if (any(n > 1)) 
    #    . . .
    

    隐藏在该结构中的是一个函数,它通过对象C_logit_link 调用已编译的 C 代码。这是 stats 包中未导出的对象。通常一切正常,因为该函数的环境是 stats 命名空间,因此它能够找到C_logit_link

    这里的问题是你插入的对象是一个字符串,这意味着插入它的所有东西也被强制转换成一个字符串。这会丢失查找C_logit_link 所需的环境信息。

    解决方案是改为插入公式:

    library(dplyr)
    ds <- mutate(iris, Species = as.numeric(Species == 'setosa'))
    
    ds %>%
        do_(
            .dots = lazyeval::interp(
                ~broom::tidy(stats::glm(form, data = ., family = distr)),  # formula
                form = Species ~ Sepal.Length,
                distr = binomial()
            )
        )
    
    #          term  estimate std.error statistic      p.value
    #1  (Intercept) 27.828521 4.8275611  5.764509 8.189574e-09
    #2 Sepal.Length -5.175698 0.8933984 -5.793270 6.902910e-09
    

    【讨论】:

    • 嗯,令人着迷。这解决了我的问题!谢谢:)
    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多