scientific-multi-omics

star 3

マルチオミクス統合解析スキル。ゲノム・トランスクリプトーム・プロテオーム・メタボローム データの統合手法(MOFA/SNF/DIABLO)、オミクス間相関解析、CCA/PLS 統合、 パスウェイレベル統合、ネットワーク統合のテンプレートを提供。

nahisaho By nahisaho schedule Updated 2/12/2026

name: scientific-multi-omics description: | マルチオミクス統合解析スキル。ゲノム・トランスクリプトーム・プロテオーム・メタボローム データの統合手法(MOFA/SNF/DIABLO)、オミクス間相関解析、CCA/PLS 統合、 パスウェイレベル統合、ネットワーク統合のテンプレートを提供。

Scientific Multi-Omics Integration

複数のオミクスレイヤー(ゲノミクス、トランスクリプトミクス、プロテオミクス、 メタボロミクス)のデータを統合的に解析するためのスキル。各オミクスの個別解析は それぞれの専門スキル(bioinformatics, metabolomics)に委ねつつ、本スキルは 統合に特化する。

When to Use

  • 同一サンプルから得られた複数オミクスデータを統合するとき
  • オミクス間の相関構造を解明したいとき
  • マルチオミクスバイオマーカー発見が必要なとき
  • パスウェイレベルでの統合解析が必要なとき

Quick Start

1. データ整合性チェック

import numpy as np
import pandas as pd

def check_multiomics_alignment(omics_dict, sample_col="Sample_ID"):
    """
    マルチオミクスデータの整合性チェック。

    Parameters:
        omics_dict: {"transcriptomics": df, "proteomics": df, "metabolomics": df}
    """
    all_samples = {}
    for name, df in omics_dict.items():
        all_samples[name] = set(df[sample_col])

    # 共通サンプル
    common = set.intersection(*all_samples.values())
    report = {
        "n_omics_layers": len(omics_dict),
        "layers": list(omics_dict.keys()),
        "samples_per_layer": {k: len(v) for k, v in all_samples.items()},
        "common_samples": len(common),
        "features_per_layer": {k: df.shape[1] - 1 for k, df in omics_dict.items()},
    }

    # 共通サンプルでフィルタ
    aligned = {}
    for name, df in omics_dict.items():
        aligned[name] = df[df[sample_col].isin(common)].sort_values(sample_col).reset_index(drop=True)

    print(f"=== Multi-Omics Alignment ===")
    print(f"Common samples: {len(common)} / {max(report['samples_per_layer'].values())}")
    for k, v in report["features_per_layer"].items():
        print(f"  {k}: {v} features")

    return aligned, report

2. オミクス間相関解析

from scipy.stats import spearmanr

def cross_omics_correlation(omics1_df, omics2_df, name1="Omics1", name2="Omics2",
                              top_n=50, method="spearman"):
    """
    2 つのオミクスレイヤー間の特徴量ペアワイズ相関を計算する。

    Parameters:
        omics1_df: DataFrame (samples × features), no sample_col
        omics2_df: DataFrame (samples × features), no sample_col
        top_n: 上位の強い相関ペアを返す数
    """
    features1 = omics1_df.columns.tolist()
    features2 = omics2_df.columns.tolist()

    correlations = []
    for f1 in features1:
        for f2 in features2:
            if method == "spearman":
                r, p = spearmanr(omics1_df[f1], omics2_df[f2])
            else:
                from scipy.stats import pearsonr
                r, p = pearsonr(omics1_df[f1], omics2_df[f2])
            correlations.append({
                f"{name1}_feature": f1,
                f"{name2}_feature": f2,
                "correlation": r,
                "p_value": p,
                "abs_correlation": abs(r),
            })

    corr_df = pd.DataFrame(correlations).sort_values("abs_correlation", ascending=False)

    return corr_df.head(top_n)

3. CCA (Canonical Correlation Analysis)

from sklearn.cross_decomposition import CCA

def canonical_correlation_analysis(X1, X2, n_components=2):
    """
    正準相関分析: 2 つのオミクスデータ間の最大相関方向を見つける。

    Returns:
        cca_model, scores_X1, scores_X2, canonical_correlations
    """
    cca = CCA(n_components=n_components)
    scores_X1, scores_X2 = cca.fit_transform(X1, X2)

    # 正準相関係数
    canonical_corrs = []
    for i in range(n_components):
        r = np.corrcoef(scores_X1[:, i], scores_X2[:, i])[0, 1]
        canonical_corrs.append(r)

    return cca, scores_X1, scores_X2, canonical_corrs


def plot_cca_scores(scores_X1, scores_X2, labels, name1="Omics1",
                     name2="Omics2", figsize=(12, 5)):
    """CCA スコアプロットを描画する。"""
    import matplotlib.pyplot as plt

    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize)

    unique_labels = np.unique(labels)
    colors = plt.cm.Set1(np.linspace(0, 0.5, len(unique_labels)))

    for color, label in zip(colors, unique_labels):
        mask = labels == label
        ax1.scatter(scores_X1[mask, 0], scores_X1[mask, 1],
                   c=[color], label=label, alpha=0.7, edgecolors="black")
        ax2.scatter(scores_X2[mask, 0], scores_X2[mask, 1],
                   c=[color], label=label, alpha=0.7, edgecolors="black")

    ax1.set_title(f"CCA — {name1}", fontweight="bold")
    ax1.set_xlabel("CC1"); ax1.set_ylabel("CC2")
    ax2.set_title(f"CCA — {name2}", fontweight="bold")
    ax2.set_xlabel("CC1"); ax2.set_ylabel("CC2")
    ax1.legend(); ax2.legend()
    plt.tight_layout()
    plt.savefig("figures/cca_scores.png", dpi=300, bbox_inches="tight")
    plt.close()

4. SNF (Similarity Network Fusion)

def similarity_network_fusion(omics_list, k_neighbors=20, n_iterations=20):
    """
    Similarity Network Fusion — 複数オミクスの類似度ネットワークを融合する。

    Wang et al., Nature Methods 2014

    Parameters:
        omics_list: list of np.arrays [(n_samples, p1), (n_samples, p2), ...]
        k_neighbors: KNN のK
        n_iterations: 融合反復回数

    Returns:
        fused_similarity: (n_samples, n_samples) 融合類似度行列
    """
    from sklearn.metrics import pairwise_distances

    n = omics_list[0].shape[0]
    n_views = len(omics_list)

    # 各ビューの類似度行列
    similarities = []
    for X in omics_list:
        D = pairwise_distances(X, metric="euclidean")
        mu = np.mean(np.sort(D, axis=1)[:, 1:k_neighbors+1], axis=1)
        S = np.exp(-D**2 / (mu[:, None] * mu[None, :] + 1e-10))
        np.fill_diagonal(S, 0)
        # 正規化
        S = S / (S.sum(axis=1, keepdims=True) + 1e-10)
        similarities.append(S)

    # KNN マスク
    knn_masks = []
    for X in omics_list:
        D = pairwise_distances(X, metric="euclidean")
        mask = np.zeros_like(D, dtype=bool)
        for i in range(n):
            nn = np.argsort(D[i])[:k_neighbors+1]
            mask[i, nn] = True
        knn_masks.append(mask)

    # 反復融合
    P = [s.copy() for s in similarities]
    for _ in range(n_iterations):
        P_new = []
        for v in range(n_views):
            # 他のビューの平均
            other_avg = np.mean([P[j] for j in range(n_views) if j != v], axis=0)
            # 局所構造の保持
            S_local = similarities[v] * knn_masks[v]
            S_local = S_local / (S_local.sum(axis=1, keepdims=True) + 1e-10)
            P_updated = S_local @ other_avg @ S_local.T
            P_updated = P_updated / (P_updated.sum(axis=1, keepdims=True) + 1e-10)
            P_new.append(P_updated)
        P = P_new

    fused = np.mean(P, axis=0)
    fused = (fused + fused.T) / 2

    return fused

5. パスウェイレベル統合

def pathway_level_integration(omics_dict, pathway_mapping, pathway_col="Pathway",
                                feature_col="Feature"):
    """
    パスウェイレベルでオミクスデータを統合する。
    各パスウェイの活性スコアを PCA 第一主成分で算出。

    Parameters:
        omics_dict: {"transcriptomics": df, "proteomics": df}
        pathway_mapping: DataFrame (Feature, Pathway, Omics_Layer)
    """
    from sklearn.decomposition import PCA

    pathway_scores = {}
    pathways = pathway_mapping[pathway_col].unique()

    for pw in pathways:
        pw_features = pathway_mapping[pathway_mapping[pathway_col] == pw]
        combined_data = []

        for omics_name, df in omics_dict.items():
            features_in_omics = pw_features[pw_features["Omics_Layer"] == omics_name][feature_col]
            available = [f for f in features_in_omics if f in df.columns]
            if available:
                combined_data.append(df[available].values)

        if combined_data:
            X = np.hstack(combined_data)
            if X.shape[1] >= 2:
                pca = PCA(n_components=1)
                score = pca.fit_transform(X).ravel()
                pathway_scores[pw] = {
                    "score": score,
                    "explained_variance": pca.explained_variance_ratio_[0],
                    "n_features": X.shape[1],
                }

    return pathway_scores

6. マルチオミクスクラスタリング

from sklearn.cluster import SpectralClustering

def multiomics_clustering(fused_similarity, n_clusters, labels_true=None):
    """融合類似度行列に基づくスペクトラルクラスタリング。"""
    from sklearn.metrics import adjusted_rand_score, normalized_mutual_info_score

    clustering = SpectralClustering(n_clusters=n_clusters, affinity="precomputed",
                                    random_state=42)
    cluster_labels = clustering.fit_predict(fused_similarity)

    metrics = {"n_clusters": n_clusters}
    if labels_true is not None:
        metrics["ARI"] = adjusted_rand_score(labels_true, cluster_labels)
        metrics["NMI"] = normalized_mutual_info_score(labels_true, cluster_labels)

    return cluster_labels, metrics

References

Output Files

ファイル 形式
results/cross_omics_correlation.csv CSV
results/canonical_correlations.csv CSV
results/pathway_activity_scores.csv CSV
results/multiomics_clusters.csv CSV
figures/cca_scores.png PNG
figures/snf_heatmap.png PNG
figures/multiomics_umap.png PNG

利用可能ツール

ToolUniverse SMCP 経由で利用可能な外部ツール。

カテゴリ 主要ツール 用途
HPA HPA_get_rna_expression_by_source 組織別 RNA 発現
GEO geo_search_datasets オミクスデータセット検索
CELLxGENE CELLxGENE_get_expression_data 単一細胞発現データ
Reactome Reactome_map_uniprot_to_pathways パスウェイマッピング
KEGG kegg_get_pathway_info パスウェイ情報
UniProt UniProt_search タンパク質検索

依存パッケージ

scikit-learn>=1.3
scipy>=1.10
Install via CLI
npx skills add https://github.com/nahisaho/satori --skill scientific-multi-omics
Repository Details
star Stars 3
call_split Forks 1
navigation Branch main
article Path SKILL.md
More from Creator