IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Optimisation boucle matrice de grande taille


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2016
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Optimisation boucle matrice de grande taille
    Bonjour
    J'ai à ma disposition une matrice de corrélation de dimension 34 000*34 000, correspondant à la co-expression de gènes chez la tomate. J'ai pour objectif d'extraire les corrélations les plus intéressantes pour moi (>0.8),et de les placer dans un tableau que je pourrais transférer dans un logiciel de visualisation graphique (cytoscape). Ce tableau comprendrait 3 colonnes: GENE1,CORRELATION,GENE2

    Pour ce faire, j'ai créé un script avec une boucle for qui semble fonctionner sur une petite matrice que j'ai créée pour le tester. Hélas quand je lance mon script sur le cluster de mon laboratoire avec la grande matrice, cela prend beaucoup trop de temps (3 jours de run, et ça n'est toujours pas fini). J'ai pensé à utiliser apply mais je ne sais pas comment l'appliquer à mon cas, car il me semble que apply applique une fonction sur toute la matrice, alors que dans mon cas seule la moitié de la matrice m'intéresse (il s'agit d'une matrice symétrique).
    Quelqu'un peut-il m'aider à réduire ce temps d'attente ?

    Merci d'avance

    Voici le script que j'ai utilisé pour générer ma matrice d'exemple (26*26, symétrique, et avec les diagonales=0)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #matrice 26,26 avec nombre entre -1 et 1, avec 1 sur les diagonales (exemple de matrice de corrélation )
    m=matrix(runif(26*26, min=-1, max=1), ncol=26,nrow=26)
    row.names(m)=paste(letters)
    colnames(m)=paste(letters)
    diag(m)=0
    m=forceSymmetric(m)
    m=as.matrix(m)
    
    m=as.data.frame(m)
    GENE1=vector()
    GENE2=vector()
    CORRELATION=vector()
    y=nrow(m)
    m=data.frame(m)
    for (i in 1:y) {
      for (j in i:y){
          m=as.data.frame(m)
          GENE1=c(GENE1,row.names(m[i,]))
          GENE2=c(GENE2,row.names(m[j,]))
          CORRELATION=c(CORRELATION,m[i,j])
    
          
      }
    }
    #on utilise une deuxième boucle partant de la ligne en cours (i:j) pour ne pas extraire les corrélations déjà extraites car il s'agit d'une matrice symétrique  
    x=data.frame(GENE1,CORRELATION,GENE2)
    colnames(x) = c("GENE1","CORRELATION","GENE2")
    x=subset(x,CORRELATION>0.8)
    et voici le style de tableau que j'obtiens pour cet exemple:
    GENE1 CORRELATION GENE2
    a 0.9566742 n
    b 0.9232764 q
    b 0.9437570 x

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 72
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Je n'ai pas pu faire retourner le code, à cause de la fonction forceSymetric() que je ne connais pas. Le code semblait tourner tout de même en retirant cette ligne. (Si j'ai bien compris, c'est pour rendre la matrice symétrique)

    Quelques idées d'améliorations pour le code. J'ai utilisé les fonctions Sys.time et difftime pour suivre la vitesse de calcul. La vitesse est à peu près 65 fois plus rapide sur une matrice 100*100, et cela augmente avec la taille de la matrice (plus de 100 fois plus rapide sur une 150*150)

    Code R : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    m=matrix(runif(100*100, min=-1, max=1), ncol=100,nrow=100)
    row.names(m)=c(1:100) # j'ai mis des chiffres pour les noms
    colnames(m)=c(1:100)
    diag(m)=0
    m=as.matrix(m)
     
    m=as.data.frame(m) # On met une seule fois la transformation, cela suffit
    GENE1=vector()
    n.GENE<-row.names(m) #On enregistre les noms à l'avance, ca évite d'interroger à répétitions la fonctions
    GENE2=vector()
    CORRELATION=vector()
    y=nrow(m)
    for (i in 1:(y-1)){  #On va jusqu'à la ligne y-1, car en ligne y tout est déjà fait
      for (j in (i+1):y){ #On commence à i+1 sinon on est sur la diagonale, ce qui n'est pas intéressant si j'ai bien compris
        if(m[i,j]>0.8){ #On va inclure directement le test, cela évite d'écrire tout le contenu de la matrice, ce qui est long, et on perd peu de temps sur le test
          GENE1=c(GENE1,n.GENE[i])
          GENE2=c(GENE2,n.GENE[j])
          CORRELATION=c(CORRELATION,m[i,j])
        }
      }
    }
     
    x=data.frame(GENE1,CORRELATION,GENE2)
    colnames(x) = c("GENE1","CORRELATION","GENE2")

    J'espère que cela vous aidera.

    Je pense qu'il doit exister d'autre façon de le faire encore plus rapide, mais je n'ai pas trouvé.

    VV

Discussions similaires

  1. matrice de grande taille
    Par mgoumine dans le forum Mathématiques - Sciences
    Réponses: 4
    Dernier message: 28/03/2013, 09h33
  2. Réponses: 1
    Dernier message: 25/02/2012, 15h45
  3. Créer et remplir des matrices de grandes tailles
    Par Haytham_aziz dans le forum Fortran
    Réponses: 5
    Dernier message: 30/05/2010, 17h34
  4. Réponses: 2
    Dernier message: 16/05/2008, 16h25
  5. Racine carrée matrice de grande taille
    Par S4sha dans le forum MATLAB
    Réponses: 14
    Dernier message: 17/10/2006, 18h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo