FPKM/TPM 計算に利用する各遺伝子の長さ( non-overlapping exon の長さ)を計算する Python スクリプト

Non-Overlapping Exon Length の計算

遺伝子レベルのマッピング結果から得られたリードカウントデータから FPKM あるいは TPM を計算するとき、遺伝子の長さの定義が問題となる。遺伝子アノテーション(GFF や GTF)にある遺伝子の開始塩基の位置と終了塩基の位置の差をそのまま遺伝子の長さとした場合、その中にイントロンなどの非転写配列が含まれてしまい、正確に PFKM/TPM を計算できなくなる。また、1 遺伝子の遺伝子から複数の転写産物が生成されるので、遺伝子領域には転写産物の種類に応じて、エキソンになったりイントロンになったりする領域が存在する。そのため、すべてのエキソンの長さを足し合わせた長さを遺伝子長とした場合も、正確に FPKM/TPM を計算できない。こうした問題があるため、遺伝子の長さの定義は実に難しい問題である。現在では、完璧な定義は存在しないが、実験目的に応じて、次のように遺伝子長を定義する場合が多い。

  1. 遺伝子の転写産物のうち、もっとも長い転写産物の長さをその遺伝子の長さと定義する。
  2. 遺伝子の転写産物のうち、すべての転写産物の長さの平均値あるいは中央値をその遺伝子の長さと定義する。
  3. 遺伝子領域上、エキソンになりうるすべての領域の長さをその遺伝子の長さと定義する。

3 番目のケースを図示すると次のようになる。

calculation of non-overlapping exons length as a gene length for calculating PFKM or TPM.

これを計算する Python プログラムは次のようにかける。このプログラムの中身について、re.compile('gene_id "(ENSMUSG[0-9]+)";') のところで、文字列パターンマッチングにより遺伝子の名前を取得している。実際に使うとき、必要に応じて、このパターンを修正する必要がある。