2

如果向量中有非常大的数字,则该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 返回错误的值并且没有返回更合适的结果,例如NAor Inf

有什么理由吗?如何确保我们的程序不会遇到这样的情况?

4

1 回答 1

7

两个变量之间的皮尔逊相关系数定义为两个变量的协方差除以其标准差的乘积。(来自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
于 2013-01-15T14:39:01.437 回答