Manipulation de données nombreuses et conversion en matrice

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Sireau Aurélien
Messages : 9
Enregistré le : 05 Juin 2006, 08:01

Manipulation de données nombreuses et conversion en matrice

Messagepar Sireau Aurélien » 13 Juil 2007, 08:05

Bonjour,

Je dispose de données sous la forme:

Code : Tout sélectionner

V1;V2;correlation(V1,V2)
V1;V3;correlation(V1,V3)
V1;V4;correlation(V1;V4)

...
VN;V(N-1);correlation(VN;V(N-1))

où V1,...,VN sont N variables (N = environ 400)

J'aimerai mettre ces informations sous la forme d'une matrice de corrélation

Code : Tout sélectionner

 1; correlation(V1,V2) ... ; correlation(V1;VN)
...
correlation(VN;V1); correlation(VN;V(N-1));...;1


pour ensuite pouvoir faire des opérations matricielles sur R.

Cela est bien sur possible avec des boucles standards mais j'aimerai savoir si vous connaissez une méthode plus rapide (avec des fonctions R adaptées) pour obtenir cette matrice en un temps rapide.

Merci d'avance,

Aurélien
Aurélien Sireau

Sireau Aurélien
Messages : 9
Enregistré le : 05 Juin 2006, 08:01

Messagepar Sireau Aurélien » 14 Juil 2007, 22:51

Le problème réside justement dans le passage du format initial vers celui d'une matrice. Les corrélations sont déjà stockées dans mon tableau initial. Mon problème est purement de type : base données et le fait que je manipule des corrélations est sans importance...

Je ne sais pas si je suis bien clair...
Aurélien Sireau

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 15 Juil 2007, 06:59

Si je comprends bien (?):

La fonction clé est lower.tri (respt upper.tri) qui permet de récupérer la partie sous la diagonale (respt au-dessus) d'une matrice carrée. Dans le code ci-dessous, je génère un tableau de même format que celui que vous indiquez:

Code : Tout sélectionner

> ## Tableau des variables
> (mat <- matrix(runif(40), ncol = 4))
            [,1]       [,2]       [,3]      [,4]
 [1,] 0.26774315 0.07195441 0.06433383 0.0798051
 [2,] 0.04983848 0.81061274 0.41158576 0.4203977
 [3,] 0.22994934 0.32910619 0.99275587 0.2976878
 [4,] 0.93242162 0.22793926 0.59738951 0.6898433
 [5,] 0.86889450 0.17224071 0.58724847 0.1117539
 [6,] 0.34083518 0.93770654 0.32071866 0.3621455
 [7,] 0.21373906 0.76447404 0.92568461 0.4508073
 [8,] 0.30565732 0.84100096 0.08104047 0.3930936
 [9,] 0.15893840 0.72554648 0.29028475 0.4866288
[10,] 0.26765975 0.89285801 0.46027280 0.3800723
> ## Matrice des corrélations
> (Corr <- cor(mat))
            [,1]       [,2]       [,3]       [,4]
[1,]  1.00000000 -0.5697125  0.1375715 0.07459122
[2,] -0.56971246  1.0000000 -0.1385074 0.38938450
[3,]  0.13757150 -0.1385074  1.0000000 0.19125387
[4,]  0.07459122  0.3893845  0.1912539 1.00000000
> ## Fichier au format indiqué
> (idx <- lower.tri(Corr))
      [,1]  [,2]  [,3]  [,4]
[1,] FALSE FALSE FALSE FALSE
[2,]  TRUE FALSE FALSE FALSE
[3,]  TRUE  TRUE FALSE FALSE
[4,]  TRUE  TRUE  TRUE FALSE
> (v <- (Corr[idx]))
[1] -0.56971246  0.13757150  0.07459122 -0.13850737  0.38938450  0.19125387
> (Tab <- cbind(t(combn(4, 2)), v))
                   v
[1,] 1 2 -0.56971246
[2,] 1 3  0.13757150
[3,] 1 4  0.07459122
[4,] 2 3 -0.13850737
[5,] 2 4  0.38938450
[6,] 3 4  0.19125387
> write.table(Tab, file = "Tab.txt", sep = ";", row.names= FALSE, col.names = FALSE)


Le résultat est un fichier texte:

Code : Tout sélectionner

1;2;-0.569712459173689
1;3;0.137571503789363
1;4;0.0745912232532626
2;3;-0.138507370565218
2;4;0.389384504778316
3;4;0.191253872622228


On écrit alors une fonction permettant:
1. de lire le fichier texte
2. de calculer le nombre de lignes de la matrice de corrélation correspondante: on résout pour cela une équation du second degré.
3. de reconstituer la matrice de corrélation à l'aide des fonctions lower.tri, upper.tri et diag

Code : Tout sélectionner

> write.table(Tab, file = "Tab.txt", sep = ";", row.names= FALSE, col.names = FALSE)
> CorrMat <- function(tab){
+     Data <- read.table(tab, sep = ";", header = FALSE)
+     n <- (1 + sqrt(1 + 8 * nrow(Data))) / 2
+     Corr <- Data[,3]
+     mat <- matrix(nrow = n, ncol = n)
+     mat[lower.tri(mat)] <- Corr
+     mat[upper.tri(mat)] <- Corr
+     diag(mat) <- 1
+     mat
+     }
>
> CorrMat(tab = "Tab.txt")
            [,1]       [,2]       [,3]       [,4]
[1,]  1.00000000 -0.5697125 0.13757150 -0.1385074
[2,] -0.56971246  1.0000000 0.07459122  0.3893845
[3,]  0.13757150 -0.1385074 1.00000000  0.1912539
[4,]  0.07459122  0.3893845 0.19125387  1.0000000


Renaud

Sireau Aurélien
Messages : 9
Enregistré le : 05 Juin 2006, 08:01

Messagepar Sireau Aurélien » 17 Juil 2007, 19:18

Les vecteur V(i) comprennent plus de 70 000 lignes (N(N-1)/2 avec N>400).
Merci pour votre aide à tous les deux, je devrais pouvoir me débrouiller avec la solution de Renaud, cette fonction lower.tri est en effet très pratique.

Aurélien
Aurélien Sireau


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité