Неверный результат корреляции для больших чисел

Функция 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.

Есть ли причина для этого? Как быть уверенным, что мы не столкнемся с такой ситуацией в наших программах?


person Ali    schedule 15.01.2013    source источник
comment
Какую версию R вы используете?   -  person Andrie    schedule 15.01.2013


Ответы (1)


Коэффициент корреляции Пирсона между двумя переменными определяется как ковариация двух переменных, деленная на произведение их стандартных отклонений. (из 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 бит.

Используя R-2.15.2 в Windows, я получаю:

cor(c(1e555, 1, 0), 1:3)
[1] NaN
person Matthew Lundberg    schedule 15.01.2013
comment
Чтобы быть разборчивым, вам не нужно вычислять квадрат х, вам нужно вычислить квадрат х - среднее (х). (Не то, что помогает здесь) - person hadley; 16.01.2013