这很奇怪。可能是一个错误。你可能想把它发送到 R 邮件列表,看看他们的想法。作为一种粗略的解决方法,您可以在 R 中重写该函数。这是它的 C 代码,来自 src/library/stats/src/ 中的文件 family.c:
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
}
然后你必须修改任何调用它的函数。