2016-04-19 6 views
1

Как бы вы создали функцию, которая вручную вычисляет корреляцию pearson в r. Я знаю, что есть нативная функция, называемая cor, но что, если я хочу применить приведенное ниже уравнение в R к каждой комбинации столбцов в кадре данных, как бы я это сделал?Ручная корреляция pearson в r

enter image description here

Я хотел бы знать, как, но я считаю, что это требует много для петель, вложенных друг в друга для петель и т.д., чтобы это произошло, и я не так силен в программировании пока. Надеюсь, кто-то попытается так научиться, как новичок, как я. Благодаря

Пример:

set.seed(1) 
    DF = data.frame(V1 = rnorm(10), V2=rnorm(10), V3=rnorm(10), V4=rnorm(10)) 

    #  V1 V2 V3 V4 
    # V1 1.00 -0.38 -0.72 -0.24 
    # V2 -0.38 1.00 0.60 0.18 
    # V3 -0.72 0.60 1.00 0.08 
    # V4 -0.24 0.18 0.08 1.00 
+1

не требуется никаких петель. Вы можете рассчитать sigmaX как сумму (X) и sigmaXY как сумму (X * Y) и построить все уравнение вверх –

+0

, пожалуйста, дайте нам воспроизводимый пример ввода и ожидаемый результат – Pasqui

ответ

4

Сначала написать вспомогательную функцию для вычисления ковариации:

v <- function(x,y=x) mean(x*y) - mean(x)*mean(y) 

Затем использовать для вычисления корреляции:

my_corr <- function(x,y) v(x,y)/sqrt(v(x) * v(y)) 

Вот быстро проверить, что оно правильно работает:

> my_corr(DF$V1, DF$V2) 
[1] -0.3767034 
> cor(DF$V1, DF$V2) 
[1] -0.3767034 

Обратите внимание, что вычисление корреляции таким образом является численно неустойчивым.

EDIT:

Чтобы применить его ко всем комбинаций столбцов, используйте outer:

> outer(DF, DF, Vectorize(my_corr)) 

        V1 V2 V3 V4 
      # V1 1.00 -0.38 -0.72 -0.24 
      # V2 -0.38 1.00 0.60 0.18 
      # V3 -0.72 0.60 1.00 0.08 
      # V4 -0.24 0.18 0.08 1.00 
+0

Не работает, когда я вставляю свои data frame my_corr (DF) 'Помните, что это ** фрейм данных **, где функция должна работать не на векторах. – janman

+0

Но здесь вы определяете свои столбцы с помощью $, функция должна быть обобщена так, чтобы находить столбцы самостоятельно. Что делать, если у вас есть 100 столбцов? Как бы вы могли написать эту функцию? – janman

0

Ну. Вам не нужно делать это «вручную», вы просто использовать ....

cor(DF) 

... который вычисляет г для всех комбинаций столбцов.

Смежные вопросы