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
-
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
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