R——不同R版本中小数点后几位的差值——预测和黄土函数



我注意到在两个不同的R版本中,小数的最后一位有差异。

我在使用以下代码时注意到了这一点

predict(loess(x ~ y, z))

我的x、y和z变量的内容在两个版本中都是相同的。所以这不可能是原因。

这些就是我所看到的不同类型。请注意,最后一个数字总是有区别的:

< 52603 1.94277696545303e-05
> 52603 1.94277696545304e-05
< 52608 2.03530763978453e-05
> 52608 2.03530763978454e-05

我已经检查了以下内容:

  • 黄土函数R页的示例代码(https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/loess)。两个版本之间没有差异
  • 。两个R版本的机器输出相同

这可能是什么原因造成的?或者有人对下一步该检查什么以找出这种差异的原因有建议吗?

以下是我的两个R版本的sessionInfo((结果

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS Linux 8 (Core)
Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so
locale:
[1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8       LC_NAME=C
[9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
other attached packages:
[1] optparse_1.6.4
loaded via a namespace (and not attached):
[1] compiler_3.6.1 tools_3.6.1    getopt_1.20.3

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: openSUSE 12.2 (Mantis) (x86_64)
Matrix products: default
BLAS: /nexus/software/R/Rapp/lib64/R/lib/libRblas.so
LAPACK: /nexus/software/R/Rapp/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8       LC_NAME=C
[9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
other attached packages:
[1] optparse_1.6.0
loaded via a namespace (and not attached):
[1] compiler_3.4.3 getopt_1.20.2

您需要逐步重新检查什么是浮动表示。在R FAQ中的条目7.31(这本身可能是FAQ中最著名的条目(下有一篇(非常著名的(文章,您可以从这里阅读。

从本质上讲,您的数字与您所在计算机的精度是相同的。我们正在使用R所称的numericdouble,它(目前(是一个64位变量,最多允许16位精度。

当看到";"相等";,ε变化,之后我们说";是的,他们是平等的;通常是它的平方根,因为计算会引起舍入误差。

快速演示:

> value <- 1.23456789
> all.equal(value, value + 1e-5)
[1] "Mean relative difference: 8.1e-06"
> all.equal(value, value + 1e-7)
[1] "Mean relative difference: 8.1e-08"
> all.equal(value, value + 1e-9)
[1] TRUE
> 

因此,使用,R可能在优化循环结束时使用,会清楚地将您的上述值标记为相等。这可能看起来有点违背直觉,也有点令人沮丧,但这就是电脑生活。读一遍,再读一遍,";7.31〃;以及参考文献。

最新更新