大数字的相关结果错误

时间:2013-01-15 14:31:57

标签: r correlation bignum pearson

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

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

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

1 个答案:

答案 0 :(得分: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

而且,更为根本的是,要计算sd(),您需要采用x的平方:

1e154^2
[1] 1e+308

1e155^2
[1] Inf

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

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

cor(c(1e555, 1, 0), 1:3)
[1] NaN