R函数跨设备出现警告报错:In regularize.values折叠唯一x值求助
先给你拆解下这个警告的核心:它来自base包stats里的regularize.values函数,一般是在插值类操作(比如approx、spline)或者依赖插值的统计方法中触发的——当输入的x值存在重复时,函数会自动合并这些重复值来继续处理。现在同一代码在两台机器表现不同,更新R版本后警告还在,给你整理几个可以一步步排查的方向:
先排查输入数据的细微差异:
别以为数据完全一样就没问题!Linux和Windows的浮点数计算/存储精度有差异,或者数据导入时的编码、换行符不同,都可能导致出现重复的x值。你可以在两台机器上跑all.equal(你的输入数据对象)对比,或者直接检查数据里的重复值:anyDuplicated(你的x变量);要是是浮点型变量,记得用dplyr::near()来判断近似相等的情况——毕竟浮点型的“重复”可能是精度误差导致的。核对依赖包的版本与底层依赖:
虽然你对比了sessionInfo里的包版本,但有些间接依赖的细节可能被忽略?比如你用到的frailtySurv、coxme这些包,哪怕版本号一样,底层调用的BLAS/LAPACK库差异也可能影响计算结果(你看两台机器的BLAS实现就不一样:Linux用的是R自带的,Windows是系统默认的)。你可以尝试在有警告的机器上临时切换BLAS库(比如用openBLAS)再测试,或者逐个确认关键包的安装版本是否完全一致(比如用packageVersion("survival")对比)。精准定位警告的触发位置:
你可以把警告强制转为错误来追踪根源:先跑options(warn=2),然后再运行你的代码,触发报错后用traceback()或者debugger()查看调用栈,就能知道到底是你的代码里哪一步,还是某个包的内部函数调用了regularize.values,这样就能针对性排查问题。检查系统环境与locale的影响:
两台机器的操作系统、locale设置都不一样(CentOS用UTF-8编码,Windows用1252),这可能影响数据读取或者计算逻辑。你可以在Linux机器上临时设置LC_ALL=C再运行代码,看看警告会不会消失——有时候locale的差异会导致字符转数值时出现细微偏差,进而引发重复值问题。构造最小可复现示例测试:
把你的模拟代码简化到能触发警告的最小程度,去掉所有无关的步骤,然后在两台机器上运行这个简化版。如果简化版能复现差异,那问题就更容易定位;如果不能,说明是模拟过程中随机因素或者大数据量下的累积误差导致的。
两台电脑的Session信息
1. 出现警告的电脑(CentOS Linux 7)
sessionInfo() R version 3.6.3 (2020-02-29) Platform: x86_64-pc-linux-gnu (64-bit) Running under: CentOS Linux 7 (Core) Matrix products: default BLAS: /usr/local/R-3.6.3/lib64/R/lib/libRblas.so LAPACK: /usr/local/R-3.6.3/lib64/R/lib/libRlapack.so locale: [1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C [3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=fr_FR.UTF-8 [5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8 [7] LC_PAPER=fr_FR.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] boot_1.3-24 lme4_1.1-21 Matrix_1.2-18 frailtySurv_1.3.6 [5] coxme_2.2-16 bdsmatrix_1.3-4 survival_3.1-11 statmod_1.4.34 loaded via a namespace (and not attached): [1] Rcpp_1.0.4 nloptr_1.2.2.1 pillar_1.4.3 compiler_3.6.3 plyr_1.8.6 [6] tools_3.6.3 lifecycle_0.2.0 tibble_2.1.3 nlme_3.1-145 gtable_0.3.0 [11] lattice_0.20-40 pkgconfig_2.0.3 rlang_0.4.5 rstudioapi_0.11 Bolstad2_1.0-28 [16] dplyr_0.8.5 stringr_1.4.0 grid_3.6.3 tidyselect_1.0.0 glue_1.3.2 [21] R6_2.4.1 minqa_1.2.4 ggplot2_3.3.0 purrr_0.3.3 reshape2_1.4.3 [26] magrittr_1.5 scales_1.1.0 splines_3.6.3 MASS_7.3-51.5 assertthat_0.2.1 [31] colorspace_1.4-1 nleqslv_3.3.2 numDeriv_2016.8-1.1 stringi_1.4.6 munsell_0.5.0 [36] crayon_1.3.4
2. 无警告的电脑(Windows 7)
sessionInfo() R version 3.5.1 (2018-07-02) Platform: i386-w64-mingw32/i386 (32-bit) Running under: Windows 7 x64 (build 7601) Service Pack 1 Matrix products: default locale: [1] LC_COLLATE=French_France.1252 LC_CTYPE=French_France.1252 [3] LC_MONETARY=French_France.1252 LC_NUMERIC=C [5] LC_TIME=French_France.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] boot_1.3-24 lme4_1.1-21 Matrix_1.2-18 frailtySurv_1.3.6 [4] coxme_2.2-16 bdsmatrix_1.3-4 survival_3.1-11 statmod_1.4.34 loaded via a namespace (and not attached): [1] minqa_1.2.4 R6_2.4.1 splines_3.5.1 Bolstad2_1.0-28 scales_1.1.0 [6] assertthat_0.2.1 grid_3.5.1 stringr_1.4.0 nleqslv_3.3.2 numDeriv_2016.8-1.1 [11] tidyselect_1.0.0 munsell_0.5.0 pillar_1.4.3 compiler_3.5.1 tibble_2.1.3 [16] lattice_0.20-35 pkgconfig_2.0.3 purrr_0.3.3 rstudioapi_0.11 ggplot2_3.3.0 [21] MASS_7.3-50 plyr_1.8.6 glue_1.3.2 stringi_1.4.6 magrittr_1.5 [26] reshape2_1.4.3 gtable_0.3.0 rlang_0.4.5 colorspace_1.4-1 yaml_2.2.1 [31] tools_3.5.1 lifecycle_0.2.0 dplyr_0.8.5 nloptr_1.2.2.1 nlme_3.1-137 [36] crayon_1.3.4 Rcpp_1.0.4
内容的提问来源于stack exchange,提问作者Flora Grappelli

