Agrupación de genes en un experimento de curso temporal

8

He visto algunas consultas sobre la agrupación en series de tiempo y específicamente sobre la agrupación, pero no creo que respondan a mi pregunta.

Antecedentes: quiero agrupar genes en un experimento de curso de tiempo en levadura. Hay cuatro puntos de tiempo dicen: t1 t2 t3 y t4 y el número total de genes G . Tengo los datos en forma de una matriz M en la que las columnas representan los tratamientos (o puntos de tiempo) t1 t2 t3 y t4 y las filas representan los genes. Por lo tanto, M es una matriz Gx4.

Problema: Quiero agrupar los genes que se comportan de la misma manera en todos los puntos de tiempo t1 t2 t3 y t4 , así como dentro de un punto de tiempo particular ti , donde i está en {1, 2, 3, 4} (en caso de que no podamos hacerlo ambas agrupaciones juntas, la agrupación dentro de un punto de tiempo es más importante que la agrupación entre puntos de tiempo). Además de esto, también quiero dibujar un mapa de calor.

Mi solución: Utilizo el código R a continuación para obtener un mapa de calor, así como los clústeres que utilizan la hclustfunción en R (realiza el agrupamiento jerárquico con la distancia euclidiana)

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

Recientemente descubrí un hopachpaquete en Bioconductor que se puede usar para estimar la cantidad de grupos. Anteriormente, estaba asignando aleatoriamente el número de contenedores para el mapa de calor y cortaba el árbol a una altura adecuada para obtener un número predeterminado de grupos.

Posibles problemas en mi solución:

  1. Es posible que no esté agrupando los genes dentro de un tratamiento particular y agrupando genes solo a través de tratamientos o viceversa.
  2. Puede haber mejores formas de obtener un mapa de calor para el patrón que quiero ver (genes similares dentro de un tratamiento y entre tratamientos).
  3. Puede haber mejores métodos de visualización que no conozco.

Nota:

  1. csgillespie (moderador) tiene un documento más general en su sitio web en el que analiza todos los aspectos del análisis del curso temporal (incluidos los mapas de calor y la agrupación). Le agradecería si me puede señalar un artículo que describa mapas de calor y agrupaciones en detalle.

  2. He probado el pvclustpaquete, pero se queja de que M es singular y luego se bloquea.

suncoolsu
fuente

Respuestas:

3

Parece que solo desea hacer un análisis estándar justo, por lo que no soy la mejor persona para responder su pregunta; sin embargo, te sugiero que te sumerjas más en Bioconductor; tiene muchas cosas útiles, sin embargo, encontrar lo que quieres es doloroso. Por ejemplo, el paquete Mfuzz parece prometedor.


fuente
1
También hay un ejemplo de uso de Mfuzz en mi trabajo de tutorial
csgillespie el
5

En complemento a la respuesta de @ mbq (se Mfuzzve bien), solo pondré algunas referencias (PDF) sobre la agrupación de datos de expresión génica en el transcurso del tiempo:

  1. Futschik, ME y Charlisle, B (2005). Ruido agrupamiento robusto de datos de curso de tiempo de expresión génica . Revista de Bioinformática y Biología Computacional , 3 (4) , 965-988.
  2. Luan, Y y Li, H (2003). Agrupación de datos de expresión génica en el transcurso del tiempo utilizando un modelo de efectos mixtos con B-splines . Bioinformática , 19 (4) , 474-482.
  3. Tai YC y Speed, TP (2006). Una estadística Bayes empírica multivariada para datos de curso de tiempo de microarrays replicados . Los Anales de Estadísticas , 34 , 2387–2412.
  4. Schliep, A, Steinhoff, C y Schönhuth, A (2004). Inferencia robusta de grupos en cursos de tiempo de expresión génica utilizando mezclas de HMM . Bioinformática , 20 (1) , i283-i228.
  5. Costa, IG, de Carvalho, F y de Souto, MCP (2004). Análisis comparativo de los métodos de agrupación para los datos del curso de tiempo de expresión génica . Genética y biología molecular , 27 (4) , 623-631.
  6. Inoue, LYT, Neira, M, Nelson, C, Gleave, M y Etzioni, R (2006). Modelo de red basado en clúster para datos de expresión génica en el transcurso del tiempo . Bioestadística , 8 (3) , 507-525.
  7. Phang, TL, Neville, MC, Rudolph, M y Hunter, L (2003). Agrupación de trayectoria: un método no paramétrico para agrupar cursos de tiempo de expresión génica con aplicaciones para el desarrollo mamario . Simposio del Pacífico sobre biocomputación , 8 , 351-362.

¿ timecourseProbó el paquete (como lo sugiere @csgillespie en su folleto )?

chl
fuente
1
El timecoursepaquete no es realmente para determinar grupos, sino para calcular qué genes se expresan diferencialmente.
csgillespie
@csgillespie (+1) Gracias. Pensé que podría usarse para aislar genes con diferentes perfiles temporales a través de condiciones biológicas, o como un primer paso antes de usar un procedimiento de agrupamiento (de hecho, estaba pensando kmlpero no soy realmente un experto en ese dominio).
chl
Tiene razón en que tendería a usar para aislar genes interesantes antes de cualquier agrupación, básicamente reduzca su lista de genes. Supongo que realiza la agrupación de una especie, expresada diferencialmente frente a no expresada diferencialmente.
csgillespie
3

Solo para agregar a las otras respuestas (que parecen resolver su problema), ¿trató de usar algoritmos de agrupación estándar para sus datos al construir su dendrograma? Por ejemplo,

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

En lugar de usar la distancia promedio para la agrupación, también puede usar "ward", "single", "median", ... Consulte ?hclustpara obtener una lista completa.

Para extraer clústeres, use el hclustcomando directamente y luego use el cutreecomando. Por ejemplo,

hc = hclust(dataset)
cutree(hc)

Se pueden encontrar más detalles en mi página web .

csgillespie
fuente
. Sí, pero una de las dificultades que tuve fue para extraer los grupos del objeto heatmap.2. ¿Hay una manera fácil de extraer los grupos? Soy consciente del cutreecomando que se puede utilizar para extraer clústeres del objeto heatmap.2.
suncoolsu
1
@suncoolsu: He actualizado mi respuesta. ¿Eso ayuda?
csgillespie