5

我正在尝试使用一个函数,该函数使用逻辑暴露链接函数模拟鸟类的嵌套成功。

当我在 R 3.0.0 或 3.0.1 中使用上面的示例代码运行此函数时,我收到错误:

Error in .Call("logit_mu_eta", eta, PACKAGE = "stats") : 
  "logit_mu_eta" not available for .Call() for package "stats"

但是,它在 R 2.15.3 中运行良好。

我希望它可以在更新版本的 R 中工作,因为我使用它们来进一步分析输出。如果有人有任何建议、解决方法或更正,我很乐意尝试。

4

2 回答 2

3

这在技术上不是一个错误,因为该函数使用了一个内部函数,该函数的位置现已更改。我在https://rpubs.com/bbolker/logregexp上发布了一个工作示例……关键更改logit_mu_eta如下stats:::C_logit_mu_eta。当然,这对于内部结构的未来变化仍然很脆弱......

logexp <- function(exposure = 1)
{
    linkfun <- function(mu) qlogis(mu^(1/exposure))
    ## FIXME: is there some trick we can play here to allow
    ##   evaluation in the context of the 'data' argument?
    linkinv <- function(eta)  plogis(eta)^exposure
    mu.eta <- function(eta) exposure * plogis(eta)^(exposure-1) *
      .Call(stats:::C_logit_mu_eta, eta, PACKAGE = "stats")
    valideta <- function(eta) TRUE
    link <- paste("logexp(", deparse(substitute(exposure)), ")",
                   sep="")
    structure(list(linkfun = linkfun, linkinv = linkinv,
                   mu.eta = mu.eta, valideta = valideta, 
                   name = link),
              class = "link-glm")
}
于 2013-09-25T17:21:54.127 回答
0

这很奇怪。可能是一个错误。你可能想把它发送到 R 邮件列表,看看他们的想法。作为一种粗略的解决方法,您可以在 R 中重写该函数。这是它的 C 代码,来自 src/library/stats/src/ 中的文件 family.c:

SEXP logit_mu_eta(SEXP eta)
{
    SEXP ans = PROTECT(duplicate(eta));
    int i, n = LENGTH(eta);
    double *rans = REAL(ans), *reta = REAL(eta);

    if (!n || !isReal(eta))
    error(_("Argument %s must be a nonempty numeric vector"), "eta");
    for (i = 0; i < n; i++) {
    double etai = reta[i];
    double opexp = 1 + exp(etai);

    rans[i] = (etai > THRESH || etai < MTHRESH) ? DOUBLE_EPS :
        exp(etai)/(opexp * opexp);
    }
    UNPROTECT(1);
    return ans;
}

THRESH定义为 30。所以看起来你可以用这个函数替换外部调用:

logit_mu_eta<-function(x){
  ex<-exp(x)
  ans<-ex/(1+ex)^2
  ans[abs(x)>30]<-.Machine$double.eps
  ans
}

然后你必须修改任何调用它的函数。

于 2013-09-25T17:06:51.943 回答