課前準(zhǔn)備--CODEX(IMC)基礎(chǔ)分析梳理

作者,Evil Genius

我們也來(lái)到了空間蛋白組的課程范圍了。

為什么做了空間轉(zhuǎn)錄組,還要做空間蛋白組,也就是說(shuō)轉(zhuǎn)錄組和蛋白組的對(duì)應(yīng)關(guān)系如何,這個(gè)多次在課程上談到了。

CODEX 與 IMC 技術(shù)簡(jiǎn)介

1. CODEX(Co-Detection by indEXing)
原理:基于熒光標(biāo)記抗體的循環(huán)成像技術(shù),通過(guò)多輪抗體染色、成像和熒光淬滅,實(shí)現(xiàn)高維蛋白檢測(cè)(可檢測(cè)40-100+蛋白)。
特點(diǎn):
  • 使用 熒光標(biāo)記抗體,兼容常規(guī)顯微鏡(無(wú)需特殊設(shè)備)。
  • 高分辨率(亞細(xì)胞級(jí)),適合 組織微環(huán)境的空間分析。
  • 適用于 新鮮冷凍或FFPE(福爾馬林固定石蠟包埋)樣本。
2. IMC(Imaging Mass Cytometry)
原理:基于 質(zhì)譜流式(CyTOF) 技術(shù),使用金屬同位素標(biāo)記抗體,通過(guò)激光剝蝕+質(zhì)譜檢測(cè)實(shí)現(xiàn)高維蛋白成像(通常檢測(cè)30-50種蛋白)。
特點(diǎn):
  • 無(wú)熒光干擾,信號(hào)重疊極低,適合超高復(fù)用檢測(cè)。
  • 分辨率略低于CODEX(~1μm vs. CODEX的亞微米級(jí))。
  • 僅適用于 FFPE樣本(需特殊制備)。

CODEX 與 IMC 的主要差異

對(duì)比維度 CODEX IMC
檢測(cè)原理 熒光標(biāo)記抗體 + 多輪成像 金屬同位素標(biāo)記抗體 + 質(zhì)譜檢測(cè)
檢測(cè)通量 40-100+ 種蛋白 30-50 種蛋白(受限于金屬同位素)
分辨率 亞微米級(jí)(~0.3μm) ~1μm(略低于CODEX)
樣本兼容性 新鮮冷凍、FFPE 僅FFPE
信號(hào)干擾 可能存在熒光串?dāng)_ 無(wú)串?dāng)_(質(zhì)譜檢測(cè))
設(shè)備需求 熒光顯微鏡 + 自動(dòng)化成像系統(tǒng) 激光剝蝕 + 質(zhì)譜流式(CyTOF)設(shè)備
數(shù)據(jù)分析 基于熒光信號(hào)的多維解卷積 基于質(zhì)譜峰值的空間成像
適用場(chǎng)景 高分辨率、多輪檢測(cè)的微環(huán)境研究 超高復(fù)用、無(wú)背景干擾的蛋白檢測(cè)
CODEX 更適合 高分辨率、多輪檢測(cè) 的空間蛋白組研究,尤其適用于 細(xì)胞互作和微環(huán)境分析。
IMC 更適合 超高復(fù)用、無(wú)背景干擾 的蛋白檢測(cè),但分辨率略低,且依賴 FFPE樣本。

多技術(shù)比較

關(guān)于CODEX常見的數(shù)據(jù)質(zhì)控,與普通的轉(zhuǎn)錄組有些區(qū)別

當(dāng)然了,對(duì)于空間組學(xué)而言,niche分析是必不可少的。

大家分析的時(shí)候,一般交付了的數(shù)據(jù)是cell_by_gene.csv和cellmetadata.csv,空間那種抗體圖需要機(jī)器上展示。

基礎(chǔ)分析參考網(wǎng)址Monkeybread Tutorial — Monkeybread

我們來(lái)總結(jié)一下分析代碼

import sys
import subprocess
import numpy as np
import pandas as pd
import scanpy as sc
import anndata
from anndata import AnnData
from matplotlib import pyplot as plt
import matplotlib as mpl
import seaborn as sns
import os

import monkeybread as mb 

讀取的數(shù)據(jù)仍然是h5ad格式

sc.pp.normalize_total(adata, inplace=True)
sc.pp.log1p(adata)
sc.pp.pca(adata)

# Display high-level cell types
fig, ax = plt.subplots(1, 1, figsize=(5,5))
sc.pl.embedding(
    adata,
    "spatial",
    color = 'Cell Type',
    s=1,
    ax=ax,
    palette=sc.pl.palettes.vega_20_scanpy,
    show=False
)
plt.show()


# Display more granular cell subtypes
fig, ax = plt.subplots(1, 1, figsize=(5,5))
sc.pl.embedding(
    adata,
    "spatial",
    color = 'Cell Subtype',
    s=1,
    ax=ax,
    palette=sc.pl.palettes.godsnot_102,
    show=False
)
plt.show()

# Display expression dotplot
sc.tl.dendrogram(adata, groupby='Cell Subtype')
dp = sc.pl.dotplot(
    adata, 
    var_names={
        'T cell': [
            'CD3D'
        ],
        'CD8 T': [
            'GZMB',
            'CD8A'
        ],
        'CD4 T': [
            'CD4'
        ],
        'Treg': [
            'FOXP3', 
            'TIGIT'
        ],
        'NK': [
            'NCAM1', 
            'KLRB1'
        ],
        'B cell': [
            'MS4A1',
            'CD79A',
            'CD79B',
            'CD19'
        ],
        'mono/mac': [
            'LYZ', 
            'CD14', 
            'FCGR3A', 
            'CD163',
            'CD68'
        ],
        'dendritic': [
            'ITGAX',
            'FCER1A',
            'CD1C'
        ],
        'mregDC': [
            'CCR7',
            'LAMP3',
            'CD83'
        ],
        'pDC': [
            'IL3RA',
            'CLEC4C'
        ],
        'mast': [
            'CTSG',
            'KIT'
        ],
        'epithelial': [
            'EPCAM',
            'MUC1'
        ],
        'endothelial': [
            'VWF', 
            'PECAM1'
        ],
        'stromal': [
            'MMP2',
            'COL1A1',
            'COL5A1'
        ],
        'misc': [
            'CXCL9',
            'CXCL10',
            'SIGLEC1',
            'PDCD1',
            'PRF1'
        ]
    },
    groupby=['Cell Subtype'],
    standard_scale='var',
    cmap='bwr',
    dendrogram=True,
    return_fig=True
)
dp.add_totals().show()


Plot density of cells of a given cell type

density_key = mb.calc.cell_density(
    adata_zoom,
    'Cell Type',
    'B lineage',
    bandwidth=25,
    approx=False,
    radius_threshold=250
)
mb.plot.cell_density(
    adata_zoom,
    density_key,
    cmap='Blues',
    title=f'B cell density'
)

fig, _ = mb.plot.location_and_density(
    adata, 
    'Cell Subtype',                   
    [
        ['B lineage'],  # The first group of cell types to plot
        ['CD4 T (Tfh)'] # The second group of cell types to plot
    ],      
    [
        'B cell', # Name of the first group of cell types
        'CD4 Tfh' # Name of the second group of cell types
    ],
    dot_size=[1, 1], # Dot sizes for each group
    title='B cell vs. CD4 Tfh', 
    grid=True, 
    n_grids=5,
    show=False
)
plt.tight_layout()
plt.show()

Niche analysis

niche_subtypes = []
other_cell_types = ['other', 'malignant']
for cell, ct in zip(adata.obs.index, adata.obs['Cell Subtype']):
    if ct in other_cell_types:
        niche_subtypes.append('malignant/other')
    else:
        niche_subtypes.append(ct)
adata.obs['niche_subtypes'] = niche_subtypes
adata.obs['niche_subtypes'] = adata.obs['niche_subtypes'].astype('category')

print("Cell subtypes considered in niche analysis:")
print(set(adata.obs['niche_subtypes']))
# Only perform niche analysis on immune cells
immune_mask = ~adata.obs['niche_subtypes'].isin([
    'malignant/other', 'endothelial', 'stromal'
])

# Compute niches
adata_neighbors = mb.calc.cellular_niches(
    adata,
    cell_type_key='niche_subtypes',
    radius=75,
    normalize_counts=True,
    standard_scale=True,
    clip_min=-5,
    clip_max=5,
    mask=immune_mask,
    n_neighbors=100,
    resolution=0.25,
    min_niche_size=300,
    key_added='niche',
    non_niche_value='malignant/other'
)

# Subset cells
adata_neighbors_sub = sc.pp.subsample(
    adata_neighbors, fraction=1/2, copy=True
)

# Generate UMAP plots
sc.tl.umap(adata_neighbors_sub)
sc.pl.umap(
    adata_neighbors_sub, 
    color='niche_subtypes', 
    palette=sc.pl.palettes.vega_20_scanpy
)
sc.pl.umap(
    adata_neighbors_sub, 
    color='niche', 
    palette=sc.pl.palettes.vega_20_scanpy
)
# Map each niche to a color so that plots are consistent
niche_to_color = {
    val: mb.plot.monkey_palette[i]
    for i, val in enumerate(sorted(set(adata_neighbors.obs['niche'])))
}
niche_to_color['malignant/other'] = 'lightgrey'

fig, ax = plt.subplots(1,1,figsize=(6,6))
sc.pl.embedding(
    adata,
    "spatial",
    color = 'niche',
    palette=niche_to_color,
    s=1,
    ax=ax,
    show=False
)
mb.plot.neighbors_profile_matrixplot(
    adata_neighbors,
    'niche',
    include_niches=[ # Exclude the miscellaneous niches from the plot
        niche 
        for niche in set(adata_neighbors.obs['niche'])
        if niche != 'malignant/other'
    ],
    clustermap_kwargs={
        'linewidths': 0.5,
        'linecolor': 'black',
        'cmap': 'bwr',
        'clip_on': False,
        'vmin': -3.5,
        'vmax': 3.5,
        'figsize': (8,8)
    }
)

生活很好,有你更好

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容