質問:
位相/スイッチエラー率を計算するための検索ツール
Wouter De Coster
2019-03-13 02:53:51 UTC
view on stackexchange narkive permalink

真理vcfファイルとテストvcfファイルを指定して、位相/スイッチエラー率を計算するツールを探しています。 WhatsHapを使用してvcfのフェーズを実行し、その結果を、私が持っているグラウンドトゥルースフェーズのvcfと比較したいと思います。ツールが見つからないので、自分で書きたくありません。かなり一般的なことのようです...それは存在すると思いますが、今日のgoogle-fuは弱いです。

テスト行の例:

  #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT samplechr10100588。 GA。 PASS AF = 0.18; AC = 1; NS = 150; AN = 2; EAS_AF = 0.14; EUR_AF = 0.39; AFR_AF = 0.08; AMR_AF = 0.31; SAS_AF = 0.2; VT = SNP; DP = 11907 GT:PS 1 | 0 :48005chr10102385。 AG。 PASS AF = 0.07; AC = 1; NS = 150; AN = 2; EAS_AF = 0.02; EUR_AF = 0.0; AFR_AF = 0.1; AMR_AF = 0.19; SAS_AF = 0.01; VT = SNP; DP = 22665 GT:PS 0 | 1 :48005chr10105170。 GA。 PASS AF = 0.03; AC = 1; NS = 150; AN = 2; EAS_AF = 0.02; EUR_AF = 0.0; AFR_AF = 0.0; AMR_AF = 0.19; SAS_AF = 0.0; VT = SNP; DP = 17140 GT:PS 0 | 1 :48005chr10105365。 GT。 PASS AF = 0.19; AC = 1; NS = 150; AN = 2; EAS_AF = 0.14; EUR_AF = 0.39; AFR_AF = 0.09; AMR_AF = 0.31; SAS_AF = 0.2; VT = SNP; DP = 21845 GT:PS 1 | 0 :48005chr10106057。 TC。 PASS AF = 0.13; AC = 1; NS = 150; AN = 2; EAS_AF = 0.02; EUR_AF = 0.0; AFR_AF = 0.32; AMR_AF = 0.19; SAS_AF = 0.01; VT = SNP; DP = 22559 GT:PS 0 | 1 :48005  

真実の行の例

  #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT samplechr10100554。 C CT、CTT30。 。 GT:AD 1 | 2:0,1,1chr10100588。 G A30。 。 GT:AD 0 | 1:1,1chr10102385。 A G30。 。 GT:AD 1 | 0:1,1chr10102636。 T C30。 。 GT:AD 1 | 1:0,2chr10102757。 T C30。 。 GT:AD 0 | 1:1,1
chr10104815。 GCC G、GC30。 。 GT:AD 2 | 1:0,1,1chr10105170。 G A30。 。 GT:AD 1 | 0:1,1chr10105365。 G T30。 。 GT:AD 0 | 1:1,1chr10106057。 T C30。 。 GT:AD 1 | 0:1,1chr10106110。 C G30。 。 GT:AD 1 | 1:0,2chr10106261。 A G30。 。 GT:AD 1 | 0:1,1chr10108612。 T G30。 。 GT:AD 1 | 0:1,1chr10108646。 AT30。 。 GT:AD 0 | 1:1,1chr10108834。 G A30。 。 GT:AD 1 | 0:1,1chr10110840。 C T30。 。 GT:AD 1 | 1:0,2chr10111743。 AT30。 。 GT:AD 1 | 0:1,1chr10112016。 T A30。 。 GT:AD 1 | 0:1,1chr10112262。 C T30。 。 GT:AD 1 | 1:0,2chr10113006。 C T30。 。 GT:AD 0 | 1:1,1chr10113031。 G A30。 。 GT:AD 0 | 1:1,1chr10113136。 G A30。 。 GT:AD 1 | 0:1,1chr10113359。 A T30。 。 GT:AD 1 | 1:0,2chr10113583。 C G30。 。 GT:AD 0 | 1:1,1chr10113997。 G C30。 。 GT:AD 1 | 1:0,2  
テストする各ファイルの数行を教えてください。 2つのvcfファイルの同じバリアントの遺伝子型フィールドを比較したいだけですか?
質問を編集して、例の行を含めました。トゥルースファイルには、すべてのバリアントが段階的に含まれています(合成二倍体メソッドhttps://www.nature.com/articles/s41592-018-0054-7およびhttps://github.com/lh3/CHM-evalに基づいて作成されています) / tree / master / dip-call)。
1 回答:
terdon
2019-03-13 18:32:41 UTC
view on stackexchange narkive permalink

ファイルが表示どおりであり、遺伝子型フィールドが常にサンプル情報フィールドの最初のエントリ(10番目)であると仮定すると、単純なawkスクリプトを使用してこれを直接行うことができます:

   $ awk -F "\ t" -vOFS = "\ t" 'BEGIN {print "#CHROM"、 "POS"、 "ID"、 "REF"、 " ALT "、" Truth "、" Test "} {if(/ ^ [^#] /){var = $ 1 $ 2 $ 4 $ 5; gt = substr($ 10,1,3); if(NR == FNR){a [var] = gt; next;} if(var in && a [var]!= gt){print $ 1、$ 2、$ 3、$ 4、$  span> 5、gt、a [var]}}} 'truth.vcf test.vcf #CHROM POS ID REF ALT Truth Testchr10100588。 G A 1 | 0 0 | 1chr10102385。 A G 0 | 1 1 | 0chr10105170。 G A 0 | 1 1 | 0chr10105365。 G T 1 | 0 0 | 1chr10106057。 TC 0 | 1 1 | 0  

わかりやすくするために、スクリプトを別々の行に分割します(端末に直接コピーして貼り付けることもできます):

  awk -F "\ t" -vOFS = "\ t" 'BEGIN {print "#CHROM"、 "POS"、 "ID"、 "REF"、 "ALT"、 "Truth"、 "Test"} {if(/ ^ [^#] /){var =  $ 1 $  span> 2  $ 4 $  span> 5; gt = substr( $ 10,1,3); if(NR == FNR){a [var] = gt;次; } if(var in && a [var]!= gt){print $ 1、$ 2、$ 3、$ 4、$  span> 5、gt、a [var]}}} 'truth.vcf test.vcf  

基本的な考え方は次のとおりです。

  • awk -F "\ t" -vOFS = "\ t" :入力を設定してフィールドセパレータをタブに出力します。
  • BEGIN {print "#CHROM ...} :ヘッダーを出力します。
  • if(/ ^ [^#] /){:入力vcfファイルのヘッダー行をスキップします
  • var = $ 1 $ 2 $ 4 $ 5 :このバリアントの「署名」を取得します、染色体、位置、参照、およびaltフィールドを連結することによって。
  • gt = substr($ 10,1,3); :遺伝子型の値を取得します。
  • if(NR == FNR){:これが最初のファイルの場合/
  • a [var] = gt; next :このバリアントの遺伝子型を保存し、次の行にスキップします。
  • if(var in && a [var]!= gt){:this前のブロックの「次」のため、パーツは2番目のファイルに対してのみ実行されます。このバリアントが真理セットにあり、その遺伝子型がテストセットと同じでない場合は、バリアントと2つの遺伝子型を印刷します。

必要な場合エラー率は、次のようにスクリプトを拡張できます。

  awk -F "\ t" -vOFS = "\ t" 'BEGIN {print "#CHROM"、 "POS"、 "ID" 、 "REF"、 "ALT"、 "Truth"、 "Test"} {if(/ ^ [^#] /){var =  $ 1 $  span> 2  $ 4 $  span> 5; gt = substr( $ 10,1,3); if(NR == FNR){a [var] = gt;次; } tot ++; if(var in && a [var]!= gt){bad ++; print $ 1、$ 2、$ 3、$ 4、$  span> 5、gt、a [var]}}} END {printf "正解:%s of%s(%s%)\ n"、tot-bad、tot 、(tot-bad)* 100 / tot; printf "Wrong:%s of%s(%s%)\ n"、bad、tot、bad * 100 / tot;} 'truth.vcf test.vcf  

あなたの例では印刷するデータセット:

  #CHROM POS ID REF ALT Truth Testchr10100588。 G A 1 | 0 0 | 1chr10102385。 A G 0 | 1 1 | 0chr10105170。 G A 0 | 1 1 | 0chr10105365。 G T 1 | 0 0 | 1chr10106057。 T C 0 | 1 1 | 0正解:0/5(0%)不正解:5/5(100%) 
テストVCFでは、「PS」は「フェーズセット」を意味します。フェーズセット間の切り替えはエラーとしてカウントされません。一般に、評価には適切なスクリプトが必要です。おそらく入力が頻繁に変更されるため、一般的なスクリプトはありません。
@user172818ああ、すごい、ありがとう!私はこれまで `PS`に出会ったことがありませんでした。これは、私の単純なアプローチが基本的に役に立たないことを意味しますか?
「PS」がかからないときに役立つと思います。たとえば、Hi-Cフェージングは​​染色体全体のフェージングを与えると考えられています。 「PS」は必要ありません。その場合、スクリプトが適用されます。
はい、真理セットには「左」と「右」のハプロタイプ(父方または母方)がありますが、テストセットはハプロタイプ/フェーズブロックに分割されます。ブロック内では、どのSNPが同じハプロタイプにあるか(またはそうでないか)を把握できますが、ブロック間では把握できません。私の例は完璧ではありませんが、ここでは100%正しくフェーズされていると思います。


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 4.0ライセンスに感謝します。
Loading...