4. ゲノム解析技術

4.1 配列解析パイプライン

前処理フェーズ:

def preprocess_sequence(raw_sequence):
    # 品質管理
    quality_filtered = quality_control(raw_sequence)
    
    # アダプター除去
    trimmed = adapter_trimming(quality_filtered)
    
    # 重複除去
    deduplicated = remove_duplicates(trimmed)
    
    return deduplicated

エラーハンドリングを含む完全な実装:

import logging
import os
from typing import List, Dict, Optional, Tuple
from dataclasses import dataclass
from Bio import SeqIO
import pysam
import numpy as np

# ロギング設定
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

@dataclass
class QualityMetrics:
    """品質管理メトリクス"""
    total_reads: int
    passed_reads: int
    mean_quality: float
    q20_percentage: float
    q30_percentage: float
    gc_content: float

class SequenceAnalysisPipeline:
    """エラーハンドリングを含む配列解析パイプライン"""
    
    def __init__(self, min_quality: int = 20, min_length: int = 50):
        self.min_quality = min_quality
        self.min_length = min_length
        
    def quality_control(self, fastq_file: str) -> Tuple[str, QualityMetrics]:
        """
        品質管理とフィルタリング
        
        Args:
            fastq_file: 入力FASTQファイル
            
        Returns:
            tuple: (フィルタ済みファイル名, 品質メトリクス)
        """
        try:
            output_file = fastq_file.replace('.fastq', '_filtered.fastq')
            
            total_reads = 0
            passed_reads = 0
            quality_scores = []
            gc_counts = []
            
            with open(output_file, 'w') as out_handle:
                for record in SeqIO.parse(fastq_file, 'fastq'):
                    total_reads += 1
                    
                    # 品質スコアの計算
                    quals = record.letter_annotations['phred_quality']
                    mean_qual = np.mean(quals)
                    
                    # 長さチェック
                    if len(record.seq) < self.min_length:
                        logger.debug(f"Read {record.id} too short: {len(record.seq)}")
                        continue
                    
                    # 品質チェック
                    if mean_qual < self.min_quality:
                        logger.debug(f"Read {record.id} low quality: {mean_qual:.2f}")
                        continue
                    
                    # GC含量計算
                    gc_count = record.seq.count('G') + record.seq.count('C')
                    gc_content = gc_count / len(record.seq)
                    
                    # フィルタを通過
                    passed_reads += 1
                    quality_scores.extend(quals)
                    gc_counts.append(gc_content)
                    
                    # 出力
                    SeqIO.write(record, out_handle, 'fastq')
            
            # メトリクス計算
            if passed_reads == 0:
                raise ValueError("No reads passed quality filters")
            
            quality_array = np.array(quality_scores)
            metrics = QualityMetrics(
                total_reads=total_reads,
                passed_reads=passed_reads,
                mean_quality=np.mean(quality_array),
                q20_percentage=np.sum(quality_array >= 20) / len(quality_array) * 100,
                q30_percentage=np.sum(quality_array >= 30) / len(quality_array) * 100,
                gc_content=np.mean(gc_counts)
            )
            
            logger.info(f"Quality control completed: {passed_reads}/{total_reads} reads passed")
            return output_file, metrics
            
        except FileNotFoundError:
            logger.error(f"Input file not found: {fastq_file}")
            raise
        except Exception as e:
            logger.error(f"Quality control failed: {e}")
            raise

マッピングフェーズ:

  • BWA: Burrows-Wheeler Alignerによる高速マッピング
  • SAMtools: マッピング結果の操作・統計
  • GATK: 変異検出パイプライン

後処理フェーズ:

  • 変異アノテーション: 機能予測・病原性評価
  • 品質管理: 偽陽性率の制御
  • 統計解析: 有意性検定・多重検定補正

臨床診断への直接貢献: 標準化されたパイプラインにより、ゲノムデータから臨床的に有用な情報を確実に抽出できる。品質管理プロセスにより、偽陽性・偽陰性を最小化し、診断精度を向上させる。自動化により、解析時間を数週間から数時間に短縮し、緊急症例での迅速診断を可能にする。標準化により、施設間での結果の一貫性を確保し、医療の質を向上させる。

4.2 変異検出と機能解析

体細胞変異検出:

class SomaticVariantCaller:
    """腫瘍-正常ペアからの体細胞変異検出"""
    
    def __init__(self, tumor_bam, normal_bam, reference):
        self.tumor_bam = tumor_bam
        self.normal_bam = normal_bam
        self.reference = reference
    
    def call_variants(self, min_vaf=0.05, min_depth=20):
        """
        体細胞変異の検出
        
        Args:
            min_vaf: 最小変異アレル頻度
            min_depth: 最小リード深度
        """
        # MuTect2スタイルの変異検出
        variants = []
        
        # 腫瘍特異的変異の統計的検定
        # Fisher's exact testによる有意性評価
        
        return variants

構造変異(SV)検出:

  • 欠失・挿入・逆位・転座の検出
  • Split-read/Paired-end情報の統合
  • CNV(コピー数変異)解析

変異の機能的影響予測:

  • SIFT/PolyPhen-2による病原性予測
  • VEP(Variant Effect Predictor)
  • スプライシング影響予測

4.3 ロングリードシークエンシング

PacBio/Oxford Nanopore技術:

  • リード長: 10kb-100kb+
  • エラー率: 5-15%(生データ)
  • リアルタイムシークエンシング

アセンブリアルゴリズム:

class LongReadAssembler:
    """ロングリードアセンブリ"""
    
    def overlap_layout_consensus(self, reads):
        # 1. オーバーラップグラフ構築
        overlap_graph = self.build_overlap_graph(reads)
        
        # 2. レイアウト(グラフ簡約化)
        layout = self.simplify_graph(overlap_graph)
        
        # 3. コンセンサス配列生成
        consensus = self.generate_consensus(layout)
        
        return consensus

ハプロタイプ分離アセンブリ:

  • 父母由来の染色体を分離
  • HiFiリードによる高精度化
  • 構造変異の正確な検出

🎯 認定試験ポイント

重要概念チェックリスト

ゲノム解析基礎 ⭐⭐⭐

  • ゲノムサイズ・遺伝子数・非コード領域の割合をヒトで把握している
  • SNP・Indel・CNV・構造変異の定義と検出手法を理解している
  • 遺伝率とは何か、その推定方法を説明できる
  • GWAS(ゲノムワイド関連解析)の基本原理と限界を理解している

配列解析技術 ⭐⭐⭐

  • Sanger法と次世代シークエンシング技術の特徴比較ができる
  • リードマッピング・アセンブリの基本戦略を理解している
  • ペアエンドリード・ロングリードの利点と使い分けを把握している
  • カバレッジ・精度・N50等の品質指標の意味を説明できる

変異解析 ⭐⭐

  • SNP・Indelコーリングのアルゴリズムと品質フィルタリング
  • アレル頻度・ハーディー・ワインベルグ平衡の計算
  • 連鎖不平衡(LD)とハプロタイプの概念
  • 集団遺伝学パラメータ(FST、Tajima’s D等)の解釈

アセンブリ手法 ⭐⭐

  • グリーディアルゴリズムとグラフベースアセンブリの違い
  • De Bruijnグラフの構築とパス探索
  • アセンブリ品質評価(N50、コンティグサイズ分布等)
  • ギャップクローニングとスキャフォールディング

典型的な出題パターン

【遺伝学計算】

問題例: 日本人集団でのSNPアレル頻度がA=0.7、a=0.3の場合、
ハーディー・ワインベルグ平衡における各遺伝型頻度は?

解答: AA = 0.7² = 0.49 (49%)
      Aa = 2×0.7×0.3 = 0.42 (42%)
      aa = 0.3² = 0.09 (9%)

【技術選択】

問題例: 新規ゲノムのde novoアセンブリを行う際、
ショートリードとロングリードの使い分けを説明せよ。

解答: ショートリード(Illumina): 高精度、反復配列に課題
      ロングリード(PacBio/ONT): 反復配列解決、精度向上が課題
      → ハイブリッドアプローチで両者の利点を活用

【統計・品質管理】

問題例: GWAS解析で多重検定補正が必要な理由と、
一般的な補正手法を2つ挙げよ。

解答: 理由: 数百万SNPを同時検定するため偽陽性率が急増
      手法: 1) Bonferroni補正(保守的)
           2) FDR補正(Benjamini-Hochberg法)

【データ解釈】

問題例: RNA-seqデータで発現変動遺伝子(DEG)を検出した後、
生物学的意味を調べるための解析手法を3つ挙げよ。

解答: 1) Gene Ontology (GO) enrichment解析
      2) KEGGパスウェイ解析
      3) Gene Set Enrichment Analysis (GSEA)

関連する付録・章

  • 付録G: 認定試験全体の対策情報
  • 付録H: ゲノム解析ツール・データベース一覧
  • 第3章: データ構造とアルゴリズム(技術基盤)
  • 第5章: トランスクリプトーム解析(発現解析)
  • 第6章: エピゲノム解析(制御解析)

前へ: データ解析基礎 目次 次へ: トランスクリプトーム解析