对于三个n维非零方差变量a,b和c,n> 2,如果 r(ab),r(bc)和r(ac)分别是a和b之间,b和c之间以及a和c之间的皮尔逊相关系数,然后是a,b和之间的相关系数r(abc) 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)。
答案 0 :(得分:2)
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中想要的所有变量。