Découpage 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

Oriane Moyne
Messages : 17
Enregistré le : 20 Oct 2015, 15:50

Découpage matrice

Messagepar Oriane Moyne » 30 Aoû 2018, 17:49

Bonjour à tous,

J'ai une 191 échantillons, caractérisés par 920 variables. Ces échantillons ont 66 provenances, j'ai donc soit des duplicats, soit des triplicats.

Code : Tout sélectionner

mat <- matrix(data = rnorm(1:(191*920)), nrow=920, ncol = 191)
replicats <- c(rep(3, 20), rep(2, 4), rep(3, 39), rep(2,3)) # le nombre de répétitions de chaque provenance
replicats
 [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[49] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2


J'ai calculé une matrice de corrélation sur l'ensemble des échantillons comme suit :

Code : Tout sélectionner

mat_corr <- rcorr(mat)$r


Code : Tout sélectionner

> mat_corr[1:6, 1:6]
           [,1]        [,2]       [,3]         [,4]        [,5]         [,6]
[1,]  1.0000000  0.47180548  0.1755502 -0.510588905 -0.65118471  0.130882787
[2,]  0.4718055  1.00000000 -0.1050931 -0.040122958 -0.37220522 -0.110187036
[3,]  0.1755502 -0.10509307  1.0000000 -0.232531709 -0.35047654  0.120629975
[4,] -0.5105889 -0.04012296 -0.2325317  1.000000000  0.01365126 -0.006923696
[5,] -0.6511847 -0.37220522 -0.3504765  0.013651262  1.00000000 -0.239185284
[6,]  0.1308828 -0.11018704  0.1206300 -0.006923696 -0.23918528  1.000000000


Je voudrais maintenant redécouper cette matrice "en diagonale", en prenant pour ma première condition les mat_corr[1:3,1:3] (car replicat[1]=3), puis mat_corr[4:6,4:6], etc.

En gros, je souhaite récupérer une liste de "mini matrices de corrélation" pour chaque condition, pour ensuite calculer la corrélation moyenne de chaque échantillon avec ses réplicats.

Pour l'instant je suis perdue dans des boucles :

Code : Tout sélectionner

liste_corr_repl <- list()

for (i in 1:nrow(mat_corr )) {
 
  for (j in 1:(length(replicats))){
   
      liste_corr_repl[i] <- mat_corr[i:(i+(replicats[j]-1)), i:(i+(replicats[j]-1))]
      j <- j + replicats[i]
   
  }
}


Mais ça ne donne rien...

Quelqu'un aurait une idée ?

Merci d'avance pour votre aide !

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Découpage matrice

Messagepar Pierre-Yves Berrard » 30 Aoû 2018, 19:56

Bonsoir,

Une fonction *apply permet de se passer des boucles avec index :

Code : Tout sélectionner

fins <- cumsum(replicats)
debuts <- fins - replicats + 1

liste_corr_repl <-
  mapply(
    function(m, n) mat_corr[m:n, m:n],
    debuts,
    fins
  )
PY

Oriane Moyne
Messages : 17
Enregistré le : 20 Oct 2015, 15:50

Re: Découpage matrice

Messagepar Oriane Moyne » 31 Aoû 2018, 09:38

C'est parfait.

J'avais effectivement essayé de chercher dans ce sens mais mon cerveau a bloqué "en mode boucle" et je ne m'en sortais pas...

Merci beaucoup pour votre aide !

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Découpage matrice

Messagepar Pierre-Yves Berrard » 31 Aoû 2018, 10:11

L'astuce est surtout de calculer "debuts" et "fins", après quoi une boucle for serait également assez simple.

Code : Tout sélectionner

n <- length(replicats)

liste_corr_repl <- vector(mode = "list", length = n)
for (i in 1:n) liste_corr_repl[[i]] <- mat_corr[debuts[i]:fins[i], debuts[i]:fins[i]]
PY


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité