@nahisaho/satori 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,251 @@
1
+ ---
2
+ name: scientific-squidpy-advanced
3
+ description: |
4
+ 高度 Squidpy 空間解析スキル。空間自己相関・共起解析・空間
5
+ 近傍・リガンド受容体空間マッピング・ニッチ同定。
6
+ K-Dense 連携: squidpy-advanced。
7
+ tu_tools: []
8
+ kdense_ref: squidpy-advanced
9
+ ---
10
+
11
+ # Scientific Squidpy Advanced
12
+
13
+ Squidpy の高度な空間統計解析機能を活用した空間トランスクリプ
14
+ トミクス解析パイプラインを提供する。
15
+
16
+ ## When to Use
17
+
18
+ - 空間自己相関 (Moran's I, Geary's C) を計算するとき
19
+ - 細胞タイプの空間共起パターンを分析するとき
20
+ - 近傍エンリッチメント解析を実施するとき
21
+ - リガンド-受容体のペア空間マッピングを行うとき
22
+ - 空間ニッチ (組織微小環境) を同定するとき
23
+ - 空間グラフ中心性指標を計算するとき
24
+
25
+ ---
26
+
27
+ ## Quick Start
28
+
29
+ ## 1. 空間自己相関解析
30
+
31
+ ```python
32
+ import squidpy as sq
33
+ import scanpy as sc
34
+ import pandas as pd
35
+ import numpy as np
36
+
37
+
38
+ def squidpy_spatial_autocorrelation(adata, genes=None,
39
+ mode="moran", n_perms=100,
40
+ n_jobs=4):
41
+ """
42
+ Squidpy — 空間自己相関解析 (Moran's I / Geary's C)。
43
+
44
+ Parameters:
45
+ adata: AnnData — 空間トランスクリプトミクスデータ
46
+ genes: list[str] — 対象遺伝子 (None=HVG 使用)
47
+ mode: str — "moran" or "geary"
48
+ n_perms: int — 並べ替え検定回数
49
+ n_jobs: int — 並列ジョブ数
50
+ """
51
+ # 空間グラフ構築 (未構築の場合)
52
+ if "spatial_connectivities" not in adata.obsp:
53
+ sq.gr.spatial_neighbors(adata, coord_type="generic",
54
+ n_neighs=6)
55
+
56
+ if genes is None:
57
+ sc.pp.highly_variable_genes(adata, n_top_genes=200)
58
+ genes = adata.var_names[adata.var["highly_variable"]].tolist()
59
+
60
+ sq.gr.spatial_autocorr(adata, mode=mode, genes=genes,
61
+ n_perms=n_perms, n_jobs=n_jobs)
62
+
63
+ result_key = f"{mode}I" if mode == "moran" else f"{mode}C"
64
+ result = adata.uns[result_key].copy()
65
+ sig = result[result["pval_norm"] < 0.05]
66
+
67
+ print(f"Spatial autocorrelation ({mode}): "
68
+ f"{len(sig)}/{len(result)} significant genes")
69
+ return result.sort_values("pval_norm")
70
+ ```
71
+
72
+ ## 2. 空間共起解析
73
+
74
+ ```python
75
+ def squidpy_co_occurrence(adata, cluster_key="cell_type",
76
+ interval=50, n_splits=None):
77
+ """
78
+ Squidpy — 細胞タイプ空間共起解析。
79
+
80
+ Parameters:
81
+ adata: AnnData — 空間トランスクリプトミクスデータ
82
+ cluster_key: str — 細胞タイプアノテーションカラム
83
+ interval: int — 距離インターバル数
84
+ n_splits: int — 分割数 (大規模データ用, None=自動)
85
+ """
86
+ sq.gr.co_occurrence(adata, cluster_key=cluster_key,
87
+ interval=interval, n_splits=n_splits)
88
+
89
+ co_occ = adata.uns[f"{cluster_key}_co_occurrence"]
90
+ occ_scores = co_occ["occ"]
91
+ interval_vals = co_occ["interval"]
92
+ categories = adata.obs[cluster_key].cat.categories.tolist()
93
+
94
+ # 最近距離での共起スコアマトリクス
95
+ near_idx = 0
96
+ scores = occ_scores[near_idx]
97
+ co_df = pd.DataFrame(scores, index=categories, columns=categories)
98
+
99
+ # 有意な共起ペア
100
+ pairs = []
101
+ for i, cat_i in enumerate(categories):
102
+ for j, cat_j in enumerate(categories):
103
+ if i < j:
104
+ pairs.append({
105
+ "cell_type_a": cat_i,
106
+ "cell_type_b": cat_j,
107
+ "co_occurrence_score": scores[i, j],
108
+ })
109
+ pairs_df = pd.DataFrame(pairs).sort_values(
110
+ "co_occurrence_score", ascending=False)
111
+
112
+ print(f"Co-occurrence: {len(categories)} cell types, "
113
+ f"top pair: {pairs_df.iloc[0]['cell_type_a']} — "
114
+ f"{pairs_df.iloc[0]['cell_type_b']}")
115
+ return co_df, pairs_df
116
+ ```
117
+
118
+ ## 3. 近傍エンリッチメント & ニッチ同定
119
+
120
+ ```python
121
+ def squidpy_niche_identification(adata, cluster_key="cell_type",
122
+ n_neighs=15, n_niches=5,
123
+ seed=42):
124
+ """
125
+ Squidpy — 空間ニッチ同定。
126
+
127
+ Parameters:
128
+ adata: AnnData — 空間トランスクリプトミクスデータ
129
+ cluster_key: str — 細胞タイプカラム
130
+ n_neighs: int — 近傍数
131
+ n_niches: int — ニッチクラスタ数
132
+ seed: int — 乱数シード
133
+ """
134
+ # 近傍エンリッチメント
135
+ sq.gr.nhood_enrichment(adata, cluster_key=cluster_key)
136
+ nhood = adata.uns[f"{cluster_key}_nhood_enrichment"]
137
+ zscore_matrix = nhood["zscore"]
138
+ categories = adata.obs[cluster_key].cat.categories.tolist()
139
+ nhood_df = pd.DataFrame(zscore_matrix, index=categories,
140
+ columns=categories)
141
+
142
+ # 空間近傍グラフ
143
+ sq.gr.spatial_neighbors(adata, coord_type="generic",
144
+ n_neighs=n_neighs)
145
+
146
+ # 近傍組成プロファイル
147
+ from sklearn.cluster import KMeans
148
+ cell_types = adata.obs[cluster_key]
149
+ type_dummies = pd.get_dummies(cell_types)
150
+
151
+ # 各細胞の近傍組成
152
+ conn = adata.obsp["spatial_connectivities"]
153
+ nhood_composition = conn.dot(type_dummies.values)
154
+ nhood_comp_df = pd.DataFrame(
155
+ nhood_composition, columns=type_dummies.columns,
156
+ index=adata.obs_names)
157
+
158
+ # ニッチクラスタリング
159
+ km = KMeans(n_clusters=n_niches, random_state=seed, n_init=10)
160
+ adata.obs["spatial_niche"] = km.fit_predict(
161
+ nhood_comp_df.values).astype(str)
162
+
163
+ niche_summary = adata.obs.groupby("spatial_niche")[cluster_key]\
164
+ .value_counts(normalize=True).unstack(fill_value=0)
165
+
166
+ print(f"Niche identification: {n_niches} niches, "
167
+ f"{len(categories)} cell types")
168
+ return nhood_df, niche_summary
169
+ ```
170
+
171
+ ## 4. Squidpy 高度空間解析統合パイプライン
172
+
173
+ ```python
174
+ def squidpy_advanced_pipeline(adata, cluster_key="cell_type",
175
+ output_dir="results"):
176
+ """
177
+ Squidpy 高度空間解析統合パイプライン。
178
+
179
+ Parameters:
180
+ adata: AnnData — 空間トランスクリプトミクスデータ
181
+ cluster_key: str — 細胞タイプカラム
182
+ output_dir: str — 出力ディレクトリ
183
+ """
184
+ from pathlib import Path
185
+ output_dir = Path(output_dir)
186
+ output_dir.mkdir(parents=True, exist_ok=True)
187
+
188
+ # 1) 空間自己相関
189
+ autocorr = squidpy_spatial_autocorrelation(adata)
190
+ autocorr.to_csv(output_dir / "spatial_autocorrelation.csv")
191
+
192
+ # 2) 空間共起
193
+ co_df, pairs_df = squidpy_co_occurrence(adata,
194
+ cluster_key=cluster_key)
195
+ co_df.to_csv(output_dir / "co_occurrence_matrix.csv")
196
+ pairs_df.to_csv(output_dir / "co_occurrence_pairs.csv",
197
+ index=False)
198
+
199
+ # 3) ニッチ同定
200
+ nhood_df, niche_summary = squidpy_niche_identification(
201
+ adata, cluster_key=cluster_key)
202
+ nhood_df.to_csv(output_dir / "nhood_enrichment.csv")
203
+ niche_summary.to_csv(output_dir / "niche_composition.csv")
204
+
205
+ # 4) 中心性スコア
206
+ sq.gr.centrality_scores(adata, cluster_key=cluster_key)
207
+ centrality = adata.uns[f"{cluster_key}_centrality_scores"]
208
+ centrality_df = pd.DataFrame(centrality)
209
+ centrality_df.to_csv(output_dir / "centrality_scores.csv")
210
+
211
+ adata.write(output_dir / "adata_spatial.h5ad")
212
+
213
+ print(f"Squidpy advanced pipeline: {output_dir}")
214
+ return {
215
+ "autocorrelation": autocorr,
216
+ "co_occurrence": co_df,
217
+ "niches": niche_summary,
218
+ "centrality": centrality_df,
219
+ }
220
+ ```
221
+
222
+ ---
223
+
224
+ ## K-Dense 連携
225
+
226
+ | K-Dense Key | 参照内容 |
227
+ |-------------|---------|
228
+ | `squidpy-advanced` | 高度空間統計・ニッチ解析手法 |
229
+
230
+ ## パイプライン統合
231
+
232
+ ```
233
+ spatial-transcriptomics → squidpy-advanced → single-cell-genomics
234
+ (Visium/MERFISH) (空間統計) (scRNA-seq)
235
+ │ │ ↓
236
+ image-analysis ─────────────┘ cell-communication
237
+ (H&E/IF 画像) │ (リガンド-受容体)
238
+
239
+ multi-omics
240
+ (空間マルチモーダル)
241
+ ```
242
+
243
+ ## パイプライン出力
244
+
245
+ | ファイル | 説明 | 次スキル |
246
+ |---------|------|---------|
247
+ | `results/spatial_autocorrelation.csv` | 空間自己相関 | → gene-expression |
248
+ | `results/co_occurrence_matrix.csv` | 共起マトリクス | → cell-communication |
249
+ | `results/niche_composition.csv` | ニッチ組成 | → single-cell-genomics |
250
+ | `results/centrality_scores.csv` | 中心性スコア | → spatial-transcriptomics |
251
+ | `results/adata_spatial.h5ad` | AnnData (全結果) | → multi-omics |