DeepVariantはどのようにしてDNA配列からRGB画像を構築しますか?

Aug 19 2020

DeepVariantは、DNAシーケンシングデータから遺伝的変異を呼び出すパイプラインです。

CNNに情報を提供する前の主要なステップは、これらのDNA配列を画像に変換することです。GoogleがDNAデータからRGB画像を構築する理由と方法は不明です。明らかに、DNAは文字が{A、T、C、G}のアルファベット上の文字列です。

単体テストのソースコードに基づいてマッピングがどのように機能するかを理解することはさらに困難です。

論文からの彼らの図では、Aは赤、Cは緑、Gは青、Tは黄色(G + R)ですが、これは彼らがどのように3xNxN画像を構成するかはまだ不明です。


グーグルのブログから編集:

この記事では、6つのチャネルを続けて示しますが、DeepVariantでは、3次元で6つのレイヤーとしてエンコードされ、各テンソルに(高さ、幅、チャネル)に対応する(100、221、6)の形状を与えます。問題のバリアントは常に各パイルアップ画像の中央にあり、ここでは上部に小さな線でマークされています。

チャネルは、以下の順序でグレースケールで表示されます。

基数の読み取り:異なる強度はA、C、G、およびTを表します。

基本品質:シーケンスマシンによって設定されます。白は高品質です。

マッピング品質:アライナーによって設定されます。白は高品質です。

整列のストランド:黒は前方です。白は逆です。

読み取りはバリアントをサポートします:白は読み取りが特定の代替対立遺伝子をサポートすることを意味し、灰色はサポートしないことを意味します。

ベースが参照と異なる:白はベースが参照と異なることを意味し、濃い灰色はベースが参照と一致することを意味します。

回答

1 SmallChess Aug 26 2020 at 07:03

実際、この論文は彼らがそれをどのように行ったかを明らかにしています。補足資料を詳しく読む必要があります。

論文の図では、Aは赤、Cは緑、Gは青、Tは黄色(G + R)ですが、3xNxNの画像がどのようになっているのかはまだ不明です。

RGBでは、各次元はNxN画像です。3次元があるので、3xNxNです。赤い次元はヌクレオチド塩基をコード化するために使用されました。緑のディメンションは、品質スコアをエンコードするために使用されました。最後に、青色の寸法を使用してストランド情報をエンコードしました。

明らかに、DNAは文字が{A、T、C、G}のアルファベット上の文字列です。

かんたんだよ。たくさんの方法があります。ワンホットエンコーディングまたはDeepVariantが使用したものを実行できます。

def get_base_color(base):
    base_to_color = {'A': 250, 'G': 180, 'T': 100, 'C': 30}
    return base_to_color.get(base, 0)
0x90 Aug 23 2020 at 22:48

Devon Ryanのコメントで言及されている補足資料に基づく:

DeepVariantの第2フェーズでは、各候補バリアントの参照と読み取りのサポートをRGB画像にエンコードします。このコンポーネントの擬似コードを以下に示します。これには、画像を構築するためのすべての主要な操作が含まれ、エラー処理を明確にするために省略され、染色体の開始または終了の近くでバリアントが発生する場合などのエッジケースを処理するコード、および必須ではないおよび/または明白な実装が含まれています関数。

これが主な機能です

WIDTH = 221
HEIGHT = 100;
def create_pileup_images(candidate_variants):
 for candidate in candidate_variants:
 for biallelic_variant in split_into_biallelics(candidate):
 start = biallelic_variant.start - (WIDTH-1) / 2
 end = WIDTH - span_start
 ref_bases = reference.get_bases(start, end)
 image = Image(WIDTH, HEIGHT)
 row_i = fill_reference_pixels(ref, image)
 for read in reads.get_overlapping(start, end):
 if row_i < HEIGHT and is_usable_read(read):
 add_read(image, read, row_i)
 row_i += 1
 yield image

def fill_reference_pixels(ref, image):
 for row in range(5):
 for col in range(WIDTH):
 alpha = 0.4
 ref_base = ref[col]
 red = get_base_color(ref_base)
 green = get_quality_color(60) # The reference is high quality
 blue = get_strand_color(True) # The reference is on the positive strand
 image[row, col] = make_pixel(red, green, blue, alpha)
 return 5