2013-09-25 49 views
5

我试图使用一个函数来模拟使用logistic exposure link function的鸟的嵌套成功。在R 3.0中使用.Call()时出错+

当我中的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中工作,因为我使用这些来进一步分析输出。如果任何人有任何建议,解决方法或更正,我会很乐意尝试。

回答

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") 
} 
+0

随着聊天数据在'SAS'截距是2.6973。有了旧的“R”功能,拦截也是2.6973。然而,在使用'parastat + patsize'时,使用这个新的'R'函数截取值为2.747。明天我会再看一次。 –

+0

如果我只是在旧函数中插入'.Call(stats ::: C_logit_mu_eta,eta,PACKAGE =“stats”)',我仍然会得到2.747。我想知道这是否意味着'C_logit_mu_eta'已经改变了?但我明天需要回来。 –

+0

你能发布一个链接到聊天数据(或其他可重复使用的例子)吗?上面的链接已经死了... –

0

这很奇怪。可能是一个错误。您可能希望将其发送到R邮件列表并查看他们的想法。作为原油的解决方法,你可以重写功能R.下面是它的C代码,从文件family.c在SRC /库/统计/ src目录/:

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 
} 

那么你就必须修改任何函数调用此。