Clustering von Genen in einem Zeitverlaufsexperiment

8

Ich habe einige Fragen zum Clustering in Zeitreihen und speziell zum Clustering gesehen, aber ich glaube nicht, dass sie meine Frage beantworten.

Hintergrund: Ich möchte Gene in einem Zeitverlaufsexperiment in Hefe bündeln. Es gibt vier Zeitpunkt sagen: t1 t2 t3 und t4 und die Gesamtzahl der Gene G . Ich habe die Daten in Form einer Matrix M, in der die Spalten die Behandlungen (oder Zeitpunkte) t1 t2 t3 und t4 darstellen und die Zeilen die Gene darstellen. Daher ist M eine Gx4-Matrix.

Problem: Ich möchte die Gene, die sich über alle Zeitpunkte t1, t2, t3 und t4 sowie innerhalb eines bestimmten Zeitpunkts ti , in dem i in {1, 2, 3, 4} ist, gleich verhalten, gruppieren (falls dies nicht möglich ist) Bei beiden Clustern zusammen ist das Clustering innerhalb eines Zeitpunkts wichtiger als das Clustering über Zeitpunkte hinweg. Darüber hinaus möchte ich eine Heatmap zeichnen.

Meine Lösung: Ich verwende den folgenden R-Code, um eine Heatmap sowie die Cluster mithilfe der hclustFunktion in R zu erhalten (führt hierarchische Cluster mit euklidischem Abstand durch).

    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()

Ich habe kürzlich ein hopachPaket in Bioconductor entdeckt , mit dem die Anzahl der Cluster geschätzt werden kann. Zuvor habe ich zufällig die Anzahl der Fächer für die Heatmap zugewiesen und den Baum in einer geeigneten Höhe geschnitten, um eine vorgegebene Anzahl von Clustern zu erhalten.

Mögliche Probleme in meiner Lösung:

  1. Möglicherweise gruppiere ich die Gene innerhalb einer bestimmten Behandlung nicht und gruppiere Gene nur über Behandlungen hinweg oder umgekehrt.
  2. Es gibt möglicherweise bessere Möglichkeiten, eine Heatmap für das Muster zu erhalten, das ich sehen möchte (ähnliche Gene innerhalb einer Behandlung und über Behandlungen hinweg).
  3. Möglicherweise gibt es bessere Visualisierungsmethoden, die mir nicht bekannt sind.

Hinweis:

  1. csgillespie (Moderator) hat auf seiner Website ein allgemeineres Dokument, in dem er alle Aspekte der Zeitverlaufsanalyse (einschließlich Heatmaps und Clustering) behandelt. Ich würde mich freuen, wenn Sie mich auf einen Artikel verweisen können, der Heatmaps und Clustering im Detail beschreibt.

  2. Ich habe das pvclustPaket ausprobiert , aber es beschwert sich, dass M singulär ist und dann abstürzt.

Suncoolsu
quelle

Antworten:

3

Es scheint, dass Sie nur eine faire Standardanalyse durchführen möchten, daher bin ich nicht die beste Person, um Ihre Frage zu beantworten. dennoch würde ich Ihnen vorschlagen, tiefer in Bioconductor einzutauchen; Es hat viele nützliche Dinge, dennoch ist es schmerzhaft zu finden, was Sie wollen. Zum Beispiel sieht das Mfuzz- Paket vielversprechend aus.


quelle
1
Es gibt auch ein Beispiel für die Verwendung von Mfuzz in meinem Tutorial-
Artikel
5

In Ergänzung zur Antwort von @ mbq ( Mfuzzsieht gut aus) werde ich nur einige Referenzen (PDFs) zum Clustering von Genexpressionsdaten im Zeitverlauf einfügen :

  1. Futschik, ME und Charlisle, B (2005). Rauschstarkes Clustering von Zeitverlaufsdaten der Genexpression . Journal of Bioinformatics and Computational Biology , 3 (4) , 965-988.
  2. Luan, Y und Li, H (2003). Clustering von Zeitverlaufs-Genexpressionsdaten unter Verwendung eines Mixed-Effects-Modells mit B-Splines . Bioinformatics , 19 (4) , 474 & ndash; 482.
  3. Tai YC und Speed, TP (2006). Eine multivariate empirische Bayes-Statistik für replizierte Microarray-Zeitverlaufsdaten . The Annals of Statistics , 34 , 2387–2412.
  4. Schliep, A, Steinhoff, C und Schönhuth, A (2004). Robuste Inferenz von Gruppen in Genexpressionszeitverläufen unter Verwendung von HMM-Gemischen . Bioinformatics , 20 (1) , i283 & ndash; i228.
  5. Costa, IG, de Carvalho, F und de Souto, MCP (2004). Vergleichende Analyse von Clustering-Methoden für Genexpressions-Zeitverlaufsdaten . Genetics and Molecular Biology , 27 (4) , 623 & ndash; 631.
  6. Inoue, LYT, Neira, M., Nelson, C., Gleave, M. und Etzioni, R. (2006). Clusterbasiertes Netzwerkmodell für Zeitverlaufs-Genexpressionsdaten . Biostatistics , 8 (3) , 507 & ndash; 525.
  7. Phang, TL, Neville, MC, Rudolph, M und Hunter, L (2003). Trajectory Clustering: Eine nicht parametrische Methode zur Gruppierung von Genexpressionszeitverläufen mit Anwendungen für die Brustentwicklung . Pacific Symposium on Biocomputing , 8 , 351-362.

Haben Sie das timecoursePaket ausprobiert (wie von @csgillespie in seinem Handzettel vorgeschlagen )?

chl
quelle
1
Das timecoursePaket dient nicht wirklich zur Bestimmung von Clustern, sondern zur Berechnung der differentiell exprimierten Gene.
Csgillespie
@csgillespie (+1) Danke. Ich dachte, es könnte verwendet werden, um Gene mit unterschiedlichen zeitlichen Profilen über biologische Bedingungen hinweg zu isolieren, oder als ersten Schritt, bevor ein Clustering-Verfahren angewendet wird (tatsächlich habe ich darüber nachgedacht, kmlaber ich bin kein wirklicher Experte auf diesem Gebiet).
Chl
Sie haben insofern Recht, als Sie dazu neigen würden, interessante Gene vor jeder Clusterbildung zu isolieren - im Grunde genommen reduzieren Sie Ihre Liste der Gene. Ich nehme an, es führt eine Art Clustering durch, das differentiell ausgedrückt und nicht differentiell ausgedrückt wird.
Csgillespie
3

Haben Sie versucht, bei der Erstellung Ihres Dendrogramms Standard-Clustering-Algorithmen für Ihre Daten zu verwenden, um die anderen Antworten zu ergänzen (die so aussehen, als ob sie Ihr Problem lösen sollten)? Zum Beispiel,

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

Anstatt die durchschnittliche Entfernung für das Clustering zu verwenden, können Sie auch "ward", "single", "median", ... verwenden. ?hclustEine vollständige Liste finden Sie unter.

Verwenden Sie zum Extrahieren von Clustern den hclustBefehl direkt und anschließend den cutreeBefehl. Zum Beispiel,

hc = hclust(dataset)
cutree(hc)

Weitere Details finden Sie auf meiner Webseite .

csgillespie
quelle
. Ja, aber eine der Schwierigkeiten, die ich hatte, war das Extrahieren der Cluster aus dem Heatmap.2-Objekt. Gibt es eine einfache Möglichkeit, die Cluster zu extrahieren? Mir ist der cutreeBefehl bekannt, mit dem Cluster aus dem Heatmap.2-Objekt extrahiert werden können.
Suncoolsu
1
@suncoolsu: Ich habe meine Antwort aktualisiert. Hilft das?
Csgillespie