大数字的相关结果错误

Ali*_*Ali 2 r bignum pearson correlation

cor()如果向量中存在极大数字并且仅返回零,则函数无法计算相关值:

foo <- c(1e154, 1, 0)
bar <- c(0, 1, 2)
cor(foo, bar)
# -0.8660254
foo <- c(1e155, 1, 0)
cor(foo, bar)
# 0
Run Code Online (Sandbox Code Playgroud)

虽然1e155非常大,但它比R可以处理的最大数量小得多.令我惊讶的是,为什么R返回错误的值并且没有返回更合适的结果,如NAInf.

有什么理由吗?如何确保我们的计划不会遇到这种情况?

Mat*_*erg 7

Pearson两个变量之间的相关系数定义为两个变量的协方差除以它们的标准偏差的乘积.(来自http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient)

foo <- c(1e154, 1, 0)
sd(foo)
## [1] 5.773503e+153
foo <- c(1e155, 1, 0)
sd(foo)
## [1] Inf
Run Code Online (Sandbox Code Playgroud)

并且,更为根本的是,要计算sd()你需要取x的平方:

1e154^2
[1] 1e+308

1e155^2
[1] Inf
Run Code Online (Sandbox Code Playgroud)

因此,您的数字确实处于可以使用64位计算的边界.

在Windows上使用R-2.15.2我得到:

cor(c(1e555, 1, 0), 1:3)
[1] NaN
Run Code Online (Sandbox Code Playgroud)