2010-07-30 8 views
2

J'essaie de boucler sur la matrice a et de faire le coefficient de corrélation de chaque deux lignes et d'imprimer la matrice de corrélation.Itérer sur la grande matrice contenant 3000 lignes et calculer la corrélation

ID A B C D E F G H I 
Row01 0.08 0.47 0.94 0.33 0.08 0.93 0.72 0.51 0.55 
Row02 0.37 0.87 0.72 0.96 0.20 0.55 0.35 0.73 0.44 
Row03 0.19 0.71 0.52 0.73 0.03 0.18 0.13 0.13 0.30 
Row04 0.08 0.77 0.89 0.12 0.39 0.18 0.74 0.61 0.57 
Row05 0.09 0.60 0.73 0.65 0.43 0.21 0.27 0.52 0.60 
Row06 0.60 0.54 0.70 0.56 0.49 0.94 0.23 0.80 0.63 
Row07 0.02 0.33 0.05 0.90 0.48 0.47 0.51 0.36 0.26 
Row08 0.34 0.96 0.37 0.06 0.20 0.14 0.84 0.28 0.47 
........ 
(30000 rows!) 

Je veux la sortie de corrélation Pearson:

Row01 
Row01 1.000 
Row02 0.012 
Row03 0.023 
Row04 0.820 
Row05 0.165 
Row06 0.230 
Row07 0.376 
Row08 0.870 

sortie comme Row01.txt

Row02 
Row01 0.012 
Row02 1.000 
Row03 0.023 
Row04 0.820 
Row05 0.165 
Row06 0.230 
Row07 0.376 
Row08 0.870 

sortie comme Row02.txt. . . . .

les fichiers de sortie seront 30000! Je suis conscient de cet algorithme semble stupide, que matrix<-cor(T(data)) fera le tout, et la moitié de la matrice corr est suffisante car le résultat corr est symétrique le long de la diagonale.

Mais mes problèmes sont

  1. mes données est trop grand pour gérer R 30000x30000.
  2. Il est difficile de récupérer les corrélations spécifiques d'une ligne spécifique avec le reste.
  3. En utilisant mon "algorithme stupide" je peux facilement obtenir la corr de mon intérêt du dossier.

Répondre

1

Non testé, mais quelque chose comme ça devrait fonctionner, je suppose que

EDIT: code corrigé pour éviter énorme matrice

correl <- NULL 
for (i in 1:nrow(datamatrix)) 
    { 
    correl <- apply(datamatrix, 1, function(x){cor(datamatrix[,i], x)}) 
    write.table(correl, paste("col", i, ".txt", sep="") 
    } 
+0

Hm Je crains que ça ne vole pas. L'affiche originale revendiquée 'datamatrix' était trop grande pour la mémoire. –

+0

@Dirk Eddelbuettel: hmmm c'est vrai, j'ai supposé qu'il parlait de la matrice de sortie, mais la matrice d'entrée est énorme aussi ... n'y pensait pas. N'y avait-il pas un paquet pour gérer d'énormes matrices en mémoire ou ai-je tort? – nico

+0

Merci! J'ai eu un problème avec mon SUSE où je veux utiliser. Je vais essayer le code et revenir bientôt. – Ivan

1

Merci Nico! J'y suis presque arrivé après avoir corrigé de petits bugs. Ici, je joins mon script:

datamatrix=read.table("ref.txt",sep="\t",header=T,row.names=1) 
correl <- NULL 
for (i in 1:nrow(datamatrix)) { 
    correl <- apply(datamatrix, 1, function(x){cor(t(datamatrix[,i]))}) 
    write.table(correl, paste(row.names(datamatrix)[i], ".txt", sep="")) 
} 

Mais je crains que la fonction (x) est une partie de problème, qui semble être t(datamatrix[i,j]), qui calcule corr de toutes les deux lignes.

En fait, j'ai besoin d'itérer à travers la matrice. d'abord cor(row01, row02) obtenir une corrélation entre rwo01 et row02; puis cor(row01, row03) pour obtenir la corrélation des row01 et rwo03, .... et jusqu'à ce que la corrélation entre row01 row30000.Now je suis arrivé la première colonne pour

 row01 
Row01 **1.000** 
Row02 0.012 
Row03 0.023 
Row04 0.820 
Row05 0.165 
Row06 0.230 
Row07 0.376 
Row08 0.870 

et enregistrez-déposer row01.txt;

De même se

 Row02 
Row01 0.012 
Row02 **1.000** 
Row03 0.023 
Row04 0.820 
Row05 0.165 
Row06 0.230 
Row07 0.376 
Row08 0.870 

et enregistrez-le fichier row02.txt.

Totalement, je vais obtenir 30000 fichiers. C'est stupide, mais cela peut passer la limite de la mémoire et peut être facilement manipulé pour la corrélation d'une ligne spécifique.

0

Je recommande d'examiner le paquet bigmemory et le paquet foreach, pour faire ces calculs dans de grands fichiers mappés en mémoire (c'est-à-dire que la matrice d'entrée est un fichier, la matrice de corrélation en est un autre). De cette façon, vous pouvez utiliser plusieurs cœurs et ne pas stocker beaucoup de RAM.

Questions connexes