作者,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ī)器上展示。
我們來(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)
}
)
生活很好,有你更好