2014-01-31 64 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 ...把​​我的頭撞在我的桌子上。 –