Коэффициент корреляции для трех переменных в r - PullRequest
0 голосов
/ 15 февраля 2019

Для трех n-мерных переменных ненулевой дисперсии a, b и c, n> 2, если r (ab), r (bc) и r (ac) - коэффициенты корреляции Пирсона между a и b,между b и c и между a и c соответственно коэффициент корреляции r (abc) среди a, b и c определяется как:

r ^ 2 (abc) = (r ^ 2 (ab) + r ^ 2 (bc) + r ^ 2 (ac)) - (2 xr (ab) xr (bc) xr (ac))

Мне удалось получить код для ручного способаделаю это:

a <- c(4, 6, 2, 7)
b <- c(8, 1, 3, 5)
c <- c(6, 3, 1, 9)

al <- data.frame(a, b, c)
al


ab_cor <- cor(al$a, al$b, method = c("pearson"))
bc_cor <- cor(al$b, al$c, method = c("pearson"))
ac_cor <- cor(al$a, al$c, method = c("pearson"))

abc_cor <- sqrt( ( (ab_cor)^2 + (bc_cor)^2 + (ac_cor)^2 ) - ( 2 * ab_cor * bc_cor * ac_cor) )
abc_cor

Но мне было интересно, можно ли это сделать с меньшим количеством строк кода, например, с циклом for.Кроме того, как бы я написал это так, чтобы я мог сделать это более чем с 3 переменными, например, r (abcd), т.е. r (ab), r (ac), r (ad), r (bc), r(bd) и r (cd).

1 Ответ

0 голосов
/ 15 февраля 2019

Функция cor уже создает матрицу корреляций.Вам просто нужно выбрать соответствующие из них и затем использовать некоторые векторные операции.

cs <- cor(al, method = "pearson")

cs <- cs[upper.tri(cs)]

#sqrt(sum(cs^2)) - 2*prod(cs)
# apparently it's
sqrt(sum(cs^2) - 2*prod(cs))

Это обобщает ваш более крупный случай, а также предполагает, что у вас есть все необходимые переменные в вашем al data.frame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...