R - это язык с 1 индексом. Начните с i = 1
и измените на while(i <= n)
(и исправьте счетчик итераций, как отмечено в комментариях: i = i + 1
. Тогда ваша функция работает правильно.
n <- 100
x <- rnorm(n)
y <- rnorm(n)
round(correlation(x, y), 4) == round(cor(x, y), 4) # TRUE
Обратите внимание, что R также отлично подходит для векторизованных операций, и вы можете вообще пропустить явное l * 1012. * что-то вроде этого является шагом к повышению эффективности:
correlation2 <- function(X, Y){
n <- length(X)
sum_X <- sum(X)
sum_Y <- sum(Y)
sum_XY <- sum(X * Y)
squareSum_X <- sum(X * X)
squareSum_Y <- sum(Y * Y)
final <- (n * sum_XY - (sum_X * sum_Y)) / (sqrt((n * squareSum_X - sum_X * sum_X)* (n * squareSum_Y - sum_Y * sum_Y)))
return (final)
}
round(correlation2(x, y), 4) == round(cor(x, y), 4) # TRUE
Или даже просто:
correlation3 <- function(X, Y){
n = length(X)
sum_x = sum(X)
sum_y = sum(Y)
(n * sum(X * Y) - sum_x * sum_y) /
(sqrt((n * sum(x^2) - sum_x^2) * (n * sum(Y^2) - sum_y^2)))
}