macでインフォマティクス

macでインフォマティクス

HTS (NGS) 関連のインフォマティクス情報についてまとめています。

配列比較結果を視覚化する

2020 11/2 誤字修正

 

先日紹介したneedleallやvsearchによるall versus allの配列比較のテキスト出力をもとに、ヒートマップで視覚化する。ここではggplot2パッケージを使う。

 

EMBOSS needleallによるall versus allの配列比較

 

 

1、配列の準備

all versus allの配列比較に使う塩基配列は、ある程度長くて全長がよく似ていれば何でも良いが、ここでは大腸菌赤痢菌の16S rRNA遺伝子を比較してみる。(このブログでは何でも良いが)一般論としてよく分からない株を比較しても議論できないので、まずLPSNでEscherichia coliShigella dysenteriae のタイプストレインを調べ、その遺伝子を使う。

Escherichia coli (Migula 1895) 、1895年に"Bacillus coli"として再分類(wiki))は

ATCC 11775; CCUG 24; CCUG 29300; CIP 54.8; DSM 30083; JCM 1649; LMG 2092; NBRC 102203; NCCB 54008; NCTC 9001、がタイプストレインとして登録されている。

Shigella dysenteriae (Shiga 1897)は

ATCC 13313; CIP 57.28; DSM 4781; NCTC 4837、がタイプストレインとして登録されている。

NCBIのbrowse by organism機能(紹介)を使って、これらのタイプストレインの利用可能なゲノムデータを探した。Escherichia coliで探すといきなりATCC 11775の完全長ゲノムが見つかった(accession: NZ_CP033092のバージョン2であるNZ_CP033092.2)。これをダウンロードした(*2)。

f:id:kazumaxneo:20201030193857p:plain

(K-12は病原性がなくて弱い大腸菌

次にShigella dysenteriaeだが、ATCC 13313の完全長ゲノムが登録されている(NZ_CP026774.1)。これをダウンロードする。

f:id:kazumaxneo:20201030195508p:plain

 

ここでは2つのゲノムファイルだけ取ってくれば良いので問題ないが、タイプストレインのゲノムを自動で大量に取ってくるのは意外にも難しい(*1)。

 

ダウンロードしたゲノムからbarrnap(紹介)を使ってSSU rRNA(以後16S rRNA)を取り出す(16S rRNA配列も複数登録されており、アノテーションファイル中にも当然存在すると思われるが、ここでは演習としてゲノムから取り出す)。トラブルの元なのでファイル名に空白は入れないこと。

#E.coli_ATCC11775
barrnap --outseq E.coli_ATCC11775_rRNA.fna --kingdom bac --threads 4 E.coli_ATCC11775.fna > E.coli_ATCC11775_rRNAs.gff

#S.dysenteriae_ATCC13313
barrnap --outseq S.dysenteriae_rRNAs.fa --kingdom bac --threads 4 S.dysenteriae_ATCC13313.fna > S.dysenteriae_rRNAs.gff
  • --kingdom Kingdom: euk mito bac arc (default 'bac')
  • --lencutoff [n.n] Proportional length threshold to label as partial (default '0.8')
  • --reject [n.n] Proportional length threshold to reject prediction (default '0.25')
  • --evalue [n.n] Similarity e-value cut-off (default '1e-06')

barrnapの出力から16S rRNAを取り出す。S.dysenteriae_ATCC13313ゲノムからは16S rRNAが7コピー見つかった。

f:id:kazumaxneo:20201030201147p:plain

(barrnapで撮り出されたrRNAは向きが統一されており、向きを考えずそのまま配列比較に使える)

E.coli_ATCC11775_rRNAsゲノムからも16S rRNAは7コピー見つかった。

f:id:kazumaxneo:20201030201325p:plain

16S rRNAの配列だけを取り出し、16S.faとして1つのファイルに保存した。長さを確認する。

$ s 16S.fa 

file    format  type  num_seqs  sum_len  min_len  avg_len  max_len

16S.fa  FASTA   DNA         14   21,532    1,538    1,538    1,538

全て1,538 bp

ヘッダを確認する。

$ grep -n ">" 16S.fa 

$ grep -n ">" 16S.fa 

1:>16S_rRNA::NZ_CP026774.1:2536626-2538164(+)

3:>16S_rRNA::NZ_CP026774.1:2636479-2638017(+)

5:>16S_rRNA::NZ_CP026774.1:2768885-2770423(+)

7:>16S_rRNA::NZ_CP026774.1:2810847-2812385(+)

9:>16S_rRNA::NZ_CP026774.1:3061594-3063132(+)

11:>16S_rRNA::NZ_CP026774.1:3646780-3648318(+)

13:>16S_rRNA::NZ_CP026774.1:1662010-1663548(-)

15:>16S_rRNA::NZ_CP033092.2:458561-460099(+)

17:>16S_rRNA::NZ_CP033092.2:1285125-1286663(+)

19:>16S_rRNA::NZ_CP033092.2:3780640-3782178(-)

21:>16S_rRNA::NZ_CP033092.2:4551515-4553053(-)

23:>16S_rRNA::NZ_CP033092.2:4591684-4593222(-)

25:>16S_rRNA::NZ_CP033092.2:4844587-4846125(-)

27:>16S_rRNA::NZ_CP033092.2:4726193-4727731(-)

grepで検索するとき、grep -n > 16S.fa としてはならない。

 

 

2、16S配列の総当たり比較

ここではvsearchを使う。 

vsearch --allpairs_global 16S.fa --id 0.9 --uc vsearch_output

$ head vsearch_output

f:id:kazumaxneo:20201030203413p:plain

 

vsearch_outputの4,9,10列目を取り出す。不要な行(先頭がアスタリスク)があるので、パイプしてgrepで除く(grep -vでマッチは除外)。

cut -f 9,10,4 vsearch_output | grep -v ^* - > seq_ide

$ head -n 5 seq_ide 

99.2 16S_rRNA::NZ_CP026774.1:1662010-1663548(-) 16S_rRNA::NZ_CP033092.2:4726193-4727731(-)

99.1 16S_rRNA::NZ_CP026774.1:1662010-1663548(-) 16S_rRNA::NZ_CP033092.2:458561-460099(+)

99.1 16S_rRNA::NZ_CP026774.1:1662010-1663548(-) 16S_rRNA::NZ_CP033092.2:1285125-1286663(+)

99.1 16S_rRNA::NZ_CP026774.1:1662010-1663548(-) 16S_rRNA::NZ_CP033092.2:3780640-3782178(-)

99.1 16S_rRNA::NZ_CP026774.1:1662010-1663548(-) 16S_rRNA::NZ_CP033092.2:4551515-4553053(-)

遺伝子名に冗長な情報が多く見えづらい。

 

見づらいのでヘッダの不要な情報を消す。アクセッションIDも株名に置換する。

sed -e "s/16S_rRNA:://g" \
-e s/$'NZ_CP033092.2:'/S.dysenteriae_/g \
-e s/$'NZ_CP026774.1:'/E.coli_/g \
seq_ide > seq_rename 

$ head -n 5 seq_rename 

99.2 E.coli_1662010-1663548(-) S.dysenteriae_4726193-4727731(-)

99.1 E.coli_1662010-1663548(-) S.dysenteriae_458561-460099(+)

99.1 E.coli_1662010-1663548(-) S.dysenteriae_1285125-1286663(+)

99.1 E.coli_1662010-1663548(-) S.dysenteriae_3780640-3782178(-)

99.1 E.coli_1662010-1663548(-) S.dysenteriae_4551515-4553053(-)

 

seq_renameを開き、先頭行にidentity<tab>genome1<tab>genome2をつけて上書き保存した。

f:id:kazumaxneo:20201030212110p:plain

 

 

3、結果の視覚化

 Rのggplot2を使う。

Rのコンソールに切り替え、ファイルを読み込む。

#R
#データの読み込み(カレントにないならフルパスで指定)
input <- read.table("seq_rename", header=T, sep="\t")

> head(input)

  identity                   genome1                          genome2

1     99.2 E.coli_1662010-1663548(-) S.dysenteriae_4726193-4727731(-)

2     99.1 E.coli_1662010-1663548(-)   S.dysenteriae_458561-460099(+)

3     99.1 E.coli_1662010-1663548(-) S.dysenteriae_1285125-1286663(+)

4     99.1 E.coli_1662010-1663548(-) S.dysenteriae_3780640-3782178(-)

5     99.1 E.coli_1662010-1663548(-) S.dysenteriae_4551515-4553053(-)

6     99.1 E.coli_1662010-1663548(-) S.dysenteriae_4591684-4593222(-)

視覚化する。

#ggplot2
library("ggplot2")

#default settings
ggplot(data = input, aes(x=genome1, y=genome2, fill=identity)) + geom_tile()

#カスタム。99-100%、色は青。内部に数値。figのraioを1
ggplot(data = input, aes(x=genome1, y=genome2, fill=identity)) + geom_tile(color = "white")+
scale_fill_gradient2(low = "#ffffff", high = "#0000cd", mid = "#ffffff",
midpoint = 99.5, limit = c(99,100), space = "Lab",
name="16S rRNA\nsequence identity (%)") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 90, vjust = 1,
size = 9, hjust = 1))+
coord_fixed() + theme(aspect.ratio = 1) +
geom_text(aes(label = identity), size = 3)

 出力された。一番低い組み合わせでも99.1%の配列同一性があった。

f:id:kazumaxneo:20201030213336p:plain

一部欠損があるが、これはvsearchが計算していない配列の組み合わせがあるため。EMBOSS neddleallではこうゆうことはなくて、14x14比較なら196行出力(& 最後に4行のコメント行)される。また、色が二層性で綺麗に分かれてしまったのは、シゲラ のゲノムとE.coliのゲノムの16S rRNAはいずれのコピーも互いにペアワイズ比較すると99.1程度の配列同一性しかなく、同じゲノム内のコピーはほぼ100%合致したため。比較するデータがヒートマップで視覚化するには不向きだったということになる(= 総当たりの表を示せば議論できる。あえてヒートマップで視覚化する必要はない)。

 

 

2020 10/31 追記

もう少し距離がある配列間の相同性を視覚化してみる。脊索動物のピルビン酸デヒドロゲナーゼ複合体サブユニット遺伝子5つを使う。

#1 配列のall vs all比較
needleall PDHA1proteins.faa PDHA1proteins.faa out -gapopen 10.0 -gapextend 0.5 -aformat pair

#2 scirptを書いてidentitywの数値を取り出す("# Identity"で始まるの行の()内がIdentity、"# 1:"が比較元の名前、"# 2:"が比較先の名前
perl extracct_best_hit.pl -i out -o out

2の出力

genome1 genome2 identity
NP_000275.1[Homo NP_000275.1[Homo 100
XP_010641961.1[Fukomys NP_000275.1[Homo 99.2
XP_006911688.1[Pteropus NP_000275.1[Homo 97.4
XP_021570775.1[Carlito NP_000275.1[Homo 95.8
PNI15832.1 NP_000275.1[Homo 93.8
NP_000275.1[Homo XP_010641961.1[Fukomys 99.2
XP_010641961.1[Fukomys XP_010641961.1[Fukomys 100
XP_006911688.1[Pteropus XP_010641961.1[Fukomys 98.2
XP_021570775.1[Carlito XP_010641961.1[Fukomys 95.5
PNI15832.1 XP_010641961.1[Fukomys 93
NP_000275.1[Homo XP_006911688.1[Pteropus 97.4
XP_010641961.1[Fukomys XP_006911688.1[Pteropus 98.2
XP_006911688.1[Pteropus XP_006911688.1[Pteropus 100
XP_021570775.1[Carlito XP_006911688.1[Pteropus 93.8
PNI15832.1 XP_006911688.1[Pteropus 91.3
NP_000275.1[Homo XP_021570775.1[Carlito 95.8
XP_010641961.1[Fukomys XP_021570775.1[Carlito 95.5
XP_006911688.1[Pteropus XP_021570775.1[Carlito 93.8
XP_021570775.1[Carlito XP_021570775.1[Carlito 100
PNI15832.1 XP_021570775.1[Carlito 90
NP_000275.1[Homo PNI15832.1 93.8
XP_010641961.1[Fukomys PNI15832.1 93
XP_006911688.1[Pteropus PNI15832.1 91.3
XP_021570775.1[Carlito PNI15832.1 90
PNI15832.1 PNI15832.1 100

 

Rのコンソールに移動する。上の表をコピペ読み込み。

#mac
input <- read.table(pipe("pbpaste"), header = TRUE)

#windows
input <- read.table("clipboard"), header = TRUE)

#またはファイルinput.tsvに保存し、データフレームに読み込む。
input <- read.table("input.tsv", header=T, sep="\t")

#視覚化する
#ggplot2
library("ggplot2")

#default settings
ggplot(data = input, aes(x=genome1, y=genome2, fill=identity)) + geom_tile()

#custom1 - 90-100%、青のグラデーション。内部にidentityの数値、figの比率は1
ggplot(data = input, aes(x=genome1, y=genome2, fill=identity)) + geom_tile(color = "white")+
scale_fill_gradient2(low = "#ffffff", high = "#0000cd", mid = "#ffffff",
midpoint = 93, limit = c(90,100), space = "Lab",
name="PDHA\nsequence identity (%)") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 90, vjust = 1,
size = 9, hjust = 1))+
coord_fixed() + theme(aspect.ratio = 1) +
geom_text(aes(label = identity), size = 5)

 #default settings

f:id:kazumaxneo:20201031160246p:plain

#custom1

f:id:kazumaxneo:20201031160720p:plain

クラスタリングしたり本格的に計算してから視覚化する場合、データフレームをas.matrixで行列に変換してから進める。

 

参考

大腸菌研究の歴史

https://www.sbj.or.jp/wp-content/uploads/file/sbj/9010/9010_yomoyama-1.pdf

 

関連


 

*1

最近出たGTDBの論文(DOI: https://doi.org/10.1038/s41587-020-0501-8)では、LPSNやGTDB、bacdiveとの識別子の互換性が乏しい点についての苦労話がある。現状、タイプストレインのゲノムだけ公共データベースから大量にfetchするのは骨が折れる。

 

*2

タイプストレインは有用だが、完全長ゲノム情報が利用できない株がたくさん存在する。

乖離している理由だが、それには第一に、いわゆる細菌学は百年よりずっと昔から続く歴史ある研究分野であるのに対し、細菌ゲノムをサンガーシークエンシングやHTSのシークエンサーで読んでゲノムベースで取り組む研究手法は、登場から数十年程度の歴史しかない、相対的にずっと新しい研究分野であることを考慮する必要がある。