CN分析概念最早来源于空间单细胞蛋白组Codex文章,Coordinated Cellular Neighborhoods Orchestrate Antitumoral Immunity at the Colorectal Cancer Invasive Front。
Cell Neighborhood(细胞邻域)指骨髓微环境中空间上邻近的细胞群体形成的功能单元,这些单元由特定细胞类型组成,反映细胞间的物理邻近性和潜在相互作用。邻域的划分基于细胞类型的共定位模式,例如:动脉-内骨膜邻域(Arterio-endosteal neighborhood):富含早期髓系前体细胞(EMPs)和粒细胞-单核祖细胞(GMPs),靠近动脉和骨表面;红细胞生成岛(Erythroid islands):由巨噬细胞和红细胞前体细胞组成;间充质-白血病细胞邻域(MSC-blast neighborhoods):在AML样本中,间充质基质细胞(MSCs)与白血病原始细胞共定位。
除了上述文章中的使用固定K近邻方法(fixed k-nearest neighbors)定义细胞Neighborhood,还有种方法是固定半径范围内(fixed radius)细胞定义细胞Neighborhood
fixed K-nearest neighbors
import numpy as npimport pandas as pdimport scanpy as scimport seaborn as snsfrom sklearn.neighbors import NearestNeighborsfrom sklearn.cluster import MiniBatchKMeansimport matplotlib.pyplot as pltfrom matplotlib.pyplot import rc_context
def cellular_neighborhood_knn(adata, column, n_neighbors=10, k=10, n_clusters=10, out_dir=None): spatial_coords = adata.obsm['spatial'] onehot_encoding = pd.get_dummies(adata.obs[column]) # 计算最近邻居 nbrs = NearestNeighbors(n_neighbors=n_neighbors).fit(spatial_coords) distances, indices = nbrs.kneighbors(spatial_coords) # 对每个cell,计算其邻居的类型分布 cluster_cols = adata.obs[column].unique() values = onehot_encoding[cluster_cols].values def compute_window_sums(indices, values, k): windows = [] for idx in range(indices.shape[0]): neighbors = indices[idx, :k] window_sum = values[neighbors].sum(axis=0) windows.append(window_sum) return np.array(windows) windows = compute_window_sums(indices, values, k) km = MiniBatchKMeans(n_clusters=n_clusters, random_state=0) labels = km.fit_predict(windows) adata.obs[f'CNs_{n_clusters}'] = [f'CN{i}' for i in labels] adata.obs.to_csv(os.path.join(out_dir, f'CNs_{n_clusters}_all_cell_features.xls'), sep='\t', index=None) # 保存聚类中心 k_centroids = km.cluster_centers_ # 计算Fold Change (fc) tissue_avgs = values.mean(axis=0) fc = np.log2(((k_centroids + tissue_avgs) / (k_centroids + tissue_avgs).sum(axis=1, keepdims=True)) / tissue_avgs) fc = pd.DataFrame(fc, columns=adata.obs[column].unique()) fc.index = 'CN' + fc.index.astype(str) sns.set_style("white") g = sns.clustermap(fc, vmin=-2, vmax=2, cmap="vlag", row_cluster=False, col_cluster=True, linewidths=0.5, figsize=(6, 6)) g.ax_heatmap.tick_params(right=False, bottom=False) plt.savefig(os.path.join(out_dir, f"CNs_{n_clusters}.png"), dpi=300, bbox_inches='tight')
return adata
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。