我在R中非常环保,所以可能有一个非常简单的解决方案:
我想计算方阵中列向量之间的平均相关性:
x<-matrix(rnorm(10000),ncol=100)
aux<-matrix(seq(1,10000))
loop<-sapply(aux,function(i,j) cov(x[,i],x[,j])
cor_x<-mean(loop)
在评估sapply行时,我得到错误'下标超出界限'。我知道我可以通过脚本来做到这一点,但有没有办法在一行代码中实现这一点?
答案 0 :(得分:6)
不需要任何循环。只需使用mean(cov(x))
,就可以非常有效地执行此操作。
答案 1 :(得分:1)
问题归因于aux
。由于您有aux
列,变量1
的范围必须从100
到100
。但是,aux
是x
的行的序列,因此范围从1
到10000
。它将使用以下代码:
aux <- seq(1, 100)
loop <- sapply(aux, function(i, j) cov(x[, i], x[, j]))
之后,您可以使用以下方法计算平均协方差:
cor_x <- mean(loop)
如果要排除重复字段(例如,cov(X,Y)本质上与cov(Y,X)相同),您可以使用:
cor_x <- mean(loop[upper.tri(loop, diag = TRUE)])
如果你还想排除cov(X,X),即方差,你可以使用:
cor_x <- mean(loop[upper.tri(loop)])