2013-09-25 78 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 
} 

那麼你就必須修改任何函數調用此。