2013-09-25 26 views
5

Sto tentando di utilizzare una funzione che modella il successo di annidamento degli uccelli utilizzando un logistic exposure link function.Errore nell'uso di .Call() in R 3.0. +

Quando ho eseguito questa funzione utilizzando il codice di esempio di cui sopra nella R 3.0.0 o 3.0.1, ottengo l'errore:

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

Tuttavia, funziona benissimo in R 2.15.3.

Mi piacerebbe che funzioni in versioni più recenti di R, poiché li uso per ulteriori analisi delle uscite. Se qualcuno ha suggerimenti, soluzioni alternative o correzioni, li proverei volentieri.

risposta

3

Questo non è tecnicamente un bug, poiché la funzione ha utilizzato una funzione interna la cui posizione è ora cambiata. Ho un esempio funzionante di questo pubblicato a https://rpubs.com/bbolker/logregexp ... la chiave sta cambiando logit_mu_eta a stats:::C_logit_mu_eta come di seguito. Naturalmente, questo sarà ancora fragile per i cambiamenti futuri negli interni ...

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

Con i dati della chat in 'SAS' l'intercetta è 2.6973. Con la vecchia funzione 'R' l'intercetta era anche 2.6973. Tuttavia, con questa nuova funzione 'R' l'intercetta è 2.747 quando si usa' parastat + patsize'. Domani darò un'altra occhiata. –

+0

Ottengo ancora 2.747 se inserisco semplicemente '.Call (stats ::: C_logit_mu_eta, eta, PACKAGE =" stats ")' nella vecchia funzione. Mi chiedo se questo significa che "C_logit_mu_eta' è cambiato? Ma ho bisogno di tornare a questo domani. –

+0

puoi pubblicare un link ai dati della chat (o qualche altro esempio riproducibile)? Il link sopra è morto ... –

0

Questo è strano. Potrebbe essere un bug. Potresti voler inviare questo alla mailing list di R e vedere cosa ne pensano. Per risolvere il problema greggio, si potrebbe riscrivere quella funzione in R. Ecco il codice C per esso, dal file family.c in src/library/statistiche/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 è definito per essere 30. Quindi sembra che si potrebbe sostituire la chiamata esterna con questa funzione:

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

Allora dovreste modificare qualsiasi funzione sta chiamando questo.