Agrupando genes em um experimento ao longo do tempo

8

Vi algumas consultas sobre agrupamentos em séries temporais e especificamente sobre agrupamentos, mas não acho que elas respondam à minha pergunta.

Antecedentes: Quero agrupar genes em um experimento de levedura. Há quatro pontos de tempo dizer: t1 t2 t3 e t4 e número total de genes G . Eu tenho os dados em forma de uma matriz M na qual as colunas representam os tratamentos (ou pontos no tempo) t1 t2 t3 e t4 e as linhas representam os genes. Portanto, M é uma matriz Gx4.

Problema: eu quero agrupar os genes que se comportam da mesma forma em todos os pontos de tempo t1 t2 t3 e t4 , bem como dentro de um ponto de tempo específico ti , em que eu estou em {1, 2, 3, 4} (caso não possamos fazer ambos os agrupamentos, o agrupamento dentro de um ponto no tempo é mais importante do que o agrupamento entre os pontos no tempo). Além disso, também quero desenhar um mapa de calor.

Minha solução: Eu uso o código R abaixo para obter um mapa de calor, bem como os clusters usando a hclustfunção em R (executa cluster hierárquico com distância 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()

Eu descobri recentemente um hopachpacote no Bioconductor que pode ser usado para estimar o número de clusters. Anteriormente, eu estava atribuindo aleatoriamente o número de caixas para o mapa de calor e cortando a árvore a uma altura apropriada para obter um número pré-especificado de clusters.

Possíveis problemas na minha solução:

  1. Posso não estar agrupando os genes em um tratamento específico e agrupando genes apenas entre tratamentos ou vice-versa.
  2. Pode haver melhores maneiras de obter um mapa de calor para o padrão que eu quero ver (genes semelhantes em um tratamento e entre tratamentos).
  3. Pode haver melhores métodos de visualização dos quais eu não conheço.

Nota:

  1. csgillespie (moderador) possui um documento mais geral em seu site, no qual ele discute todos os aspectos da análise do curso do tempo (incluindo mapas de calor e agrupamento). Eu gostaria que você pudesse me indicar artigos que descrevem mapas de calor e agrupamentos em detalhes.

  2. Eu tentei o pvclustpacote, mas ele reclama que M é singular e depois falha.

suncoolsu
fonte

Respostas:

3

Parece que você só quer fazer uma análise padrão justa, por isso não sou a melhor pessoa para responder à sua pergunta; no entanto, sugiro que você mergulhe mais fundo no biocondutor; tem muitas coisas úteis, mas achar o que você quer é doloroso. Por exemplo, o pacote Mfuzz parece promissor.


fonte
1
Há também um exemplo de uso do Mfuzz no meu tutorial
csgillespie
5

Em complemento à resposta do @ mbq ( Mfuzzparece ótimo), vou colocar algumas referências (PDFs) sobre o agrupamento de dados de expressão gênica no decorrer do tempo:

  1. Futschik, ME e Charlisle, B (2005). Agrupamento robusto e com ruído de dados de tempo de expressão de genes . Jornal de Bioinformática e Biologia Computacional , 3 (4) , 965-988.
  2. Luan, Y e Li, H (2003). Agrupamento de dados de expressão gênica no curso do tempo usando um modelo de efeitos mistos com B-splines . Bioinformtics , 19 (4) , 474-482.
  3. Tai YC e Speed, TP (2006). Uma estatística empírica multivariada de Bayes para dados replicados de tempo de microarray . The Annals of Statistics , 34 , 2387-2412.
  4. Schliep, A, Steinhoff, C e Schönhuth, A (2004). Inferência robusta de grupos em cursos de expressão gênica utilizando misturas de HMMs . Bioinformática , 20 (1) , i283-i228.
  5. Costa, IG, de Carvalho, F e de Souto, MCP (2004). Análise comparativa de métodos de agrupamento para dados de tempo de expressão de genes . Genetics and Molecular Biology , 27 (4) , 623-631.
  6. Inoue, LYT, Neira, M, Nelson, C, Gleave, M e Etzioni, R (2006). Modelo de rede baseado em cluster para dados de expressão gênica no decorrer do tempo . Bioestatística , 8 (3) , 507-525.
  7. Phang, TL, Neville, MC, Rudolph, M e Hunter, L (2003). Clustering de Trajetória: Um Método Não Paramétrico para Agrupar Cursos Temporais de Expressão Gênica com Aplicações ao Desenvolvimento Mamário . Pacific Symposium on Biocomputing , 8 , 351-362.

Você experimentou o timecoursepacote (como sugerido por @csgillespie no folheto )?

chl
fonte
1
O timecoursepacote não é realmente para determinar clusters, é para calcular quais genes são expressos diferencialmente.
csgillespie
@csgillespie (+1) Obrigado. Eu pensei que poderia ser usado para isolar genes com perfis temporais variados em condições biológicas, ou como um primeiro passo antes de usar um procedimento de agrupamento (na verdade, eu estava pensando, kmlmas não sou realmente um especialista nesse domínio).
quer
Você está certo no que tende a usar para isolar genes interessantes antes de qualquer agrupamento - basicamente reduz a sua lista de genes. Suponho que ele execute agrupamentos de um tipo, expressos de forma diferencial versus expressos de maneira não diferencial.
Csgillespie 5/10/10
3

Apenas para adicionar às outras respostas (que parecem resolver o problema), você tentou usar algoritmos de cluster padrão para seus dados ao construir seu dendrograma? Por exemplo,

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

Em vez de usar a distância média para agrupar, você também pode usar "ala", "única", "mediana", ... Veja ?hclustpara obter uma lista completa.

Para extrair clusters, use o hclustcomando diretamente e, em seguida, use o cutreecomando Por exemplo,

hc = hclust(dataset)
cutree(hc)

Mais detalhes podem ser encontrados na minha página da web .

csgillespie
fonte
. Sim, mas uma das dificuldades que tive foi extrair os clusters do objeto heatmap.2. Existe uma maneira fácil de extrair os clusters? Estou ciente do cutreecomando que pode ser usado para extrair clusters do objeto heatmap.2.
suncoolsu
1
@ suncoolsu: Eu atualizei minha resposta. Isso ajuda?
csgillespie