2013-09-25 25 views
5

Tôi đang cố gắng sử dụng chức năng mô hình lồng ghép thành công của các loài chim bằng cách sử dụng logistic exposure link function.Lỗi khi sử dụng .Call() trong R 3.0. +

Khi tôi chạy chức năng này bằng cách sử dụng mã ví dụ nêu trên trong R 3.0.0 hoặc 3.0.1, tôi nhận được lỗi:

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

Tuy nhiên, nó hoạt động tốt trong R 2.15.3.

Tôi muốn tính năng này hoạt động trong các phiên bản R mới hơn, vì tôi sử dụng chúng để phân tích thêm các đầu ra. Nếu bất cứ ai có bất cứ đề nghị, cách giải quyết hoặc sửa chữa, tôi vui vẻ thử chúng.

Trả lời

3

Đây không phải là lỗi kỹ thuật, vì hàm sử dụng hàm nội bộ có vị trí giờ đây đã thay đổi. Tôi có một ví dụ làm việc về điều này được đăng tại https://rpubs.com/bbolker/logregexp ... phím đang thay đổi logit_mu_eta thành stats:::C_logit_mu_eta như dưới đây. Tất nhiên, điều này sẽ vẫn còn mong manh đối với những thay đổi trong tương lai trong nội bộ ...

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

Với dữ liệu trò chuyện trong 'SAS' chặn là 2.6973. Với chức năng 'R' cũ, đánh chặn cũng là 2.6973. Tuy nhiên, với hàm 'R' mới này, đánh chặn là 2.747 khi sử dụng' parastat + patsize'. Tôi sẽ xem xét lại vào ngày mai. –

+0

Tôi vẫn nhận được 2.747 nếu tôi chỉ cần chèn '.Call (số liệu thống kê ::: C_logit_mu_eta, eta, PACKAGE =" stats ")' vào hàm cũ. Tôi tự hỏi liệu điều này có nghĩa là 'C_logit_mu_eta' đã thay đổi không? Nhưng tôi cần quay lại vào ngày mai. –

+0

bạn có thể đăng liên kết đến dữ liệu trò chuyện (hoặc một số ví dụ khác có thể tái tạo) không? Liên kết trên đã chết ... –

0

Thật kỳ quặc. Có thể là một lỗi. Bạn có thể muốn gửi nó đến danh sách gửi thư R và xem họ nghĩ gì. Là một workaround thô, bạn có thể viết lại hàm trong R. Đây là mã C cho nó, từ các tập tin family.c trong src/thư viện/stats/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 được định nghĩa là 30. Vì vậy, có vẻ như bạn có thể thay thế cuộc gọi bên ngoài bằng chức năng này:

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

Sau đó, bạn phải sửa đổi bất kỳ chức năng nào đang gọi điều này.