2013-09-25 11 views
5

Próbuję użyć funkcji modelującej sukces gniazdowania ptaków przy użyciu logistic exposure link function.Błąd przy użyciu funkcji .Call() w wersji R 3.0. +

Kiedy uruchomić tę funkcję przy użyciu kodu w powyższym przykładzie R 3.0.0 lub 3.0.1, pojawia się błąd:

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

Jednak to działa dobrze w R 2.15.3.

Chciałbym, aby to działało w nowszych wersjach R, ponieważ używam ich do dalszej analizy wyników. Jeśli ktokolwiek ma jakieś sugestie, obejścia lub poprawki, z chęcią ich wypróbuję.

Odpowiedz

3

Nie jest to technicznie błąd, ponieważ funkcja użyła funkcji wewnętrznej, której lokalizacja została zmieniona. Mam działający przykład tego na https://rpubs.com/bbolker/logregexp ... klucz zmienia logit_mu_eta na stats:::C_logit_mu_eta jak poniżej. Oczywiście nadal będzie to kruchy wpływ na przyszłe zmiany w urządzeniach wewnętrznych ...

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

Przy danych z czatu w "SAS" punkt przecięcia wynosi 2,6973. Ze starą funkcją "R" przechwycono również 2.6973. Jednak z tą nową funkcją 'R' przechwycenie wynosi 2.747 przy użyciu' parastat + patsize'. Jeszcze jutro przyjrzę się innym. –

+0

Nadal dostaję 2.747, jeśli po prostu wstawię '.Call (stats ::: C_logit_mu_eta, eta, PACKAGE =" stats ")' do starej funkcji. Zastanawiam się, czy to oznacza, że ​​zmieniło się 'C_logit_mu_eta'? Ale muszę do tego wrócić jutro. –

+0

Czy możesz zamieścić link do danych czatu (lub inny przykład odtwarzalny)? Powyższy link jest martwy ... –

0

To dziwne. Może to być błąd. Możesz wysłać to na listę mailingową R i zobaczyć, co myślą. Jako surowy obejście, można przepisać tę funkcję w R. Oto kod C do niej, z family.c plików w src/Library/statystyki/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 określa się 30. Wygląda na to, że można zastąpić wywołanie zewnętrzne tą funkcją:

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

Następnie należy zmodyfikować dowolną funkcję, która to wywołuje.