Clustering des gènes dans une expérience de temps

8

J'ai vu quelques requêtes sur le clustering dans les séries temporelles et spécifiquement sur le clustering, mais je ne pense pas qu'elles répondent à ma question.

Contexte: Je souhaite regrouper les gènes dans une expérience de cours de temps dans la levure. Il y a quatre points de temps disent: t1 t2 t3 et t4 et le nombre total de gènes G . J'ai les données sous forme d'une matrice M dans laquelle les colonnes représentent les traitements (ou points temporels) t1 t2 t3 et t4 et les lignes représentent les gènes. Par conséquent, M est une matrice Gx4.

Problème: je veux regrouper les gènes qui se comportent de la même manière à tous les points temporels t1 t2 t3 et t4 ainsi qu'à l'intérieur d'un point temporel particulier ti , où i est dans {1, 2, 3, 4} (au cas où nous ne pourrions pas faire les deux regroupements ensemble, le regroupement dans un point temporel est plus important que le regroupement sur plusieurs points temporels). En plus de cela, je veux également dessiner une carte thermique.

Ma solution: j'utilise le code R ci-dessous pour obtenir une carte thermique ainsi que les clusters en utilisant la hclustfonction dans R (effectue un clustering hiérarchique avec une distance euclidienne)

    row.scaled.expr <- (expr.diff - rowMeans(expr.diff)) / rowSds(expr.diff)

    breaks.expr <- c(quantile(row.scaled.expr[row.scaled.expr < 0],
                               seq(0,1,length=10)[-9]), 0,
                               quantile(row.scaled.expr[row.scaled.expr > 0],
                               seq(0,1,length=10))[-1] )


    blue.red.expr <- maPalette(low = "blue", high = "red", mid = "white",
                     k=length(breaks.expr) - 1)

    pdf("images/clust.pdf",
         height=30,width=20,pointsize=20)
    ht1 <- heatmap.2(row.scaled.expr, col = blue.red.expr, Colv = FALSE, key = FALSE, 
      dendrogram = "row", scale = "none", trace = "none",
      cex=1.5, cexRow=1, cexCol=2,
      density.info = "none", breaks = breaks.expr, 
      labCol = colnames(row.scaled.expr),
      labRow="",
      lmat=rbind( c(0, 3), c(2,1), c(0,4) ), lhei=c(0.25, 4, 0.25 ),
      main=expression("Heat Map"),
      ylab="Genes in the Microarray",
      xlab="Treatments"
      )
    dev.off()

J'ai récemment découvert un hopachpackage en Bioconducteur qui peut être utilisé pour estimer le nombre de clusters. Auparavant, j'assignais au hasard le nombre de bacs pour la carte thermique et coupais l'arbre à une hauteur appropriée pour obtenir un nombre prédéfini de clusters.

Problèmes possibles dans ma solution:

  1. Je peux ne pas regrouper les gènes dans un traitement particulier et regrouper les gènes uniquement entre les traitements ou vice versa.
  2. Il peut y avoir de meilleures façons d'obtenir une carte thermique pour le motif que je veux voir (gènes similaires dans un traitement et entre les traitements).
  3. Il peut y avoir de meilleures méthodes de visualisation que je ne connais pas.

Remarque:

  1. csgillespie (modérateur) a un document plus général sur son site Web dans lequel il discute de tous les aspects de l'analyse du cours du temps (y compris les cartes thermiques et les regroupements). Je vous serais reconnaissant de bien vouloir me signaler un article décrivant en détail les cartes thermiques et les regroupements.

  2. J'ai essayé le pvclustpaquet, mais il se plaint que M est singulier et puis il plante.

suncoolsu
la source

Réponses:

3

Il semble que vous vouliez simplement faire une analyse standard juste, donc je ne suis pas la meilleure personne pour répondre à votre question; pourtant je vous suggère de plonger plus profondément dans le Bioconducteur; il a beaucoup de choses utiles, mais trouver ce que vous voulez est douloureux. Par exemple, le package Mfuzz semble prometteur.


la source
1
Il y a aussi un exemple d'utilisation de Mfuzz dans mon article de tutoriel
csgillespie
5

En complément de la réponse de @ mbq ( Mfuzzsemble bien), je vais juste mettre quelques références (PDF) sur le clustering des données d'expression des gènes dans le temps:

  1. Futschik, ME et Charlisle, B (2005). Regroupement robuste du bruit des données de l'évolution temporelle de l'expression des gènes . Journal of Bioinformatics and Computational Biology , 3 (4) , 965-988.
  2. Luan, Y et Li, H (2003). Clustering des données d'expression gènes au cours du temps en utilisant un modèle à effets mixtes avec B-splines . Bioinformatics , 19 (4) , 474-482.
  3. Tai YC et Speed, TP (2006). Une statistique bayésienne empirique multivariée pour les données de parcours de microréseau répliquées . The Annals of Statistics , 34 , 2387–2412.
  4. Schliep, A, Steinhoff, C et Schönhuth, A (2004). Inférence robuste des groupes dans les cycles temporels d'expression des gènes à l'aide de mélanges de HMM . Bioinformatique , 20 (1) , i283-i228.
  5. Costa, IG, de Carvalho, F et de Souto, MCP (2004). Analyse comparative des méthodes de regroupement pour les données d'évolution temporelle de l'expression des gènes . Génétique et biologie moléculaire , 27 (4) , 623-631.
  6. Inoue, LYT, Neira, M, Nelson, C, Gleave, M et Etzioni, R (2006). Modèle de réseau basé sur des grappes pour les données d'expression des gènes dans le temps . Biostatistique , 8 (3) , 507-525.
  7. Phang, TL, Neville, MC, Rudolph, M et Hunter, L (2003). Regroupement de trajectoire: une méthode non paramétrique pour regrouper les cours de temps d'expression génétique avec des applications au développement mammaire . Pacific Symposium on Biocomputing , 8 , 351-362.

Avez-vous essayé le timecoursepackage (comme suggéré par @csgillespie dans son document )?

chl
la source
1
Le timecoursepackage n'est pas vraiment pour déterminer les clusters, mais plutôt pour calculer quels gènes sont exprimés de manière différentielle.
csgillespie
@csgillespie (+1) Merci. J'ai pensé qu'il pourrait être utilisé pour isoler des gènes avec des profils temporels variables dans des conditions biologiques, ou comme première étape avant d'utiliser une procédure de clustering (en fait, je pensais à kmlmais je ne suis pas vraiment un expert dans ce domaine).
chl
Vous avez raison en ce que vous auriez tendance à isoler les gènes intéressants avant tout regroupement - en gros, réduisez votre liste de gènes. Je suppose qu'il effectue un regroupement d'une sorte, exprimé différemment par rapport à exprimé non différentiellement.
csgillespie
3

Juste pour ajouter aux autres réponses (qui semblent résoudre votre problème), avez-vous essayé d'utiliser des algorithmes de clustering standard pour vos données lors de la construction de votre dendrogramme? Par exemple,

heatmap.2(dataset, <standard args>,
          hclustfun = function(c){hclust(c, method= 'average')}
          )

Au lieu d'utiliser la distance moyenne pour le clustering, vous pouvez également utiliser "ward", "single", "median", ... Voir ?hclustpour une liste complète.

Pour extraire des clusters, utilisez hclustdirectement la commande, puis utilisez la cutreecommande. Par exemple,

hc = hclust(dataset)
cutree(hc)

Plus de détails peuvent être trouvés sur ma page Web .

csgillespie
la source
. Oui, mais l'une des difficultés que j'ai eues a été d'extraire les clusters de l'objet heatmap.2. Existe-t-il un moyen simple d'extraire les clusters? Je connais la cutreecommande qui peut être utilisée pour extraire des clusters de l'objet heatmap.2.
suncoolsu
1
@suncoolsu: J'ai mis à jour ma réponse. Est ce que ça aide?
csgillespie