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返回错误的值并且没有返回更合适的结果,例如NA
或Inf
。
有什么理由吗?如何确保我们的计划不会遇到这种情况?
答案 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