2014-01-31 60 views
2

lapply功能我R中很环保,所以有可能是一个非常简单的解决办法是:2个计数变量

我要计算一个方阵的列向量之间的平均相关性:

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行时,我得到错误'下标越界'。我知道我可以通过脚本来做到这一点,但有什么办法可以在一行代码中实现这一点?

回答

1

问题归因于aux。由于您有100列,因此变量aux必须从1100。但是您的aux是沿x的序列,因此范围从110000。它将与下面的代码工作:

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)]) 
6

不需要任何循环。只需使用mean(cov(x)),这非常有效。

+0

+1,我只是在制定相同的答案,尽管他确实需要平均协方差 – BrodieG

+0

@BrodieG好吧,他们知道如何使用'mean'。 – Roland

+0

+1 ...把​​我的头撞在我的桌子上。 –