簡體   English   中英

在glm函數中使用二項式時,lazyeval找不到`C_logit_link`

[英]lazyeval not finding `C_logit_link` when using binomial in the glm function

我真的在這里撓頭。 我真的不明白發生了什么。 這是一個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

當您調用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM