Operaciones básicas en R dando resultados diferentes en Windows y Linux

4 minutos de lectura

Avatar de usuario de Rai
Rai

He estado ejecutando un código en R y, mientras realizaba pruebas, me di cuenta de que los resultados eran diferentes en Windows y Linux. He tratado de entender por qué sucede esto, pero no pude encontrar una respuesta. Ilustrémoslo con un ejemplo:

Estos son algunos valores codificados para la reproducibilidad, siempre a partir de un entorno limpio. He comprobado que la representación de bits de estos valores es exactamente la misma en las máquinas Windows y Linux:

data <- structure(list(x = c(0.1, 0.1, 0.1, 5, 5, 5, 10, 10, 10, 20, 20, 20), 
                       y = c(0.013624804, 0.014023006, 0.013169554, 0.70540352, 
                             0.68711807, 0.69233506, 1.4235181, 1.348244, 1.4141854, 2.779813, 
                             2.7567347, 2.7436437)), class = c("data.frame"), row.names = c(NA, 12L))
val <- c(43.3065849160736, 0.00134925463859564, 1.03218302435548, 270.328323775978)
theta <- 1.60812569803848
init <- c(b0 = 2.76836653333333, b1 = 0.0134350095, b2 = 2.15105945932773, 
          b3 = 6.85922519794374)

Ahora defino una nueva variable W que nuevamente es exactamente igual en representación de bits en Windows y Linux:

f <- function(X, b0, b1, b2, b3) {
  b0 + (b1 - b0) / (1 + exp(b2*(log(X) - log(b3))))
}

W <- 1 / f(data$x, val[1], val[2], val[3], val[4])^theta

Y finalmente aplico un optim función:

SSw <- function(Y, X, b0, b1, b2, b3, w) {
  sum(w * (Y - f(X, b0, b1, b2, b3))^2)
}

SSw.vec <- function(par) SSw(data$y, data$x, par[1], par[2], par[3], par[4], W)

mod <- optim(init, SSw.vec, method = "L-BFGS-B", lower = c(-Inf,-Inf,-Inf,0))

print(mod$par)
# In Windows it returns:
#          b0           b1           b2           b3 
# 3.097283e+01 1.831543e-03 1.047613e+00 1.842448e+02
# In Linux it returns: 
#           b0           b1           b2           b3 
# 3.459241e+01 1.530134e-03 1.040363e+00 2.101996e+02 

Como puede ver, las diferencias son bastante significativas, pero incluso si no lo fueran… ¿por qué hay diferencias?

¡Cualquier ayuda será muy apreciada!

Editar

Aquí agrego el sessionInfo() tanto en Windows como en Linux.

En Windows:

R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19045)

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252    LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                            LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.8.3        plyr_1.8.6          cellranger_1.1.0    compiler_3.6.3      pillar_1.7.0        nloptr_1.2.2.2      tools_3.6.3        
 [8] bit_4.0.4           boot_1.3-24         lme4_1.1-29         lifecycle_1.0.0     tibble_3.1.7        nlme_3.1-144        gtable_0.3.0       
[15] lattice_0.20-38     pkgconfig_2.0.3     rlang_1.0.2         Matrix_1.2-18       cli_3.4.1           rstudioapi_0.11     dplyr_1.0.6        
[22] generics_0.1.0      vctrs_0.3.8         lmerTest_3.1-3      grid_3.6.3          tidyselect_1.1.1    glue_1.4.2          R6_2.4.1           
[29] fansi_0.4.1         readxl_1.3.1        minqa_1.2.4         ggplot2_3.3.6       purrr_0.3.5         magrittr_1.5        scales_1.1.1       
[36] ellipsis_0.3.2      MASS_7.3-51.5       splines_3.6.3       colorspace_1.4-1    numDeriv_2016.8-1.1 renv_0.13.2         utf8_1.1.4         
[43] munsell_0.5.0       crayon_1.3.4       

En Linux:

R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 10 (buster)

Matrix products: default
BLAS:   /opt/r/lib/R/lib/libRblas.so
LAPACK: /opt/r/lib/R/lib/libRlapack.so

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
 [4] LC_COLLATE=C           LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
[10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.6.3 tools_3.6.3    renv_0.13.2   

  • No puedo reproducir la diferencia, obtengo los resultados de Windows en Linux (R-4.2.2) y win11 (R-4.2.2).

    – r2evans

    13 de febrero a las 1:14


  • Probablemente los dos sistemas utilicen diferentes bibliotecas BLAS. Desafortunadamente, Windows no informa la versión de BLAS en la sexta línea como lo hace Windows. De todos modos, intentaría actualizar/reinstalar BLAS en su sistema Debian, ya que creo que sus resultados de Linux son defectuosos (obtenga los mismos resultados que @ r2evans). Pero primero asegúrese de actualizar R y probablemente también RStudio en ambos sistemas, está usando versiones bastante desactualizadas (en Linux recomiendo usar un Estudio diario).

    – jay.sf

    13 de febrero a las 8:44

  • He probado con diferentes bibliotecas BLAS en Debian como se indica aquípero siempre obtengo los mismos resultados, así que no estoy completamente seguro de que se deba a las diferencias en las bibliotecas BLAS… Además, no puedo actualizar R debido al control de versiones (y no uso RStudio ya que ejecuta las cosas desde la terminal),

    – Rai

    14 de febrero a las 23:44

  • Por favor actualice sessionInfo() en su pregunta (también tal vez la de Windows desde una sesión nueva sin espacios de nombres adicionales).

    – jay.sf

    15 de febrero a las 9:03

  • Con control = list(parscale = abs(init)) Obtengo resultados diferentes a los anteriores, pero siguen siendo sustancialmente diferentes entre backends en Fedora y diferentes en Buster

    – shh

    17 de febrero a las 16:45

  • Mmmm, interesante. Lo siguiente que haría sería (1) definir un gradiente de diferencia automática e (2) inspeccionar la superficie de bondad de ajuste para determinar si es plana/múltiples mínimos…

    – Ben Bolker

    17 de febrero a las 18:49

  • Quiero decir que lo que finalmente tenemos aquí son datos con una relación extremadamente lineal (R^2 = 0.9996). Entonces, lo que estamos viendo es que si llena una función con parámetros, hay múltiples combinaciones de parámetros que se aproximan a una línea recta de manera similar.

    – shh

    17 de febrero a las 20:49

¿Ha sido útil esta solución?