As of r87537, binomial()$linkinv no longer accepts integer arguments. binomial()$linkinv(1.0) ## 0.7310586 binomial()$linkinv(1L) Error in binomial()$linkinv(1L) : REAL() can only be applied to a 'numeric', not a 'integer' Since R is usually so permissive/sloppy with the distinction between integers and numeric/doubles, I'd argue that this is a bug ... (This came up because it happens to break lme4's tests.) I haven't done the archaeology to figure out when this broke/exactly what change in the R code base broke it: it happened within the last month or so and it's certainly something upstream of the linkinv function itself, as (according to 'git blame') nothing in that function has changed in the last 4 years ... (if it were of interest I could 'git bisect' to figure it out but maybe someone will save me the trouble ...) Thoughts, insights? Should I post this to r-bugzilla? Or suck it up and accept it as the new reality? cheers Ben Bolker ===binomial()$linkinv is: function (eta) .Call(C_logit_linkinv, eta) <environment: namespace:stats> Here is the body of the function in C code: https://github.com/r-devel/r-svn/blob/195ab0870a8131d01492f8f1d3a2ad514bc7e040/src/library/stats/src/family.c#L72C1-L89C2 SEXP logit_linkinv(SEXP eta) { SEXP ans = PROTECT(shallow_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], tmp; tmp = (etai < MTHRESH) ? DBL_EPSILON : ((etai > THRESH) ? INVEPS : exp(etai)); rans[i] = x_d_opx(tmp); } UNPROTECT(1); return ans; }
Ivan Krylov
2025-Jan-08 16:20 UTC
[Rd] binomial()$linkinv no longer accepts integer values
On Wed, 8 Jan 2025 10:57:47 -0500 Ben Bolker <bbolker at gmail.com> wrote:> I haven't done the archaeology to figure out when this broke/exactly > what change in the R code base broke it: it happened within the last > month or sobinomial() itself exhibits this property even in R-4.2.2 from more than two years ago: R -q -s -e 'getRversion(); binomial()$linkinv(1L)' # [1] ?4.2.2? # Error in binomial()$linkinv(1L) : # REAL() can only be applied to a 'numeric', not a 'integer' It's the `etas` [1] that suddenly became integer due to a change in seq.int(): R -q -s -e 'str(seq.int(-8, 8, by=1))' # num [1:17] -8 -7 -6 -5 -4 -3 -2 -1 0 1 ... R-devel -q -s -e 'str(seq.int(-8, 8, by=1))' # int [1:17] -8 -7 -6 -5 -4 -3 -2 -1 0 1 ... -- Best regards, Ivan [1] https://github.com/lme4/lme4/blob/54c54a320c23b34fea2f7e613928d1ebe7a3fd37/tests/testthat/test-glmFamily.R#L10C5-L10C25