Как рассчитать коэффициент корреляции, используя R с помощью функции? - PullRequest
0 голосов
/ 14 февраля 2020

Hello! Я пытаюсь написать функцию, выводящую формулу для коэффициента корреляции Пирсона. Я написал следующий код, но когда я пытаюсь передать значения, он возвращает пустой вывод. Пожалуйста, укажите мне на мою ошибку, я невежественен! Очень ценится.

correlation = function(X, Y, n = length(X)){
sum_X = 0
sum_Y = 0
sum_XY = 0
squareSum_X = 0
squareSum_Y = 0
i = 0
while (i < n ) { 
    # sum of elements of array X. 
    sum_X = sum_X + X[i] 

    # sum of elements of array Y. 
    sum_Y = sum_Y + Y[i] 

    # sum of X[i] * Y[i]. 
    sum_XY = sum_XY + X[i] * Y[i] 

    # sum of square of array elements. 
    squareSum_X = squareSum_X + X[i] * X[i] 
    squareSum_Y = squareSum_Y + Y[i] * Y[i] 

    i =+ 1
}
# combine all into a final formula
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)
}

1 Ответ

1 голос
/ 14 февраля 2020

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)))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...