Estou examinando alguns dados de cobertura genômica, que são basicamente uma longa lista (alguns milhões de valores) de números inteiros, cada um dizendo quão bem (ou "profunda") essa posição no genoma é coberta.
Gostaria de procurar "vales" nesses dados, ou seja, regiões que são significativamente "mais baixas" do que o ambiente circundante.
Observe que o tamanho dos vales que estou procurando pode variar de 50 bases a alguns milhares.
Que tipo de paradigma você recomendaria usar para encontrar esses vales?
ATUALIZAR
Alguns exemplos gráficos para os dados:
ATUALIZAÇÃO 2
Definir o que é um vale é, obviamente, uma das questões com as quais estou lutando. Estes são óbvios para mim:
mas há algumas situações mais complexas. Em geral, existem três critérios que considero: 1. A cobertura (média? Máxima?) Na janela em relação à média global. 2. A (...) cobertura na janela em relação ao seu entorno imediato. 3. Qual é o tamanho da janela: se vejo uma cobertura muito baixa por um curto período, é interessante; se vejo uma cobertura muito baixa por um longo período, também é interessante; se vejo uma cobertura levemente baixa por um curto período, não é realmente interessante. , mas se eu vir uma cobertura levemente baixa por um longo período - é .. Portanto, é uma combinação do comprimento do sapn e da cobertura. Quanto mais tempo, mais alto deixo a cobertura e ainda a considero um vale.
Obrigado,
Dave
Respostas:
Você pode usar algum tipo de abordagem de Monte Carlo, usando, por exemplo, a média móvel de seus dados.
Faça uma média móvel dos dados, usando uma janela de tamanho razoável (acho que depende de você decidir a largura).
Os dados de seus dados (é claro) serão caracterizados por uma média mais baixa, então agora você precisa encontrar um "limite" para definir "baixo".
Para fazer isso, você troca aleatoriamente os valores dos seus dados (por exemplo, usando
sample()
) e recalcula a média móvel dos dados trocados.Repita esta última passagem uma quantidade razoavelmente alta de vezes (> 5000) e armazene todas as médias dessas tentativas. Então, basicamente, você terá uma matriz com 5000 linhas, uma por tentativa, cada uma contendo a média móvel dessa tentativa.
Nesse ponto, para cada coluna, você escolhe o quantil de 5% (ou 1% ou o que quiser), ou seja, o valor sob o qual repousa apenas 5% da média dos dados aleatórios.
Agora você tem um "limite de confiança" (não tenho certeza se esse é o termo estatístico correto) para comparar seus dados originais. Se você encontrar uma parte dos seus dados inferior a esse limite, poderá chamar isso de "a through".
É claro, tenha em mente que nem esse nem qualquer outro método matemático poderia lhe dar qualquer indicação de significado biológico, embora eu tenha certeza de que você está ciente disso.
EDIT - um exemplo
Isso permitirá que você encontre graficamente as regiões, mas você pode encontrá-las facilmente usando algo nas linhas de
which(values>limits.5)
.fonte
Sou completamente ignorante desses dados, mas supondo que os dados sejam ordenados (não no tempo, mas na posição?), Faz sentido usar métodos de séries temporais. Existem muitos métodos para identificar clusters temporais nos dados. Geralmente eles são usados para encontrar valores altos, mas podem ser usados para valores baixos agrupados. Estou pensando aqui nas estatísticas de varredura, nas estatísticas de soma cumulativa (e outras) usadas para detectar surtos de doenças nos dados de contagem. Exemplos desses métodos estão no pacote de vigilância e no pacote DCluster.
fonte
surveillance
eDCluster
, mas você poderia ser um pouco mais específico? Ambos são pacotes relativamente grandes e seu objetivo parece bastante específico. Não sei por onde começar.Existem muitas opções para isso, mas uma boa: você pode usar a
msExtrema
função nomsProcess
pacote .Editar:
Na análise de desempenho financeiro, esse tipo de análise é frequentemente realizado usando um conceito de "levantamento". O
PerformanceAnalytics
pacote possui algumas funções úteis para encontrar esses vales . Você pode usar o mesmo algoritmo aqui se tratar suas observações como uma série temporal.Aqui estão alguns exemplos de como você pode aplicar isso aos seus dados (onde as "datas" são irrelevantes, mas usadas apenas para pedidos), mas os primeiros elementos no
zoo
objeto são seus dados:fonte
Alguns dos pacotes do biocondutor (por exemplo, ShortRead , Biostrings , BSgenome , IRanges , genomeIntervals ) oferecem facilidades para lidar com posições de genoma ou vetores de cobertura, por exemplo, para ChIP-seq e identificar regiões enriquecidas. Quanto às outras respostas, concordo que qualquer método baseado em observações ordenadas com algum filtro baseado em limites permitiria isolar o sinal baixo dentro de uma largura de banda específica.
Talvez você também possa examinar os métodos usados para identificar as chamadas "ilhas"
fonte