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