Questão:
Como posso extrair apenas inserções de um arquivo VCF?
blmoore
2017-06-16 15:53:50 UTC
view on stackexchange narkive permalink

Estou tentando criar um subconjunto de um arquivo VCF padrão para gerar um que inclua apenas inserções (ou seja, não indels).

Posso obter parte do caminho com:

  bcftools view -v indels <vcf> | awk '{if (length ($ 4) == 1) print}'  

No entanto, isso não pegaria uma inserção que fazia parte de um registro multi-alélico com uma inserção e exclusão, onde o comprimento de referência seria maior que 1 bp. Potencialmente, então, uma maneira de ir é uma cadeia de decomposição, normalização e a mesma filtragem de comprimento de referência - certamente há uma maneira melhor em um dos muitos utilitários de manipulação de VCF?

Qual é a aparência do seu VCF? Muitas ferramentas produzem VCFs que incluem o tipo de variante.
É seguro presumir que não há uma anotação de tipo que você possa simplesmente apagar, embora executar uma ferramenta de anotação primeiro possa ser uma resposta.
Bem, as coisas nunca são tão fáceis. Ainda assim, você poderia [editar] sua pergunta e dar um exemplo do tipo de registro multialélico em que está pensando? O ideal é nos dar um exemplo mínimo de seu arquivo vcf e incluir algumas entradas que deseja manter e algumas que deseja ignorar e mostrar a saída desejada. Dessa forma, podemos usar seu exemplo para testar nossas soluções e podemos ter certeza de que estamos dando o que você precisa.
Cinco respostas:
user172818
2017-06-16 19:45:22 UTC
view on stackexchange narkive permalink

Uma linha única:

  zcat my.vcf.gz | perl -ane '$ x = 0; para $ y (split (",", $ F [4])) {$ x = 1 if length ($ y) >length ($ F [3])} print if / ^ # / || $ x ' 

ou de maneira equivalente

  zcat my.vcf.gz | perl -ane '$ x = 0; map {$ x = 1 if length>length ($ F [3])} split (",", $ F [4]); imprimir if / ^ # / || $ x'  

Para operações VCF simples, geralmente recomendo escrever um script. Isso pode ser mais rápido do que aqueles que usam bibliotecas pesadas. Com um script, você analisa apenas os campos de seu interesse; a maioria das bibliotecas analisa desnecessariamente todos os campos.


Em uma nota relacionada, eu recomendo não para decompor sites multi-alélicos, a menos que seja necessário. A decomposição é complicada, torna o VCF mais difícil de analisar e entender e pode ser uma fonte potencial de erros. Aqui está um exemplo:

  #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT S1 S2 S3 S411 101. GCGT G, GCGA, GTGA, CCGT 199 PASS. GT 0/1 1/2 2/3 2/4  

vt decompor + normalizar produz o seguinte VCF:

  #CHROM POS ID REF ALT QUAL FORMATO DE INFORMAÇÕES DO FILTRO S1 S2 S3 S411 101. GCGT G 199 PASS. GT 0/1 1 /. ./. ./.11 101. G C 199 PASS. GT 0 /. ./. ./. ./111 102. CGT TGA 199 PASS. GT 0 /. ./. ./1 ./.11 104. T A 199 PASS. GT 0 /. ./1 1 /. 1 /.  

Em teoria, você pode reconstruir o VCF original a partir desta saída. No entanto, é muito desafiador para um programa fazer isso. Quando você calcula a frequência do alelo linha por linha, este VCF fornecerá resultados errados. bcftools norm -m- substitui "." com "0". Você pode obter uma frequência de alelo ALT correta da saída do bcftools, mas uma frequência de alelo REF incorreta. Além disso, vt também é imperfeito porque "CGT => TGA" não é decomposto.

Minha saída preferida é:

  #CHROM POS ID REF ALT QUAL INFO FORMATO DO FILTRO S1 S2 S3 S411 101. GCGT G, <M> 0. . GT 0/1 1/2 2/2 2/211 101. G C, <M> 0. . GT 0/2 2/0 0/0 0/111 102. C T, <M> 0. . GT 0/2 2/0 0/1 0/011 104. T A, <M> 0. . GT 0/2 2/1 1/1 1/0  

Aqui, usamos um alelo simbólico <M> para representar "outro alelo ALT". Você pode calcular a frequência do alelo olhando para uma linha e não vai confundir outros alelos ALT com REF. O bgt pode produzir esse VCF indiretamente. No entanto, ele descarta todas as INFO, portanto, também não é uma solução prática.

Em resumo, é muito difícil decompor sítios multi-alélicos. Quando você faz a decomposição errada, suas análises downstream podem ser imprecisas. A decomposição deve ser usada com cuidado.

blmoore
2017-06-16 16:24:00 UTC
view on stackexchange narkive permalink

Um método é decompor registros multi-alélicos de modo que sejam representados como um alelo, um registro usando vt ou semelhante:

  bcftools view -v indels <vcf> | decompor vt - | bcftools view -H | awk '{if (length ($ 5) >length ($ 4)) print}'  

Alguns alelos decompostos virão com excesso de preenchimento de referência. Para deslocar para a esquerda e apará-los, adicione uma etapa normalizar (NB, correspondendo-os de volta ao VCF de entrada torna-se não trivial):

  bcftools view -v indels <vcf> | decompor vt - | vt normalize -r <reference.fasta - | awk '{if (length ($ 4) == 1) print}'  

editar: Como gringer sugere, isso também pode ser feito sem vt:

  visualização bcftools -Ou -v indels <vcf> | bcftools norm -Ou -Nm - | bcftools view -H | awk '{if (length ($ 5) >length ($ 4)) print}'  

Para incluir também alelos complexos, use view -V snps (! snvs) em vez de -v indels

`bcftools norm` também irá dividir registros multi-alélicos com a opção` -m -`
JRodrigoF
2018-06-29 22:03:57 UTC
view on stackexchange narkive permalink

Apenas para destacar que todas as etapas podem ser executadas com os recursos do bcftools, e como não posso apenas comentar sobre a resposta de @blmoore:

  visão bcftools --types indels <vcf> | bcftools norm -m - | filtro bcftools --include 'strlen (REF) <strlen (ALT)' | bcftools view -H  

mais funções bult-in para 'filtro bcftools' aqui

Muito bom, eu só tinha usado o modo de exibição bcftools para descompactar e, em seguida, analisar a saída no cabeçalho ou nos registros de dados.
Pierre
2017-06-16 16:24:31 UTC
view on stackexchange narkive permalink

Usando vcffilterjs

  • obtenha o comprimento do REF;
  • loop sobre o ALT, ignore o simbólico
  • aceite a variante se for uma inserção, eq: len (ALT)> len (REF)

.

  java -jar dist / vcffilterjs.jar -e 'função aceitar (vc) {var a = vc.getAlleles (); var lenRef = a.get (0) .length (); for (i = 1; i<a.size (); ++ i) {var alt = a.get (i); if (alt.isSymbolic ()) continue; var lenAlt = alt.length (); if (lenRef<lenAlt) retorna verdadeiro; } retorna falso; } aceitar (variante); ' input.vcf  

.

Alex Reynolds
2017-06-17 04:03:40 UTC
view on stackexchange narkive permalink

Se você estiver fazendo operações de conjunto, pode usar vcf2bed :

  $ vcf2bed --insertions < in.vcf > out.bed  

Com base na especificação VCF v4.2, --snvs , --insertions e - -deletions são opções disponíveis para filtrar a entrada. Em cada caso, o comprimento dos alelos de referência e alternativo é usado para determinar qual tipo de variante está sendo manipulado.



Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...