Module: Supervised Metrics#
Unlike scRNA-seq, spatial transcriptomics measurements are affected by the local tissue context. Transcripts can be captured outside their cell of origin due to transcript diffusion, 3D overlap, or segmentation inaccuracies, leading to mixed or contaminated expression profiles. As a result, spatial cells may partially resemble their neighbors.

The supervised (sp) module provides metrics to evaluate how well cell profiles in a spatial transcriptomics dataset agree with a reference single-cell RNA-seq (scRNA-seq) dataset with cell type annotations.
By comparing spatial expression profiles to a high-quality scRNA-seq reference, the supervised module aims to quantify this mismatch. Specifically, we use the scRNA-seq dataset as a clean reference, transfer cell type labels to the spatial data, and then compute metrics that measure:
how well each spatial cell matches its expected cell type,
how much its expression resembles other (neighboring) cell types, and
if it is possible to predict that a cell of one cell type is adjacent to a different cell type.
To follow along with this tutorial, you can download the data from here.
[1]:
%load_ext autoreload
%autoreload 2
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning)
[2]:
from pathlib import Path
import anndata as ad
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import spatialdata as sd
import spatialdata_plot # noqa
import segtraq
segtraq.settings.n_jobs = -1 # Use all available CPU cores
/g/huber/users/meyerben/notebooks/spatial_transcriptomics/SegTraQ/.venv/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from .autonotebook import tqdm as notebook_tqdm
Transfer labels from scRNA-seq to spatial transcriptomics#
We first load a spatial transcriptomics dataset (stored as a SpatialData object) and an annotated scRNA-seq reference dataset (stored as an AnnData object). For demonstration purposes, we subset the spatial dataset to a smaller region to reduce runtime.
Next, we initialize a SegTraQ object from the SpatialData. During initialization, the validate_spatialdata() method is automatically run to ensure that all required attributes (e.g. images_key, tables_key) are correctly specified.
We then transfer cell type labels from the scRNA-seq reference to the spatial dataset using run_label_transfer(). This method computes cell type–specific mean expression profiles in the reference and assigns each spatial cell to the cell type with the highest Pearson correlation to its expression profile.
Finally, we define a color scheme for visualizing the transferred cell type labels.
[3]:
# Load spatial transcriptomics dataset
sdata_ws = sd.read_zarr("../../data/xenium_5K_data/xenium.zarr")
# Subset the dataset to a specific bounding box
bb_xmin = 800
bb_ymin = 1150
bb_w = 200
bb_h = 300
bb_xmax = bb_xmin + bb_w
bb_ymax = bb_ymin + bb_h
sdata = sdata_ws.query.bounding_box(
axes=["x", "y"],
min_coordinate=[bb_xmin, bb_ymin],
max_coordinate=[bb_xmax, bb_ymax],
target_coordinate_system="global",
)
# initialize SegTraQ object
st = segtraq.SegTraQ(sdata, images_key="image", tables_centroid_x_key="x_centroid", tables_centroid_y_key="y_centroid")
# Load scRNA-seq dataset
scRNAseq_data_path = Path("../../data/xenium_5K_data/BC_scRNAseq_Janesick.h5ad")
adata_ref = ad.read_h5ad(scRNAseq_data_path)
# Define color palette for cell types
col_celltype = {
"T": "#fb8072",
"B": "#bc80bd",
"macro": "#910290",
"dendritic": "#fdb462",
"mast": "#959059",
"perivas": "#fed9a6",
"endo": "#a6cee3",
"myoepi": "#2782bb",
"DCIS1": "#3c7761",
"DCIS2": "#66a61e",
"tumor": "#66c2a5",
"stromal": "#d45943",
"Unknown": "#808080",
}
no parent found for <ome_zarr.reader.Label object at 0x7fff7dd0aa50>: None
no parent found for <ome_zarr.reader.Label object at 0x7fff7dc760d0>: None
/g/huber/users/meyerben/notebooks/spatial_transcriptomics/SegTraQ/src/segtraq/utils.py:1854: UserWarning: Duplicate IDs detected in index 'cell_id' for shapes 'nucleus_boundaries'. Resetting and renaming index to `segtraq_id` to ensure uniqueness.
nucleus_shapes = _ensure_index(
/g/huber/users/meyerben/notebooks/spatial_transcriptomics/SegTraQ/src/segtraq/SegTraQ.py:190: UserWarning: Filtering control probes matching prefixes ('NegControlProbe_', 'antisense_', 'NegControlCodeword', 'BLANK_', 'Blank-', 'NegPrb', 'DeprecatedCodeword_', 'UnassignedCodeword_', 'Intergenic_Region_') and transcripts with qv < 20 from transcript points in-place; control probes are also removed from the expression table if present. Configure `min_qv`, `control_prefixes`, and `inplace` via `filter_kwargs`.
sdata_new = _filter_control_and_low_quality_transcripts(
/g/huber/users/meyerben/notebooks/spatial_transcriptomics/SegTraQ/src/segtraq/SegTraQ.py:190: RuntimeWarning: Gene sets differ between assigned transcript points and the expression table. 0 genes occur only in points (e.g. []), and 455 occur only in the table (e.g. ['SHBG', 'F2', 'PROKR2', 'MVD', 'NR5A1']). Genes only occuring in the table can be introduced by cropping (`SpatialData`), but differences may also be due to the filtering used to generate the transcript data and expression matrix. Please check that `filter_kwargs`, particularly `min_qv` and `control_prefixes`, are consistent with the filtering used to generate the expression table.
sdata_new = _filter_control_and_low_quality_transcripts(
/g/huber/users/meyerben/notebooks/spatial_transcriptomics/SegTraQ/src/segtraq/SegTraQ.py:190: RuntimeWarning: Cell IDs differ between assigned transcript points and the expression table. 0 cells occur only in points (e.g. []), and 6 occur only in the table (e.g. ['apnfcbpf-1', 'icealcci-1', 'aphemnlm-1', 'iceeeemj-1', 'oemhhohn-1']). Cells only occuring in the table can reflect zero-count cells, but differences may also be due to the filtering used to generate the transcript data and expression matrix. Please check that `filter_kwargs`, particularly `min_qv` and `control_prefixes`, are consistent with the filtering used to generate the expression table.
sdata_new = _filter_control_and_low_quality_transcripts(
The transferred labels are stored in sdata.tables[tables_key].obs["transferred_cell_type"]. The column name can be changed via the cell_type_key argument.
By default, cells with ≤ 10 or ≥ 2000 transcripts and ≤ 5 detected genes are filtered out. These thresholds can be adjusted using tx_min, tx_max, gn_min, and gn_max.
Ensure that gene identifiers match between adata_ref.var_names and sdata.tables[tables_key].var_names. If they differ, specify the corresponding identifier columns using ref_ensemble_key and query_ensemble_key. If these are left as None (default), var_names are used.
[4]:
st.run_label_transfer(
adata_ref,
ref_cell_type="celltype_major", # Reference cell type column
ref_raw_counts_layer="raw", # Reference raw counts layer
)
WARNING: adata.X seems to be already log-transformed.
Next, cell shapes can be plotted and colored by cell type based on a defined color palette. Some cells lack a transferred cell-type label (due to filtering low-count cells before label transfer); for compatibility with spatialdata-plot, we replace missing values (NaN) with “Unknown” before plotting.
[5]:
# Replace NaN with Unknown
s = st.sdata.tables["table"].obs["transferred_cell_type"]
if pd.api.types.is_categorical_dtype(s):
s = s.cat.add_categories(["Unknown"])
st.sdata.tables["table"].obs["transferred_cell_type_plot"] = s.fillna("Unknown")
labels = st.sdata.tables["table"].obs["transferred_cell_type_plot"].unique().astype(str).tolist()
cols = [col_celltype[lab] for lab in labels]
/scratch/jobs/61866415/ipykernel_1926364/964490482.py:3: DeprecationWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, pd.CategoricalDtype) instead
if pd.api.types.is_categorical_dtype(s):
[6]:
axes = plt.subplots(1, 2, figsize=(10, 5), constrained_layout=True)[1].flatten()
# Dapi image
st.sdata.pl.render_images("image").pl.show(ax=axes[0], title="DAPI image", coordinate_systems="global")
# Add link between table and spatial element
st.sdata.tables["table"].obs["region"] = "cell_boundaries"
st.sdata.set_table_annotates_spatialelement("table", region="cell_boundaries")
st.sdata.pl.render_shapes(
"cell_boundaries",
color="transferred_cell_type_plot",
palette=cols,
groups=labels,
outline_color="white", # outlines visible on black
outline_width=0.5,
).pl.show(ax=axes[1], title="Cell boundaries", coordinate_systems="global")
/g/huber/users/meyerben/notebooks/spatial_transcriptomics/SegTraQ/.venv/lib/python3.13/site-packages/spatialdata/_core/spatialdata.py:477: UserWarning: Converting `region_key: region` to categorical dtype.
convert_region_column_to_categorical(table)
Computing cell type-specific markers#
Positive markers are genes that are consistently upregulated in one cell type relative to other cell types. To avoid composition bias arising from unequal cell type abundances, we perform pairwise comparisons between all cell types in the reference dataset. Marker detection can be performed using either differential expression (mode="de") or AUC-based scoring (mode="auc").
For each cell type, genes are selected by a voting scheme: a gene must be identified as upregulated in at least a fraction of pairwise contrasts (vote_fraction_pos, default = 0.5). To ensure that positive markers are representative of the cell type rather than driven by a small subset of cells, we additionally require that a gene is expressed (> 0) in at least min_pos_frac (default = 0.1) of cells of that type. To further increase specificity, we require that a positive marker is not
shared by more than t_pos × n_celltypes cell types. This yields markers that are both upregulated and cell-type–specific, without bias from cell type composition in the reference data.
Negative markers are derived from the same pairwise contrasts but are defined as genes that are effectively off in a focal cell type while being upregulated elsewhere. For each ordered pair of cell types (a, b), genes that are upregulated in a relative to b are considered negative-marker candidates for b if they are expressed (> 0) in at most max_neg_frac (default = 0.05) of cells of type b. To avoid ambiguous genes with inconsistent directionality, we further require
that a negative marker of b is not identified as upregulated in b relative to any other cell type across all ordered contrasts.
When using mode="auc", the minimum required AUC can be set via auc_pos_thresh (default = 0.9). When using mode="de", the differential expression method can be selected via method ("wilcoxon", "t-test", or "logreg"), with thresholds defined by logFC_pos_thresh (default = 1.0) and pval_adj_thresh (default = 0.05).
All computations can be parallelized by specifying the number of jobs via n_jobs.
[7]:
# get cell type-specific markers from the reference dataset
markers = st.markers_from_reference(
adata_ref,
ref_cell_type="celltype_major",
ref_raw_counts_layer="raw",
mode="de",
vote_fraction_pos=0.5,
min_pos_frac=0.1,
max_neg_frac=0.05,
n_jobs=16,
)
WARNING: adata.X seems to be already log-transformed.
A list of positive and negative markers computed for each cell type is shown below.
[8]:
for cell_type, sign in markers.items():
pos = sign["positive"]
neg = sign["negative"]
print(f"{cell_type} | positive: {', '.join(pos)}")
print(f"{cell_type} | negative: {', '.join(neg)}\n")
B | positive: PAX5, MS4A1, BANK1, FCRL1, BLK, FCRL2, AIM2, TNFRSF13B, CD19, POU2AF1, SCIMP, FCRL5, P2RX5, CD79A, PARP15, CD79B, TNFRSF13C, POU2F2, FCRLA, STAP1, CD22, COL4A3, SP140, NIBAN3, CR1, ADAM28, PLCG2, FCMR, CD40, TLR6, ST6GAL1, DERL3, KCNN4, CD27, CD52, ITGB7, BLNK, CNR2, COL4A4, SPIB, IRF4, TNFRSF17, ZBP1, PTK2B, FCGR2B, CDK14, PTPN6, TNFAIP8, SP110, ATM, FCRL3, COCH, CCDC141, NCF1, CD38, CCR6, ITGAL, RELT, PIM2, SMCHD1, ANKRD13A, NCOA3, PDK1, LRRK2, KCNA3, NLRP1, TLR1, SLAMF1, SLAMF6, GPR174, JAK3, GRK5, NLRC5, SMAP2, BCL2, SYVN1, TENT5C, ORAI2, CASP10, CYSLTR1, CD83, LPXN, TRAF5, REL, BTN3A1, SYNRG, ATP2B1, SEMA4B
B | negative: ABCA10, ABCA8, ABCC8, ABCC9, ABI3BP, AC007906.2, ACVRL1, ADAM12, ADAM33, ADAMDEC1, ADAMTS1, ADAMTS12, ADAMTS14, ADAMTS2, ADAMTS4, ADAMTS5, ADCYAP1, ADGRE2, ADGRL4, ADORA2B, ADORA3, ADRA1B, ADRA2A, ADTRP, AFAP1L2, AGR3, AIF1, ALDH7A1, ALPK3, ALPL, ANGPT1, ANGPTL2, ANGPTL4, ANXA3, ANXA8, APLNR, AQP1, ASPN, ATL1, AVPR1A, AXIN2, BAALC, BARX2, BCL6B, BDKRB2, BMP2, BMPR1B, BNC2, BPIFB1, BRINP1, C1QTNF1, C3AR1, C4B, C5AR1, C7, CACNA1B, CACNG4, CADM3, CALB2, CALCRL, CALML3, CARD10, CARD14, CARD9, CAVIN2, CAVIN3, CCDC102B, CCL14, CCL19, CCL22, CCL28, CCN3, CCN4, CCR4, CCR5, CD1E, CD209, CD248, CD274, CD302, CD33, CD34, CD40LG, CD7, CD8A, CDH13, CDH23, CDH3, CDH5, CDH6, CDKN2B, CEBPA, CELSR3, CENPA, CEP112, CES1, CFC1, CGNL1, CHAD, CHST8, CLCN5, CLDN5, CLEC10A, CLEC12A, CLEC14A, CLEC4C, CLEC5A, CLEC7A, CLGN, CLIC3, CMA1, CMKLR1, CMYA5, CNN1, CNRIP1, CNTNAP1, COL10A1, COL17A1, COL7A1, COLEC12, CPVL, CPXM2, CRB2, CSF1, CSF2RA, CSF3R, CSPG4, CST7, CTLA4, CTSG, CTSW, CUX2, CX3CL1, CXCL2, CXCR6, CYP27A1, DCLK1, DDR2, DKK3, DLK1, DLL4, DLX4, DMD, DNAH7, DNASE1L3, DNM1, DPT, DPY19L2, DSC3, DSG3, EBF2, ECRG4, EDN1, EDNRA, EGF, EGFR, ELN, EMP1, ENPP1, ENPP2, ENPP3, ENTPD2, EPB41L3, EPHA2, EPHB1, EREG, ERG, ERRFI1, ESM1, ETV1, F13A1, F2R, F2RL3, F3, F7, FAM107A, FAP, FAT2, FAT4, FBLN2, FBLN5, FCER1A, FCGR3A, FES, FGF1, FGF2, FGF7, FGFR2, FILIP1L, FLRT3, FLT1, FLT3, FLT4, FMN1, FMOD, FOLH1, FOLR2, FOXC2, FOXD2, FPR1, FREM1, FRZB, FSCN1, FST, FZD4, GABRD, GABRP, GHR, GIMAP5, GIMAP8, GJC1, GLI2, GLT8D2, GPR39, GPR4, GPRC5B, GRAMD2B, GRIK3, GRIK4, GRP, GUCY1A2, GZMA, GZMB, GZMK, HAS2, HAVCR2, HBEGF, HCK, HDC, HEYL, HGF, HLX, HMCN1, HOXA5, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HPSE2, HS3ST3A1, HS6ST2, ICOS, IDO1, IGF1, IL17RB, IL18, IL18R1, IL1R1, IL1RL1, IL2RB, IL33, IL34, IL3RA, IL6R, INHBA, IRS1, IRS2, IRX1, ITGA2, ITGA2B, ITGA5, ITGA7, ITIH5, JAG1, JAM2, KANK2, KCNF1, KCNJ8, KCNK10, KCNK15, KCNK17, KCNMA1, KCNMB1, KDR, KIT, KLHL13, KLK10, KLK6, KLRD1, KLRG1, LAMB3, LAMC2, LAMP3, LCN2, LCNL1, LDB3, LEF1, LGR4, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LOX, LOXL2, LPAR1, LPL, LRG1, LRRC15, LTK, LURAP1, MAOB, MAP1A, MAP1B, MAP2, MAP3K7CL, MAPT, ME1, MECOM, MEIS2, MERTK, MET, MFAP5, MLXIPL, MME, MMP11, MMP9, MMRN2, MNDA, MPP1, MRC1, MS4A2, MSR1, MTNR1B, MUC16, MUC5B, MYCL, MYH11, MYLK, NAV2, NCCRP1, NCF2, NGFR, NKX3-1, NLRP2, NLRP3, NOS1AP, NOS3, NOSTRIN, NPNT, NPR1, NPY1R, NR4A3, NR5A2, NRN1, NRP2, NTRK2, OLFM1, OLFML3, OLR1, OPRD1, OXTR, P2RX7, P2RY13, P2RY14, P2RY2, P2RY6, PALMD, PAMR1, PBK, PCDH10, PCDH17, PCDH18, PDE10A, PDE2A, PDE3A, PDE5A, PDGFA, PDGFD, PDGFRA, PDGFRB, PDGFRL, PDLIM4, PDPN, PDZK1, PGF, PGR, PHEX, PHF21B, PHLDB2, PI16, PIEZO2, PILRA, PITX1, PLA2G7, PLAGL1, PLAUR, PLCE1, PLEKHH2, PLVAP, PLXDC1, PMAIP1, PODXL, POTEI, POTEJ, PPARG, PPP1R1C, PRDM6, PRF1, PRKAA2, PRKCQ, PROCR, PROM1, PROX1, PRRX1, PTAFR, PTGDR, PTGES, PTGFRN, PTGIR, PTGIS, PTGS1, PTHLH, PTK7, PTPRB, PTPRM, RAPGEF3, RASD1, RASSF4, RBMS3, RBPMS, RCAN2, RELN, RERG, RGS5, RIMS3, RIPK4, RNF180, RNF39, ROBO4, ROR2, RTN1, RUNX1T1, S100A1, SAMD5, SASH1, SCGB1D2, SCN9A, SDC2, SELP, SEPTIN4, SEPTIN5, SERPINA5, SERPINB5, SERPINE1, SFRP1, SH2D1A, SH2D2A, SH3RF2, SHANK3, SHD, SIGLEC1, SIGLEC9, SIM2, SIRPA, SLAMF8, SLC11A1, SLC18A2, SLC1A3, SLC2A9, SLC35G2, SLC6A1, SLC7A11, SLCO2A1, SLCO2B1, SLIT2, SLIT3, SMOC2, SMPD3, SNCA, SOD3, SOSTDC1, SOX10, SOX17, SOX18, SOX9, SPA17, SPAG17, SPATA18, SPOCK1, SPON1, SPON2, SPRY2, SRPX, STEAP1, STEAP4, SUGCT, SULF1, SVEP1, SYNPO2, TAL1, TBX2, TBXA2R, TCL1A, TDO2, TEK, TFAP2B, TFPI2, TGFB2, TGFBR3, TGM2, TH, THBD, THY1, TIE1, TIGIT, TLR2, TLR4, TLR9, TMEM119, TMEM255B, TMEM45B, TMEM98, TNFSF8, TNS4, TP63, TPPP3, TPSG1, TREM2, TRH, TRIM29, TRO, TRPC6, TSPAN18, TSPAN7, TUBB2B, TUBB3, TUBB6, TWIST1, TWIST2, UBASH3A, UNC5A, VCAM1, VEGFC, VGLL3, VSIG4, VSNL1, VSTM2L, VTCN1, WFDC1, WNT2, ZFHX4, ZNF683
DCIS1 | positive: BMPR1B, PITX1, SCGB1D2, OPRD1, SLC16A1, CHAD, EREG, SMPD3, MUC16, KCNF1, PCDH10, ITGB6, AGR2, MUC5B, TMEM45B, DLX4, CA12, GIPC1, S100A1, POTEI, ESR1, SAPCD2, ME1, SLC12A2, CEACAM5, ITGA3, CACNG4, NQO1, ROR2, IGFBP2, TUBB3, SOX9, SLC30A8, REEP6, PRKAR1A, BARX2, G6PD, SOD1, CACNA1D, PIK3R2, CYP27A1, PDE10A, SPA17, VTCN1, P2RY2, AGR3, SDC4, ENTPD2, SPATA18, HK2, C4B, HES6, PLXNB1, RIPK4, NKX3-1, IGSF3, FAAH, CTNND2, NECTIN1, CFB, NTN4, SIAE, DTNA, THSD4, KLF5, SLC7A11, LASP1, FASN, CASZ1, MCM3AP, XBP1, VSTM2L, MACC1, CMYA5, STX1A, ATP7B, RMND1, WFS1, SERPINA5, POTEF, LMX1B, TDO2, SERPINB5, SASH1, KCNK15, TNFRSF12A, SULF2, TRIM29, CGNL1, PLAT, SLC9A3R2, TRPS1, ST14, BAALC, CD151, FOXD2, DNAH7, NECTIN2, CELSR3, DEPTOR, PADI2, VAV3, NINJ1, IL17RB, PRKAA2, ABCA10, NOD2, PRODH, PPFIA3, LRATD2, TUBD1
DCIS1 | negative: ABCA8, ABCC12, ABCC8, ABCC9, ABI3, ABI3BP, AC007906.2, ACVRL1, ADA, ADAM12, ADAM33, ADAMDEC1, ADAMTS12, ADAMTS14, ADAMTS4, ADAMTS5, ADCYAP1, ADGRE2, ADGRL4, ADORA2B, ADORA3, ADRA1B, ADRA2A, ADRB2, ADTRP, AIM2, ALPL, ANGPT1, ANXA8, APLNR, ASPN, ATL1, AVPR1A, BANK1, BCL11B, BCL2A1, BCL6B, BLK, BMP2, BMP6, BNC2, BPIFB1, BRINP1, C1QTNF1, C3AR1, C7, CACNA1B, CALB2, CALCRL, CARD9, CASP10, CAVIN2, CAVIN3, CCDC102B, CCDC141, CCL14, CCL19, CCN3, CCN4, CCR1, CCR4, CCR5, CD19, CD1C, CD1D, CD1E, CD209, CD22, CD226, CD247, CD27, CD274, CD28, CD302, CD33, CD34, CD38, CD3G, CD40, CD40LG, CD5, CD7, CD72, CD79A, CD79B, CD83, CD86, CDH13, CDH23, CDH5, CDH6, CEP112, CFC1, CHST8, CLDN5, CLEC10A, CLEC12A, CLEC14A, CLEC4C, CLEC5A, CLEC7A, CMA1, CMKLR1, CNR2, CNRIP1, CNTNAP1, COCH, COL10A1, COL4A3, COL4A4, COLEC12, CPVL, CPXM2, CR1, CRB2, CSF2RA, CSF3R, CST7, CTLA4, CTSG, CTSW, CUX2, CXADR, CXCL2, CXCR3, CXCR6, CYSLTR1, DCLK1, DERL3, DIO2, DLK1, DLL4, DNASE1L3, DNM1, DPT, DPY19L2, DSG3, EBF2, EDN1, EDNRA, EGF, EGR2, ENPP2, ENPP3, EPB41L3, EPHB1, ERG, ESM1, F2RL3, F7, FAM107A, FAP, FAT4, FCER1A, FCGR2B, FCMR, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FES, FGF1, FGF2, FGF7, FGR, FILIP1L, FLT1, FLT3, FLT4, FOLH1, FOLR2, FOXC2, FPR1, FREM1, FRZB, FSCN1, FUT7, GABRD, GBP5, GHR, GIMAP5, GIMAP8, GJC1, GLI2, GPR174, GPR34, GPR39, GPR4, GRIK4, GRP, GUCY1A2, GZMA, GZMB, GZMK, HAS2, HBEGF, HCK, HDAC9, HDC, HEYL, HGF, HLX, HMCN1, HOXA5, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HPSE2, HS3ST3A1, HSPA6, ICAM2, ICOS, IDO1, IGF1, IL12RB1, IL18R1, IL1RL1, IL21R, IL2RB, IL33, IL3RA, IL6R, INHBA, IRF4, ITGA7, ITIH5, ITK, JAM2, KCNA3, KCNH6, KCNJ8, KCNK10, KCNK17, KCNN3, KDR, KIAA0408, KIT, KLK10, KLK6, KLRD1, KLRG1, LAIR1, LAMP3, LCK, LCN2, LCNL1, LDB3, LEF1, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LMO2, LOX, LPAR1, LPL, LRRC15, LRRK2, LTK, LURAP1, LY96, MAP1A, MAP2, MAP3K7CL, MERTK, MFAP5, MLXIPL, MMP9, MMRN2, MNDA, MPP1, MRC1, MS4A1, MS4A2, MTNR1B, NCCRP1, NCF1, NCF2, NIBAN3, NLRP2, NLRP3, NOS3, NOSTRIN, NPR1, NR4A3, NR5A2, NRN1, NRROS, OLR1, P2RX1, P2RX5, P2RX7, P2RY13, P2RY14, P2RY6, PARP15, PAX5, PCDH17, PCDH18, PCDH8, PDE2A, PDE3A, PDGFD, PDGFRL, PDPN, PGF, PGR, PHEX, PI16, PIEZO2, PILRA, PLA2G7, PLCE1, POTEJ, POU2AF1, POU2F2, PPP1R1C, PRDM6, PRF1, PRICKLE1, PRKCQ, PROCR, PROX1, PTAFR, PTGDR, PTGES, PTGIR, PTGIS, PTGS1, PTPRB, RASSF2, RASSF4, RCAN2, RECK, RELN, RGS5, RIMS3, ROBO4, RUNX1T1, S1PR1, SCIMP, SCN9A, SDC2, SDK2, SELP, SELPLG, SEMA7A, SEPTIN4, SFRP4, SH2D1A, SH2D2A, SH3RF2, SHANK3, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SIM2, SLAMF1, SLAMF6, SLAMF8, SLC11A1, SLC18A2, SLC1A3, SLC35G2, SLC6A1, SLC7A7, SLCO2A1, SLIT3, SMOC2, SNCA, SOD3, SOSTDC1, SOX17, SOX18, SOX5, SPIB, SPOCK1, SPON1, SRPX, STAP1, SUGCT, SVEP1, TAL1, TBX2, TBXA2R, TCL1A, TEK, TFAP2B, TGFB2, TGFBR3, TGM2, TH, THBD, THEMIS, TIE1, TIGIT, TLR1, TLR4, TLR6, TLR7, TLR9, TMEM119, TMEM255B, TNFRSF13B, TNFRSF13C, TNFRSF17, TNFSF8, TPSG1, TREML2, TRH, TRO, TRPC1, TRPC6, TSPAN18, TSPAN7, TUBB2B, TUBB6, TWIST1, TWIST2, UBASH3A, VCAM1, VEGFC, VGLL3, VSIG4, VSNL1, WFDC1, WNT2, WNT4, WNT5B, ZBP1, ZEB1, ZFHX4, ZNF683
DCIS2 | positive: BPIFB1, PDZK1, DTNA, AGR3, PLAT, BAALC, STEAP4, TSPAN8, PPP1R1B, NAT1, ESR1, EEF1A2, LRG1, PSD3, SIM2, SLC1A1, NPY1R, TRH, KCNK15, CFB, CEACAM5, CLDN7, TUBB3, AGR2, MUC1, CCND1, GREB1, PTK6, NOS1AP, PRLR, F7, EGF, GRIK3, THSD4, NECTIN2, HSPB1, GDF15, SERPINA5, PBX1, LASP1, EMP2, PSMC5, HES4, FSIP1, TPBG, INPP4B, OCLN, PPM1D, NQO1, ERBB3, MAP7, XBP1, TUBB2A, PMAIP1, SEZ6L2, SOX18, ACE, KIAA0408, TRIB3, CACNA1B, TNNT2, MAPK15, FGFR4, CELSR1, CTNND2, PLCE1, PTGES, CFC1, MAPT, FLRT3, AXIN2, LAD1, MACC1, CHAD, PTHLH, TBX3, TFPI2, NEBL, DHCR7, TLK2, FIBCD1, SPAG17, BMP8B, NOSTRIN, CCL22, BCAM, GHR, ADRA2A, OLFM1, TCIM, TNFRSF12A, SYTL2, BDKRB2, RERG, DSG2, EFS, ENPP1, TACC2, IRS1, NLRP2, SLC9A3R1, FRAS1, WNT4, TENT5C, DMKN, EFR3B, KCNK1, SIX1
DCIS2 | negative: ABCA10, ABCA8, ABCC9, ABI3, ABI3BP, AC007906.2, ACSL4, ACVRL1, ADA, ADAM12, ADAM33, ADAMDEC1, ADAMTS1, ADAMTS12, ADAMTS14, ADAMTS2, ADAMTS4, ADAMTS5, ADCYAP1, ADGRE2, ADGRL4, ADORA2B, ADORA3, ADRA1B, ADRB2, ADTRP, AIM2, ALPL, ANGPT1, ANGPTL2, ANXA8, APLNR, ASPN, ATL1, AVPR1A, BANK1, BCL11B, BCL2A1, BCL6B, BLK, BMP2, BMP6, BMPR1B, BNC2, BRINP1, C1QTNF1, C3AR1, C4B, C7, CADM3, CALB2, CALCRL, CARD9, CAVIN2, CAVIN3, CCDC102B, CCDC141, CCL14, CCL19, CCN3, CCN4, CCR1, CCR4, CCR5, CD19, CD1C, CD1D, CD1E, CD209, CD22, CD226, CD247, CD248, CD27, CD274, CD28, CD302, CD33, CD34, CD38, CD3D, CD3G, CD40, CD40LG, CD5, CD72, CD79A, CD79B, CD86, CD8A, CDH13, CDH23, CDH5, CDH6, CEP112, CES1, CLDN5, CLEC10A, CLEC12A, CLEC14A, CLEC4C, CLEC5A, CLEC7A, CMA1, CMKLR1, CNN1, CNR2, CNRIP1, CNTNAP1, COCH, COL10A1, COL4A3, COL4A4, COLEC12, CPVL, CPXM2, CR1, CRB2, CSF2RA, CSPG4, CST7, CTLA4, CTSG, CTSW, CUX2, CX3CL1, CXCL2, CXCR3, CXCR6, CYSLTR1, DCLK1, DERL3, DIO2, DLK1, DLL4, DLX4, DMD, DNASE1L3, DPT, DPY19L2, DSG3, EBF2, ECRG4, EDNRA, EGR2, ELN, ENPP2, ENPP3, EPHB1, ESM1, ETV1, F2RL3, FAM107A, FAP, FAT2, FAT4, FBLN5, FCER1A, FCGR2B, FCGR3A, FCMR, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FES, FGF1, FGF2, FGF7, FGR, FLT1, FLT3LG, FLT4, FOLH1, FOLR2, FOXC2, FOXD2, FPR1, FREM1, FRZB, FSCN1, FUT7, GABRD, GABRP, GBP5, GIMAP5, GIMAP8, GJC1, GLI2, GLT8D2, GPR174, GPR34, GPR4, GRK5, GRM4, GRP, GUCY1A2, GZMA, GZMB, GZMK, HAS2, HBEGF, HCK, HDAC9, HDC, HEYL, HGF, HLX, HMCN1, HOXA5, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HPSE2, HS3ST3A1, ICAM2, IDO1, IGF1, IL12RB1, IL18, IL18R1, IL1RL1, IL21R, IL2RB, IL33, IL34, IL3RA, IL6R, INHBA, IRF4, IRX1, ITGA7, ITIH5, ITK, JAM2, JAM3, KCNA3, KCNF1, KCNJ8, KCNK10, KCNK17, KCNMB1, KCNN3, KDR, KIT, KLHL13, KLK10, KLK6, KLRD1, KLRG1, KLRK1, LAIR1, LAMP3, LCK, LCN2, LCNL1, LDB3, LEF1, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LOX, LPAR1, LPL, LRRC15, LTK, LURAP1, LY75, LY96, MAOB, MAP1A, MAP2, MAP3K7CL, MERTK, MFAP5, MME, MMP9, MMRN2, MNDA, MPP1, MRC1, MS4A1, MS4A2, MUC16, NCCRP1, NCF1, NGFR, NIBAN3, NLRP3, NOD2, NOS3, NPNT, NPR1, NR4A3, NR5A2, NRN1, NRROS, NTRK2, OLR1, OPRD1, P2RX1, P2RX5, P2RX7, P2RY13, P2RY14, P2RY6, PALMD, PAMR1, PARP15, PAX5, PCDH10, PCDH17, PCDH18, PCDH8, PDE10A, PDE2A, PDE3A, PDGFD, PDGFRA, PDGFRB, PDPN, PGF, PGR, PHEX, PI16, PIEZO2, PILRA, PLA2G7, PLAGL1, PLCG2, PLEKHH2, PLXDC1, POTEI, POTEJ, POU2AF1, POU2F2, PPP1R1C, PRF1, PRICKLE1, PRKCQ, PROCR, PROM1, PROX1, PRRX1, PTGDR, PTGIR, PTGIS, PTGS1, PTPRB, RBMS3, RCAN2, RECK, RELN, RGS5, RIMS3, RNF180, ROBO4, ROR2, RTN1, RUNX1T1, S1PR1, SAMD5, SASH1, SATB1, SCGB1D2, SCIMP, SCN9A, SDC2, SDK2, SELP, SEMA7A, SEPTIN4, SERPINB5, SFRP4, SH2D1A, SH3RF2, SHANK3, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SLAMF1, SLAMF6, SLAMF8, SLC11A1, SLC18A2, SLC1A3, SLC35G2, SLC6A1, SLC7A7, SLCO2A1, SLIT2, SMPD3, SNCA, SOD3, SOSTDC1, SOX10, SOX17, SOX5, SPATA18, SPIB, SPOCK1, SPON1, SRPX, STAP1, STAT4, SUGCT, SULF1, SVEP1, SYNPO2, TAL1, TBX2, TBXA2R, TCL1A, TDO2, TEK, TFAP2B, TGFB2, TGFBR3, TH, THBD, THEMIS, TIE1, TIGIT, TLR1, TLR4, TLR6, TLR7, TLR9, TMEM119, TMEM255B, TMEM98, TNFRSF13B, TNFRSF17, TNFSF8, TPPP3, TPSG1, TRBC1, TREM2, TREML2, TRO, TRPC1, TRPC6, TSPAN18, TSPAN7, TUBB2B, TUBB6, TWIST1, TWIST2, UBASH3A, VCAM1, VEGFC, VGLL3, VSIG4, VSNL1, VTCN1, WFDC1, WNT2, WNT5B, ZBP1, ZEB1, ZFHX4, ZNF683
T | positive: IL7R, CD2, TRAC, CD96, CD3E, ZAP70, ITK, CD3D, IL2RB, KLRK1, TRBC1, CD6, CD8A, GZMA, THEMIS, CD28, CD5, CD3G, CD247, BCL11B, LCK, STAT4, CCR5, TCF7, GBP5, RASGRP1, ITGAL, SLAMF1, PRDM1, NLRC5, KCNA3, KLRD1, CXCR6, CD40LG, SLFN5, ZNF683, CD7, GIMAP4, CCR4, LAT, SH2D1A, AOAH, PRKCQ, PRF1, CTSW, GZMK, KLRG1, CD226, TIGIT, FYN, TRAF1, LEPROTL1, FLT3LG, JAK3, FCMR, CD52, SP140, ITGB7, CASP8, CST7, CTLA4, SIGIRR, NFATC2, CXCR3, APOBEC3G, ADGRE5, RUNX3, SLAMF6, GPR174, CD27, ZBP1, ATM, SYNRG, BTN3A1, SEMA4D, STK4, UBASH3A, PTGDR, GIMAP5, SH2D2A, TNFSF8, SELPLG, SATB1, CDC14A, CD44, PBXIP1, RBL2, CCND2, NLRP1, PARP15, KLF12, KAT2B, LEF1, PTGER4, ICOS, TC2N, LPXN, PTK2B, TNFAIP8, TUBA4A, OGT, TMEM173, IL21R, IL12RB1, S1PR1, LY75, LBH, CD58, CFLAR, SMCHD1, CD47, CYLD
T | negative: ABCA1, ABCA10, ABCA8, ABCC3, ABCC8, ABCC9, ABI3BP, AC007906.2, ACVRL1, ADAM12, ADAM28, ADAM33, ADAMDEC1, ADAMTS1, ADAMTS12, ADAMTS14, ADAMTS2, ADAMTS4, ADAMTS5, ADCYAP1, ADGRB2, ADGRE2, ADGRL4, ADORA2B, ADORA3, ADRA1B, ADRA2A, AEBP1, AFAP1L2, AGAP1, AGR3, AIF1, AIM2, ALDH2, ALDH7A1, ALPK3, ALPL, ANGPT1, ANGPTL2, ANGPTL4, ANO1, ANXA3, ANXA8, AP1S3, APLNR, AQP1, AR, ASPN, ATP7B, AVPR1A, BAALC, BACE2, BANK1, BCL6B, BDKRB2, BGN, BLK, BLNK, BMP2, BMP2K, BMP6, BMPR1B, BNC2, BPIFB1, BRINP1, BRIP1, C1QC, C1QTNF1, C3AR1, C5AR1, C7, CA12, CACNA1B, CACNA1D, CACNG4, CADM3, CALB2, CALCRL, CALML3, CARD10, CARD14, CARD9, CAVIN2, CAVIN3, CCDC102B, CCDC170, CCDC50, CCDC80, CCL14, CCN1, CCN2, CCN4, CCR1, CD14, CD163, CD19, CD1C, CD1D, CD1E, CD209, CD22, CD248, CD274, CD302, CD33, CD34, CD38, CD40, CD68, CD79A, CD79B, CD83, CD86, CDH11, CDH13, CDH3, CDH5, CDH6, CDK14, CEACAM5, CEBPA, CELSR1, CEP112, CES1, CFB, CFC1, CGNL1, CHAD, CHST8, CLCN5, CLDN5, CLEC10A, CLEC12A, CLEC14A, CLEC4C, CLEC5A, CLEC7A, CLGN, CLIC3, CMA1, CMKLR1, CMYA5, CNN1, CNR2, CNRIP1, CNTNAP1, COCH, COL10A1, COL17A1, COL18A1, COL4A3, COL4A4, COL5A1, COL5A2, COL7A1, COLEC12, COMP, CPVL, CPXM2, CR1, CRB2, CSF1R, CSF2RA, CSF3R, CSPG4, CTHRC1, CTNND2, CTSG, CTSL, CUX2, CX3CL1, CXADR, CXCL12, CXCL16, CXCL2, CYP24A1, CYP27A1, DAB2, DCLK1, DDR2, DEPTOR, DERL3, DKK3, DLK1, DLL4, DLX4, DMD, DMKN, DMXL2, DNAH7, DNASE1L3, DNM1, DPY19L2, DSC3, DSG2, DSG3, DTNA, DUSP5, EBF2, ECRG4, EDNRA, EEF1A2, EFNB2, EFR3B, EFS, EGF, EGFL7, EGFR, ELN, EMP1, EMP2, ENG, ENPP1, ENPP2, ENPP3, ENTPD2, EPAS1, EPB41L3, EPHA2, EPHB1, ERBB3, EREG, ERG, ERRFI1, ESM1, ESR1, EXO1, F13A1, F2RL3, F3, F7, FAAH, FAM107A, FAP, FAT2, FAT4, FBLN2, FBLN5, FBP1, FCER1A, FCGR2A, FCGR2B, FCGR3A, FCRL1, FCRL2, FCRL5, FCRLA, FES, FGF1, FGF2, FGF7, FGFR2, FGFR3, FGFR4, FHL2, FIBCD1, FILIP1L, FLRT3, FLT1, FLT3, FMN1, FOLH1, FOLR2, FOXC2, FPR1, FRAS1, FREM1, FRMD6, FRZB, FSCN1, FSIP1, FST, FUT7, FZD4, GABRD, GABRP, GAS6, GATA2, GHR, GJC1, GLI2, GLT8D2, GPR34, GPR39, GPR4, GPRC5B, GRAMD2B, GREB1, GREB1L, GRIK3, GRIK4, GRM4, GRP, GUCY1A2, GXYLT2, GZMB, HAS2, HAVCR2, HBEGF, HCK, HDAC9, HDC, HES4, HEYL, HGF, HK2, HLX, HMCN1, HMOX1, HOXA5, HOXD10, HOXD9, HPGD, HPGDS, HPSE2, HS6ST2, HSPA6, HSPG2, HTRA1, IDO1, IGF1, IGSF3, IL18, IL18R1, IL1RL1, IL33, IL34, IL3RA, INHBA, IRF4, IRS1, IRS2, IRX1, ITGA2, ITGA2B, ITGA3, ITGA7, ITGB6, ITIH5, JAG1, JAM2, KANK2, KCNF1, KCNH6, KCNJ8, KCNK1, KCNK10, KCNK15, KCNK17, KCNMA1, KCNMB1, KCNN3, KDR, KIF18B, KIT, KLF5, KLK10, KLK6, KMO, LAD1, LAMB3, LAMC1, LAMC2, LAMP3, LCN2, LCNL1, LDB3, LGMN, LGR4, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LMO2, LMX1B, LOX, LOXL1, LOXL2, LPAR1, LPL, LRP1, LRRC15, LRRK2, LTBP2, LTK, LUM, LURAP1, LY96, MACC1, MAFB, MAOB, MAP1A, MAP1B, MAP2, MAP3K20, MAP7, MAPK15, MAPT, ME1, MECOM, MEIS1, MEIS2, MERTK, MET, MFAP5, MLF1, MLXIPL, MME, MMP14, MMP9, MMRN2, MNDA, MNX1, MPP1, MRC1, MRC2, MS4A1, MS4A2, MS4A6A, MSR1, MST1R, MTNR1B, MUC16, MUC5B, MYCL, MYCN, MYH11, MYLK, MYO1B, MYO1E, NAT1, NCCRP1, NCF1, NCF2, NEBL, NECTIN1, NEK2, NGFR, NIBAN3, NOS1AP, NOSTRIN, NOTCH3, NPNT, NPR1, NPY1R, NR4A3, NR5A2, NRN1, NRP1, NRP2, NTN4, NTRK2, OCLN, OLFM1, OLFML3, OLR1, OPRD1, OVOL2, OXTR, P2RX1, P2RY13, P2RY14, P2RY2, P2RY6, PADI2, PALMD, PAMR1, PARM1, PAX5, PBK, PCDH10, PCDH17, PCDH18, PCDH8, PDE10A, PDE2A, PDE3A, PDE5A, PDGFA, PDGFRA, PDGFRB, PDGFRL, PDLIM4, PDPN, PDZK1, PGF, PGR, PHEX, PHF21B, PHGDH, PIEZO2, PILRA, PITX1, PLA2G7, PLA2R1, PLAGL1, PLAT, PLAUR, PLCE1, PLCG2, PLEKHH2, PLTP, PLVAP, PLXNB1, PMAIP1, PODXL, POTEF, POTEI, POU2AF1, PPARG, PPM1H, PPP1R1B, PRDM6, PRICKLE1, PRKAA2, PRLR, PROCR, PRODH, PROM1, PROX1, PRRX1, PSD3, PTAFR, PTGES, PTGFRN, PTGIR, PTGIS, PTGS1, PTK6, PTK7, PTPRB, PTPRG, RAPGEF3, RAPGEF5, RASD1, RASSF4, RBMS3, RBPMS, RCAN2, RECQL4, REEP6, RELN, RERG, RET, RGL3, RGS5, RIMS3, RIPK4, RNF180, RNF39, RNF43, ROBO4, ROR2, RRM2, RTN1, RUNX1T1, S100A1, S1PR3, SAMD5, SAPCD2, SASH1, SCGB1D2, SCIMP, SCN9A, SDC2, SDC4, SDK2, SEMA4B, SEMA7A, SEPTIN4, SEPTIN5, SERPINA5, SERPINB5, SERPINE1, SERPINH1, SEZ6L2, SFRP1, SGK1, SH3RF2, SHANK3, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SIM2, SIRPA, SIX1, SLAMF8, SLC11A1, SLC16A1, SLC18A2, SLC1A1, SLC1A3, SLC2A9, SLC30A8, SLC35G2, SLC6A1, SLC7A11, SLC7A7, SLC9A3R2, SLCO2A1, SLCO2B1, SLIT2, SLIT3, SMOC2, SMPD3, SMTN, SNCA, SOD3, SORCS1, SOSTDC1, SOX10, SOX17, SOX18, SOX5, SOX9, SPAG17, SPATA18, SPECC1, SPIB, SPOCK1, SPON1, SPON2, SPRY2, SRPX, ST14, STAP1, STEAP1, STEAP4, SULF1, SULF2, SVEP1, SYNM, SYNPO2, TACC2, TAL1, TBC1D30, TBX2, TBX3, TBXA2R, TCIM, TCL1A, TDO2, TEK, TFAP2B, TFPI2, TGFB2, TGM2, THBD, THBS2, THSD4, THY1, TIE1, TIMP3, TLR1, TLR2, TLR4, TLR6, TLR7, TLR9, TMEM119, TMEM255B, TMEM97, TMEM98, TNC, TNFRSF12A, TNFRSF13B, TNFRSF13C, TNFRSF17, TNFRSF21, TNFSF13, TNNT2, TNS4, TNXB, TP63, TPBG, TPPP3, TPSG1, TREM2, TREML2, TRH, TRIM29, TRO, TRPC6, TRPM2, TSPAN7, TSPAN8, TUBB2A, TUBB2B, TUBB3, TUBB6, TWIST1, TWIST2, TYMS, UNC5A, VCAM1, VCL, VEGFC, VGLL3, VSIG4, VSNL1, VTCN1, WDR90, WFDC1, WFS1, WNT2, WNT5B, ZFAT, ZFHX4, ZNF296
dendritic | positive: LCNL1, CLEC4C, GZMB, CSF2RA, DNASE1L3, IL3RA, SCN9A, EPHB1, SHD, LILRA4, CLIC3, PHEX, FLT3, LAMP3, IDO1, CLCN5, TCL1A, RUNX2, FUT7, ZFAT, IRF7, DUSP5, LTK, TLR9, TLR7, SPIB, CCDC50, CD83, NIBAN3, IRF4, CUX2, SMPD3, MAP1A, KCNK10, P2RY14, KCNK17, CMKLR1, NR4A3, RASSF4, MYCL, RIMS3, MS4A6A, SELPLG, CXCR3, ZDHHC17, ERN1, MAP3K14, TRAF1, RASSF2, DERL3, BLK, RELT, BLNK, LILRB4, RASD1, HS3ST3A1, SLC7A11, FCER1A, LAIR1, IL6R, LY75, IL7R, ADA, SEMA7A, P2RX1, NCCRP1, EPHA2, CTSC, SLC7A5, KCTD5, MAPKAPK2, JAK2, PLXNC1, IFI44L, NCF1, TNFRSF17, MX1, SULF2, P2RY6, FSCN1, CD274, HCK, GAS6, VEGFB, HLX, KIF2A, ETV6, IL21R, TREML2, CYSLTR1, WNT5B, KAT2B, PTGIR, TUBB6, TNFRSF21, ALDH2, MYO1E, NPC1, FES, CD68, ADAM12, CCL19, ZNF296, ZBTB33, RFTN1, MAN2B1, OAS1, IFNAR2, TSPAN13, TRAF4, HDAC9, CCDC102B, MDFIC, ZEB1, CST7, PLEKHO1, SLC2A1, RUBCN
dendritic | negative: ABCA10, ABCA8, ABCC12, ABCC8, ABCC9, ABI3, ABI3BP, AC007906.2, ACVRL1, ADAM33, ADAMTS1, ADAMTS12, ADAMTS14, ADAMTS2, ADAMTS4, ADAMTS5, ADCYAP1, ADGRB2, ADGRL4, ADORA2B, ADORA3, ADRA1B, ADRA2A, AFAP1L2, AGR3, AIM2, ALPK3, ALPL, ANGPT1, ANGPTL2, ANGPTL4, ANXA3, ANXA8, APLNR, AQP1, ASPN, ATL1, AURKB, AVPR1A, BAALC, BACE2, BARX2, BCL6B, BDKRB2, BMP2, BMP6, BMP8B, BMPR1B, BNC2, BPIFB1, BRINP1, C1QTNF1, C3AR1, C5AR1, C7, CA12, CACNA1B, CACNG4, CALB2, CALML3, CARD10, CARD14, CARD9, CAVIN2, CAVIN3, CCDC141, CCL14, CCN3, CCN4, CCR4, CD19, CD1C, CD1D, CD209, CD22, CD247, CD27, CD28, CD33, CD34, CD3G, CD40LG, CD72, CD79B, CDH13, CDH3, CDH5, CDH6, CDKN2B, CEBPA, CEP112, CES1, CFC1, CGNL1, CHST8, CLDN5, CLEC12A, CLEC14A, CLEC5A, CLEC7A, CLGN, CMA1, CMYA5, CNN1, CNRIP1, CNTNAP1, COL10A1, COL17A1, COL4A3, COL4A4, COLEC12, COMP, CPXM2, CR1, CRB2, CSF1, CSPG4, CTLA4, CTNND2, CTSG, CX3CL1, CXADR, CXCL2, CXCR6, CYP27A1, DCLK1, DDR2, DIO2, DKK3, DLK1, DLL4, DLX4, DNAH5, DNAH7, DPT, DPY19L2, DSC3, DSG3, EBF2, ECRG4, EDN1, EDNRA, EFR3B, EGF, EGFR, EGR2, ELN, ENPP3, ENTPD2, EREG, ERG, ERRFI1, ESM1, ETV1, F2R, F2RL3, F3, F7, FAM107A, FAT2, FAT4, FBLN5, FCGR2A, FCGR2B, FCGR3A, FCMR, FCRL1, FCRL2, FCRL5, FCRLA, FGF1, FGF2, FGF7, FGFR2, FGFR4, FILIP1L, FLRT3, FLT1, FLT3LG, FLT4, FMOD, FOLH1, FOLR2, FOXD2, FPR1, FRAS1, FREM1, FRZB, FST, GABRD, GABRP, GHR, GIMAP5, GJC1, GLT8D2, GPR34, GPR4, GPRC5B, GRIK3, GRK5, GRP, GUCY1A2, GZMA, GZMK, HAS2, HBEGF, HDC, HES6, HEYL, HGF, HMCN1, HOXA5, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HPSE2, HS6ST2, HSPA6, ICOS, IGF1, IGSF3, IL17RB, IL18, IL1RL1, IL2RB, IL33, IL34, INHBA, IRS1, IRX1, ITGA2B, ITGA7, ITIH5, ITK, JAM2, JAM3, KANK2, KCNF1, KCNH6, KCNJ8, KCNK15, KCNMB1, KCNN3, KCNN4, KDR, KIAA0408, KIF18B, KIT, KLK10, KLK6, KLRD1, LAMB3, LAMC2, LCK, LCN2, LDB3, LEF1, LGR4, LIF, LILRB5, LMO2, LOX, LOXL2, LPAR1, LRG1, LRRC15, LURAP1, MAOB, MAP1B, MAP2, MAP3K7CL, MAPK11, MAPK15, MAPT, ME1, MECOM, MEIS2, MERTK, MET, MFAP5, MLXIPL, MME, MMP9, MMRN2, MNX1, MRC1, MS4A1, MS4A2, MSR1, MTNR1B, MUC16, MUC5B, MYH11, MYLK, NAT1, NEK2, NLRP3, NOS1AP, NOS3, NOSTRIN, NPNT, NPR1, NPY1R, NR5A2, NRN1, NTRK2, OLFM1, OLFML3, OLR1, OPRD1, OXTR, P2RX5, P2RY2, PALMD, PAMR1, PAX5, PBK, PCDH10, PCDH17, PCDH18, PDE10A, PDE2A, PDE3A, PDE5A, PDGFA, PDGFD, PDGFRA, PDGFRL, PDLIM4, PDPN, PDZK1, PGF, PGR, PI16, PILRA, PITX1, PLA2G7, PLA2R1, PLCE1, PLEKHH2, PODXL, POTEI, POTEJ, POU2AF1, PPARG, PPFIA3, PRDM6, PRF1, PRICKLE1, PRKAA2, PRKCQ, PROCR, PROM1, PROX1, PRRX1, PTAFR, PTGIS, PTGS1, PTHLH, PTPRB, PTPRM, RAPGEF3, RASGRP1, RBPMS, RCAN2, RECK, RELN, RERG, RGS5, RIPK4, RNF180, RNF39, ROBO4, ROR2, RTN1, RUNX1T1, S100A1, SAMD5, SASH1, SCGB1D2, SCIMP, SDC2, SELP, SEPTIN4, SEPTIN5, SERPINA5, SERPINB5, SERPINE1, SFRP1, SFRP4, SH2D1A, SH2D2A, SH3RF2, SHANK3, SIGLEC1, SIGLEC9, SIM2, SLAMF8, SLC11A1, SLC18A2, SLC1A3, SLC35G2, SLC6A1, SLC7A7, SLCO2A1, SLIT2, SLIT3, SMOC2, SMTN, SOD3, SORCS1, SOSTDC1, SOX10, SOX17, SOX18, SOX5, SOX9, SPA17, SPAG17, SPATA18, SPOCK1, SPON1, SPRY2, STAP1, STEAP1, STEAP4, STX1A, SUGCT, SULF1, SVEP1, TAL1, TBX2, TBXA2R, TDO2, TEK, TFAP2B, TGFB2, TGFBR3, TGM2, TH, TICRR, TIE1, TIGIT, TLR4, TMEM119, TMEM255B, TMEM45B, TMEM98, TNFRSF12A, TNFRSF13B, TNFRSF13C, TNS4, TP63, TPPP3, TPSG1, TREM2, TRIB3, TRIM29, TRPC1, TRPC6, TSPAN18, TSPAN7, TUBB3, TWIST1, TWIST2, VEGFC, VGLL3, VSIG4, VSNL1, VSTM2L, VTCN1, WNT2, WNT4, WWC1, ZBP1, ZFHX4, ZNF683
endo | positive: SOX17, CDH5, HOXD9, NR5A2, SLCO2A1, PLVAP, PTPRB, CCL14, ROBO4, CLEC14A, ADGRL4, SHANK3, KDR, FLT1, CD34, CALCRL, TEK, ENG, CLDN5, HSPG2, BCL6B, PCDH17, NPR1, MMRN2, DLL4, AQP1, PALMD, APLNR, SLC35G2, NRN1, PROX1, FOLH1, TAL1, TSPAN7, TMEM255B, PDE2A, TIE1, NOSTRIN, EGFL7, CAVIN2, CDH13, HOXD10, TSPAN18, FLT4, ACVRL1, ADAMTS4, EMP1, IL33, F2RL3, IL3RA, SELP, CPXM2, FAM107A, ESM1, THBD, BMP2, NOS3, GPR4, PTPRM, HBEGF, TGM2, FAT4, GABRD, PODXL, FZD4, SOX18, PIEZO2, TBXA2R, ADAMTS1, JAM2, RGS5, MET, VEGFC, ANGPTL2, RELN, S1PR1, BMP6, KCNN3, EPAS1, CAVIN3, ITGA5, NRP2, CNRIP1, C1QTNF1, EDN1, GJC1, ALPK3, RAPGEF3, HTRA1, TGFBR3, ERG, ICAM2, ABI3, LOX, PROCR, MECOM, RCAN2, CEP112, PDE10A, BDKRB2, PGF, ITIH5, GIMAP8, PRCP, PDGFD, EFNB2, HLX, C7, TNXB, RNF180, TRPC6, SASH1, ABCC9, OLFM1, PPARG, GPRC5B, PDGFB, FGF2, CARD10, NPNT, RAPGEF5, FSCN1, LMO2, TGFBR2, ZEB1, ELK3, CXCL12, GIMAP4, ELN, DOCK9, MAPK11
endo | negative: ABCA10, ABCA8, ABCC12, ABCC8, AC007906.2, ADAMDEC1, ADAMTS14, ADCYAP1, ADGRE2, ADORA2B, ADORA3, ADRA1B, ADTRP, AGR3, ANGPT1, ANXA8, ASPN, ATL1, BAALC, BANK1, BARX2, BCL2A1, BLK, BLNK, BMP8B, BMPR1B, BPIFB1, BRINP1, C3AR1, C4B, C5AR1, CACNG4, CADM3, CALB2, CALML3, CARD9, CCL22, CCN4, CCR1, CCR4, CCR5, CCR6, CD19, CD1C, CD1E, CD209, CD22, CD226, CD247, CD27, CD28, CD33, CD38, CD3G, CD40LG, CD5, CD7, CD72, CD79A, CD83, CD86, CD8A, CEBPA, CES1, CFC1, CLEC10A, CLEC12A, CLEC4C, CLEC5A, CLEC7A, CLGN, CLIC3, CMA1, CMKLR1, CMYA5, CNR2, COCH, COL10A1, COL4A3, COL4A4, CR1, CRB2, CSF3R, CST7, CTLA4, CTNND2, CTSG, CTSW, CUX2, CXADR, CXCR3, CXCR6, DCLK1, DERL3, DLK1, DLX4, DNAH7, DNM1, DPT, DSC3, DSG3, ECRG4, EGF, EGR2, ENPP3, ENTPD2, EREG, F7, FAT2, FCER1A, FCGR2A, FCGR2B, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FGF1, FGFR2, FLRT3, FLT3, FOLR2, FPR1, FREM1, FST, FUT7, GABRP, GLI2, GPR174, GPR39, GRIK3, GRIK4, GRM4, GRP, GZMA, GZMB, GZMK, HAS2, HAVCR2, HCK, HDC, HGF, HPGD, HPGDS, HPSE, HPSE2, HS3ST3A1, ICOS, IDO1, IL12RB1, IL18, IL18R1, IL1RL1, IL21R, IL2RB, IL34, IL6R, IRF4, IRS1, IRS2, IRX1, ITGA2B, ITK, KCNA3, KCNF1, KCNH6, KCNK10, KCNK15, KCNK17, KCNMA1, KCNN4, KIAA0408, KIF18B, KIT, KLHL13, KLK10, KLK6, KLRD1, KMO, LAMB3, LAMC2, LAMP3, LCN2, LCNL1, LDB3, LGR4, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LPAR1, LRG1, LRRK2, LTK, MAOB, MAP1A, MAPT, ME1, MLXIPL, MME, MNDA, MNX1, MS4A1, MS4A2, MTNR1B, MUC16, MUC5B, MYCL, NCCRP1, NCF1, NCF2, NEK2, NIBAN3, NKX3-1, NLRP2, NLRP3, NOD2, NOS1AP, NPY1R, NR4A3, NTRK2, OLR1, OPRD1, P2RX1, P2RX5, P2RX7, P2RY13, P2RY14, PAX5, PCDH10, PCDH8, PDE3A, PDZK1, PGR, PHEX, PHF21B, PI16, PILRA, PLA2G7, PLEKHH2, PMAIP1, POTEI, POTEJ, POU2AF1, POU2F2, PPFIA3, PPP1R1C, PRF1, PRKCQ, PRODH, PROM1, PTGDR, PTGES, PTGIS, PTGS1, PTHLH, RIMS3, RIPK4, RNF39, ROR2, RTN1, S100A1, SCGB1D2, SCIMP, SCN9A, SDK2, SERPINB5, SFRP4, SH2D1A, SH2D2A, SH3RF2, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SIM2, SLAMF6, SLAMF8, SLC11A1, SLC18A2, SLC1A3, SLC6A1, SLC7A11, SLIT2, SMPD3, SOSTDC1, SOX10, SPA17, SPAG17, SPATA18, SPIB, SPOCK1, SPON1, STAP1, STEAP1, SUGCT, TCL1A, TFAP2B, TH, TIGIT, TLR1, TLR6, TLR7, TLR9, TNFRSF13B, TNFRSF13C, TNFRSF17, TNFSF8, TNS4, TP63, TPSG1, TREM2, TREML2, TRH, TRIM29, TRPM2, TUBB2B, TWIST1, TWIST2, UBASH3A, VGLL3, VSIG4, VSNL1, VSTM2L, VTCN1, WNT2, WNT4, WNT5B, ZBP1, ZFHX4, ZNF296, ZNF683
macro | positive: SIGLEC1, MS4A6A, SLC11A1, CD163, LILRB5, PLA2G7, CSF1R, MSR1, CSF3R, VSIG4, CLEC7A, SLC1A3, CPVL, CD14, FCGR3A, MRC1, CD68, OLR1, C1QC, CLEC10A, P2RY13, SLAMF8, FOLR2, CD209, F13A1, MERTK, AIF1, FCGR2A, NCF2, HSPA6, MNDA, CD86, CSF2RA, C3AR1, CLEC5A, TLR2, SIGLEC9, RASSF4, SLCO2B1, CD33, FPR1, HAVCR2, AOAH, ADORA3, PLTP, CLEC12A, LILRB2, IL18, ADGRE2, TREM2, NLRP3, GPR34, HCK, PILRA, MPP1, PTGS1, CR1, CD1D, TLR1, FCGR2B, CCR1, SLC7A7, CD1E, DAB2, LILRB4, CMKLR1, TLR4, FCER1A, ADAMDEC1, GIMAP8, HPSE, P2RX7, FGR, LY96, SCIMP, TLR7, CD1C, FMN1, CARD9, RTN1, TNFSF13, KCNMB1, C5AR1, LAIR1, CTSC, PTAFR, HMOX1, TLR6, ADAM28, LRRK2, ABI3, CD72, MAFB, P2RY6, EPB41L3, LGMN, SIRPA, DMXL2, MMP9, FES, ARRB2, COLEC12, NRROS, CASP1, BCL2A1, LPAR6, SLC2A9, KCNMA1, CTSL, LRP1, CEBPA, HGF, CD302, TYMP, CXCL16, TRPM2, LIPA, CREG1, ENPP2, VSIR, CD38, SNX10
macro | negative: ABCA10, ABCA8, ABCC12, ABCC8, ABCC9, ABI3BP, AC007906.2, ACVRL1, ADAM12, ADAM33, ADAMTS1, ADAMTS12, ADAMTS14, ADAMTS2, ADAMTS4, ADAMTS5, ADCYAP1, ADGRB2, ADGRL4, ADRA1B, ADRA2A, AFAP1L2, AGR3, ALDH7A1, ALPK3, ALPL, ANGPT1, ANGPTL2, ANXA3, ANXA8, APLNR, AQP1, ASPN, ATL1, AVPR1A, AXIN2, BAALC, BACE2, BANK1, BARX2, BCL6B, BDKRB2, BLK, BMP2, BMP6, BMP8B, BMPR1B, BPIFB1, BRINP1, C1QTNF1, C4B, C7, CACNA1B, CACNG4, CADM3, CALB2, CALCRL, CALML3, CARD10, CAVIN2, CAVIN3, CCDC102B, CCL14, CCL19, CCL28, CCN2, CCN3, CCN4, CCR4, CD19, CD248, CD27, CD34, CD40LG, CD7, CD79A, CD79B, CD8A, CDH11, CDH13, CDH3, CDH5, CDH6, CDKN2B, CELSR3, CENPA, CEP112, CGNL1, CHAD, CLDN5, CLEC14A, CLEC4C, CLGN, CLIC3, CMA1, CMYA5, CNN1, CNR2, CNTNAP1, COCH, COL10A1, COL17A1, COL4A3, COL4A4, COL7A1, COMP, CPXM2, CRB2, CSPG4, CTLA4, CTNND2, CTSG, CTSW, CUX2, CX3CL1, CXCR3, CXCR6, DCLK1, DDR2, DERL3, DIO2, DKK3, DLK1, DLL4, DLX4, DMD, DNAH5, DNAH7, DNASE1L3, DPT, DPY19L2, DSC3, DSG3, EBF2, ECRG4, EDN1, EDNRA, EFNB2, EFR3B, EGF, EGFR, ELN, ENPP3, ENTPD2, EPHA2, EPHB1, EREG, ERG, ERRFI1, ESM1, ETV1, F2R, F2RL3, F3, F7, FAM107A, FAP, FAT2, FAT4, FBLN5, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FGF1, FGF2, FGF7, FGFR2, FGFR4, FLRT3, FLT1, FLT4, FMOD, FOLH1, FOXC2, FOXD2, FREM1, FRZB, FST, FZD4, GABRD, GABRP, GHR, GJC1, GLI2, GLT8D2, GPR174, GPR4, GRIK3, GRIK4, GRM4, GRP, GUCY1A2, GXYLT2, GZMB, GZMK, HAS2, HDC, HEYL, HMCN1, HOXA5, HOXD10, HOXD9, HPGD, HPSE2, HS3ST3A1, HS6ST2, ICOS, IGSF3, IL17RB, IL18R1, IL1RL1, IL33, IL34, IL3RA, INHBA, IRF4, IRS1, IRX1, ITGA2B, ITGA7, ITIH5, JAG1, JAM2, JAM3, KANK2, KCNF1, KCNH6, KCNJ8, KCNK10, KCNK15, KCNK17, KCNN3, KDR, KIAA0408, KIF18B, KIT, KLHL13, KLK10, KLK6, KLRD1, LAMB3, LAMC2, LAMP3, LCN2, LCNL1, LDB3, LEF1, LGR4, LIF, LILRA4, LOX, LOXL2, LRG1, LRRC15, LTK, MAOB, MAP1A, MAP1B, MAP2, MAP3K7CL, MAPK11, MAPT, MECOM, MEIS2, MET, MFAP5, MLXIPL, MME, MMP11, MMRN2, MS4A1, MS4A2, MTNR1B, MUC16, MUC5B, MYH11, NAV2, NCCRP1, NGFR, NIBAN3, NKX3-1, NLRP2, NOS1AP, NOS3, NOSTRIN, NPNT, NPR1, NPY1R, NR4A3, NR5A2, NRN1, NTRK2, OPRD1, OXTR, P2RX1, P2RX5, P2RY2, PALMD, PAMR1, PAX5, PBK, PCDH10, PCDH17, PCDH18, PCDH8, PDE10A, PDE2A, PDE3A, PDE5A, PDGFD, PDGFRA, PDGFRB, PDGFRL, PDLIM4, PDPN, PDZK1, PGF, PGR, PHEX, PHF21B, PHLDB2, PI16, PIEZO2, PITX1, PLA2R1, PLCE1, PLEKHH2, PODXL, POTEI, POTEJ, POU2AF1, PPP1R1C, PRF1, PRICKLE1, PRKAA2, PRKCQ, PROM1, PROX1, PRRX1, PTGDR, PTGES, PTGIS, PTHLH, PTK7, PTP4A3, PTPRB, RAPGEF3, RASD1, RBMS3, RBPMS, RCAN2, RECK, RELN, RERG, RGS5, RIMS3, RIPK4, RNF180, RNF39, ROBO4, ROR2, RUNX1T1, S100A1, S1PR1, SAMD5, SCGB1D2, SDK2, SELP, SEMA7A, SEPTIN4, SEPTIN5, SERPINA5, SERPINB5, SERPINE1, SFRP1, SFRP4, SH2D1A, SH2D2A, SH3RF2, SHANK3, SHD, SIGLEC6, SIM2, SLAMF6, SLC18A2, SLC35G2, SLC6A1, SLC7A11, SLCO2A1, SLIT2, SLIT3, SMOC2, SMPD3, SOD3, SORCS1, SOSTDC1, SOX10, SOX17, SOX18, SOX5, SOX9, SPA17, SPAG17, SPATA18, SPIB, SPOCK1, SPON1, SPON2, SRPX, STAP1, STEAP1, STEAP4, SUGCT, SULF1, SVEP1, SYNPO2, TAL1, TBX2, TBXA2R, TCL1A, TDO2, TEK, TFAP2B, TGFBR3, TH, THBS2, THY1, TIE1, TIGIT, TLR9, TMEM119, TMEM45B, TMEM98, TNFRSF13B, TNFRSF13C, TNFRSF17, TNS4, TP63, TPPP3, TPSG1, TRH, TRIB3, TRIM29, TRO, TRPC1, TSPAN18, TSPAN7, TUBB2B, TUBB3, TUBB6, TWIST1, TWIST2, UBASH3A, UNC5A, VEGFC, VGLL3, VSNL1, VSTM2L, VTCN1, WFDC1, WNT2, WNT4, WNT5B, ZFAT, ZFHX4, ZNF296, ZNF683
mast | positive: HDC, IL1RL1, KIT, MS4A2, SLC18A2, ADCYAP1, TPSG1, CTSG, HPGDS, LIF, CMA1, HPGD, ENPP3, GATA2, ADGRE2, IL18R1, CSF1, ADRB2, KLRG1, PTGS1, SIGLEC6, FER, P2RX1, STXBP5, BMP2K, ACSL4, FOXP1, MCTP2, ABCC1, TMEM255B, CAVIN2, MAOB, CD33, C3AR1, MEIS2, CD274, AGAP1, LAT, CD22, CALB2, PLAUR, AHR, ABCA1, AP1S3, CD82, IRS2, SGK1, BACE2, PPM1H, CD44, NEK6, ABCC4, ARRB2, ADGRE5, RASSF5, CNST
mast | negative: ABCA10, ABCC12, ABCC3, ABCC9, ABI3, ABI3BP, AC007906.2, ACVRL1, ADA, ADAM28, ADAM33, ADAMTS1, ADAMTS12, ADAMTS2, ADAMTS4, ADGRL4, ADORA2B, ADRA1B, ADTRP, AEBP1, AFAP1L2, AIF1, AIM2, ALDH2, ALDH7A1, ALPK3, ANGPTL2, ANGPTL4, ANKRD13A, ANO1, AOAH, APLNR, AQP1, ATL1, AURKB, AVPR1A, AXIN2, BANK1, BARX2, BCL11B, BCL6B, BGN, BLK, BLNK, BMP8B, BMPR1B, BPIFB1, C1QC, C1QTNF1, C5AR1, CACNA1B, CACNG4, CALCRL, CALML3, CARD14, CASP1, CAVIN3, CCDC102B, CCDC170, CCDC50, CCDC80, CCL14, CCN1, CCN2, CCN4, CCR1, CCR5, CD14, CD151, CD163, CD19, CD1D, CD2, CD209, CD247, CD248, CD27, CD28, CD34, CD3D, CD3E, CD3G, CD40, CD5, CD6, CD79A, CD79B, CD86, CD8A, CD96, CDH11, CDH13, CDH23, CDH3, CDH5, CDH6, CDK14, CDKN2B, CEBPA, CELSR1, CFB, CHAD, CLCN5, CLDN5, CLEC10A, CLEC14A, CLEC4C, CLEC7A, CLGN, CLIC3, CLSTN3, CMKLR1, CMYA5, CNN1, COL10A1, COL17A1, COL4A5, COL5A1, COL5A2, COL7A1, COLEC12, COMP, CPVL, CPXM2, CR1, CSF1R, CSF2RA, CSF3R, CSPG4, CTHRC1, CTNND2, CTSC, CTSK, CTSL, CX3CL1, CXCL12, CXCR3, CYP1B1, CYP27A1, DAB2, DCLK1, DCN, DERL3, DIO2, DKK3, DLK1, DLL4, DMD, DMKN, DNAH5, DNASE1L3, DNM1, DOCK9, DSG3, DTNA, DUSP5, EBF2, ECRG4, EDN1, EDNRA, EFNB2, EFR3B, EFS, EGF, EGFL7, EGFR, ELK3, ELN, EMP1, EMP2, ENPP1, ENTPD2, EPB41L3, EPHA2, EPHB1, ERRFI1, ESR1, F13A1, F2R, F3, F7, FAAH, FAP, FAT2, FBLN2, FBLN5, FCGR2A, FCGR2B, FCGR3A, FCMR, FCRL1, FCRL2, FCRL5, FGF1, FGF7, FGFR2, FGFR3, FGFR4, FHL2, FIBCD1, FILIP1L, FLRT3, FLT1, FLT3, FLT4, FMOD, FOLR2, FRAS1, FRMD6, FRZB, FST, FUT7, FZD4, GAS6, GBP5, GHR, GIMAP4, GIMAP8, GJC1, GLT8D2, GPR39, GPRC5B, GRK5, GUCY1A2, GXYLT2, GZMA, GZMB, HBEGF, HCK, HDAC9, HES4, HES6, HEYL, HMCN1, HMOX1, HOXD9, HSPA6, HSPD1, HTRA1, ICAM2, IDO1, IFI44L, IGF1, IGSF3, IL1R1, IL2RB, IL33, IL34, IL3RA, IL6R, IL7R, INHBA, INPP4B, IRF4, IRX1, ITGA2, ITGA5, ITGA7, ITGAL, ITGB7, ITK, JAG1, JAM3, KAT2B, KCNA3, KCNH6, KCNJ8, KCNK1, KCNK15, KCNK17, KCNMB1, KCNN4, KCTD5, KDR, KIAA0408, KIF18B, KLF12, KLK6, KLRK1, KMO, LAD1, LAMB3, LAMC1, LAMC2, LAMP3, LBH, LCK, LCNL1, LGMN, LILRA4, LILRB5, LIPA, LMX1B, LOX, LOXL1, LOXL2, LPAR1, LPAR6, LRATD2, LRG1, LRP1, LRRK2, LTBP2, LTK, LUM, LY96, MACC1, MAFB, MAP1A, MAP1B, MAP2, MAP3K14, MAP3K20, MAPK11, MAPK15, MAPT, MDFIC, MEIS1, MERTK, MET, MFAP5, MLF1, MLXIPL, MME, MMP11, MMP14, MMRN2, MNDA, MNX1, MRC1, MRC2, MS4A1, MS4A6A, MSR1, MX1, MYCL, MYH11, MYLK, MYO1B, MYO1E, NBL1, NCF2, NECTIN1, NECTIN2, NGFR, NIBAN3, NINJ1, NKX3-1, NLRP1, NLRP2, NLRP3, NOSTRIN, NOTCH3, NPC1, NPR1, NPY1R, NR5A2, NRN1, NTN4, NTRK2, OAS1, OLFML3, OLR1, OPRD1, ORAI2, OVOL2, OXTR, P2RX5, P2RY13, PALMD, PAMR1, PARM1, PAX5, PBK, PCDH17, PCDH18, PDE10A, PDE5A, PDGFA, PDGFB, PDGFD, PDGFRA, PDGFRB, PDGFRL, PDK1, PDLIM4, PDPN, PDZK1, PGF, PHEX, PHLDB2, PIEZO2, PILRA, PITX1, PLA2G7, PLA2R1, PLCE1, PLEKHH2, PLTP, PLVAP, PLXDC1, PMAIP1, PODXL, POTEI, POU2AF1, POU2F2, PPARG, PRCP, PRDM1, PRICKLE1, PRKAA2, PRLR, PRODH, PROX1, PRRX1, PSD3, PTGFRN, PTGIS, PTHLH, PTK7, PTP4A3, PTPRB, PTPRG, PTPRM, RAPGEF3, RASD1, RASGRP1, RASSF4, RBMS3, RBPMS, RCAN2, RERG, RGL3, RGS5, RIPK4, ROBO4, ROR2, RUBCN, RUNX1T1, RUNX2, S100A1, S1PR3, SAMD5, SAPCD2, SASH1, SCGB1D2, SCIMP, SCN9A, SDC2, SDC4, SELENBP1, SELP, SELPLG, SEMA4B, SEPTIN4, SEPTIN5, SERPINB5, SERPINE1, SFRP4, SH3RF2, SHANK3, SHD, SIGLEC1, SIM2, SIRPA, SIX1, SLAMF1, SLAMF8, SLC11A1, SLC16A1, SLC1A3, SLC2A1, SLC2A9, SLC35G2, SLC6A1, SLC7A11, SLC7A5, SLC7A7, SLC9A3R2, SLCO2A1, SLIT2, SLIT3, SMOC2, SMPD3, SMTN, SNCA, SNX10, SOD3, SORCS1, SOSTDC1, SOX10, SOX17, SOX18, SOX5, SP140, SPA17, SPAG17, SPATA18, SPIB, SPOCK1, SPON1, SPON2, SRPX, ST6GAL1, STAT4, STEAP1, STEAP4, SULF1, SULF2, SVEP1, SYNPO2, SYVN1, TACC2, TBX2, TBX3, TCF7, TCIM, TCL1A, TEK, TENT5C, TFAP2B, TGFB3, TGM2, THBD, THBS2, THEMIS, THY1, TIMP2, TLK2, TLR1, TLR2, TLR4, TLR6, TLR7, TLR9, TMEM119, TMEM45B, TMEM97, TMEM98, TNC, TNFRSF13B, TNFRSF13C, TNNT2, TNS4, TNXB, TP63, TPPP3, TRAC, TRAF1, TRBC1, TREM2, TRIB3, TRIM29, TRPC6, TSPAN13, TSPAN18, TUBB2A, TWIST1, UNC5A, VCAM1, VCL, VEGFC, VSIG4, VSNL1, VSTM2L, WFS1, WWC1, ZAP70, ZBTB33, ZEB1, ZFAT, ZNF296
myoepi | positive: TRIM29, IRX1, TNS4, SOSTDC1, FAT2, COL17A1, LAMB3, SAMD5, TFAP2B, SOX10, AC007906.2, CALML3, DSG3, ECRG4, CDH3, FST, F3, TP63, MME, VSNL1, KLK6, DSC3, SERPINB5, KLK10, NTRK2, BRINP1, MAOB, MYH11, SFRP1, ANXA8, SH3RF2, CX3CL1, TNC, ADORA2B, CNN1, PROM1, GABRP, CDH13, PDLIM4, GRP, ERRFI1, LCN2, CRB2, PAMR1, LAMC2, MYLK, IL34, ANXA3, NGFR, PGR, VTCN1, FGF1, DST, CSPG4, KCNMB1, TUBB2B, LTBP2, COL7A1, SYNM, FGFR2, MET, CES1, ITGA2, RNF39, CXCL2, CADM3, HOXA5, EGFR, ADTRP, ATL1, CCL28, KCNN4, SDK2, ADAMTS5, KLHL13, DMD, DKK3, CCN3, OXTR, CMYA5, NAV2, TMEM98, ABCC3, NTN4, GRAMD2B, LGR4, KIT, FGF2, CDH23, SNCA, TLR2, COL4A5, DMKN, RNF180, LURAP1, TGFB2, ETV1, PALMD, JAG1, GRIK3, ALDH7A1, PDGFA, ITGA3, FHL2, CARD10, SOX9, CXADR, WNT4, S100A1, RIPK4, BARX2, WWC1
myoepi | negative: ABCA8, ABCC12, ABCC8, ABCC9, ABI3BP, ACVRL1, ADA, ADAM33, ADAMDEC1, ADAMTS12, ADAMTS14, ADAMTS4, ADCYAP1, ADGRL4, ADORA3, ADRA1B, ADRA2A, AIM2, ALPL, ANGPT1, APLNR, ASPN, AVPR1A, BANK1, BCL2A1, BCL6B, BDKRB2, BLK, BMP2, BMP6, BNC2, BPIFB1, C4B, C7, CALCRL, CCDC102B, CCDC141, CCL14, CCL19, CCN4, CCR1, CCR4, CCR6, CD19, CD1C, CD1D, CD1E, CD209, CD22, CD226, CD27, CD274, CD28, CD33, CD34, CD38, CD3G, CD40LG, CD5, CD7, CD72, CD79A, CD79B, CD86, CDH6, CFC1, CLDN5, CLEC10A, CLEC12A, CLEC14A, CLEC4C, CLEC5A, CMA1, CMKLR1, CNR2, CNRIP1, CNTNAP1, COCH, COL10A1, COL4A3, COL4A4, COLEC12, CR1, CST7, CTLA4, CTSG, CUX2, CXCR3, CXCR6, CYSLTR1, DCLK1, DERL3, DLK1, DLL4, DLX4, DNASE1L3, DPT, DPY19L2, EBF2, ENPP2, ENPP3, EPHB1, EREG, ESM1, F2RL3, FAM107A, FAT4, FCER1A, FCGR2B, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FGF7, FGR, FLT1, FLT4, FOLH1, FOLR2, FOXD2, FPR1, FREM1, FUT7, GABRD, GIMAP5, GIMAP8, GJC1, GLI2, GPR174, GPR4, GRIK4, GRM4, GUCY1A2, GZMA, GZMB, GZMK, HAS2, HBEGF, HCK, HDC, HEYL, HGF, HLX, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HPSE2, HS3ST3A1, ICAM2, ICOS, IDO1, IGF1, IL12RB1, IL18R1, IL1RL1, IL21R, IL3RA, IRF4, KCNA3, KCNF1, KCNH6, KCNJ8, KCNK10, KCNN3, KDR, KLRD1, KLRG1, LAMP3, LCNL1, LDB3, LILRA4, LILRB2, LILRB4, LILRB5, LPL, LRRC15, LTK, LY96, MAP1A, MAP3K7CL, MECOM, MFAP5, MLXIPL, MNDA, MRC1, MS4A1, MS4A2, MTNR1B, NCF1, NIBAN3, NLRP3, NOD2, NOS3, NPNT, NPR1, NR4A3, NR5A2, NRN1, NRROS, OLR1, OPRD1, P2RX1, P2RX5, P2RX7, P2RY13, P2RY14, PAX5, PCDH17, PCDH18, PCDH8, PDE10A, PDE2A, PDE3A, PHEX, PHF21B, PI16, PIEZO2, PILRA, POTEI, POTEJ, POU2AF1, PPFIA3, PPP1R1C, PRDM6, PRF1, PTGDR, PTGIR, PTGIS, PTGS1, PTPRB, RCAN2, RECK, RELN, RGS5, ROBO4, RUNX1T1, S1PR1, SCIMP, SCN9A, SELP, SEMA7A, SFRP4, SH2D1A, SH2D2A, SHANK3, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SLAMF6, SLC11A1, SLC18A2, SLC1A3, SLC35G2, SLC6A1, SLIT2, SMPD3, SOD3, SOX17, SPIB, SPOCK1, SPON1, STAP1, TAL1, TBX2, TBXA2R, TCL1A, TDO2, TEK, TH, TIE1, TIGIT, TLR7, TLR9, TMEM119, TMEM255B, TNFRSF13B, TNFRSF13C, TNFRSF17, TNFSF8, TPSG1, TREML2, TRH, TSPAN18, TSPAN7, TWIST1, TWIST2, UBASH3A, VSIG4, WFDC1, WNT2, ZBP1, ZFHX4, ZNF683
perivas | positive: GUCY1A2, CDH6, EBF2, AVPR1A, TRPC6, GJC1, TBX2, RGS5, ABCC9, ITGA7, ADRA1B, HEYL, SLC6A1, CSPG4, TPPP3, KCNJ8, SEPTIN4, CCDC102B, PDGFRB, NOTCH3, COL18A1, EDNRA, C1QTNF1, PGF, AFAP1L2, JAG1, SDC2, MYO1B, SYNPO2, PDGFA, FILIP1L, PDE5A, SOX5, LDB3, ANGPT1, DPY19L2, ADAMTS4, TDO2, PDE3A, CD248, ADAMTS12, RCAN2, RBMS3, SOD3, THY1, PRRX1, BGN, SLIT3, STEAP4, EPAS1, DKK3, MYLK, FRZB, PCDH18, SEPTIN5, ADAMTS1, COL5A2, CNTNAP1, ADAMTS2, VCL, MAP2, COL5A1, PHLDB2, PLXDC1, NPNT, ADAMTS14, S1PR3, FLT1, SMOC2, AEBP1, LBH, PAMR1, MYH11, SPRY2, TIMP3, PPARG, LOXL2, RBPMS, MAP3K20, SPON2, PTPRG, PTP4A3, MAP3K7CL, CCN2, GRK5, CCND2, WFDC1, ADRA2A, DMD, CAVIN3, PIEZO2, EPHA2, MAP1B, PLVAP, PLCE1, SPECC1, SULF1, FZD4, CALCRL, LAMC1, AQP1, DDR2, HES4, PARM1, FOXC2, LPL, NRP1, KANK2, SERPINH1, RERG, TRO, ENG, PALLD, SMTN, MYO1E, TNC, MAF, RFTN1, FGF7, KLF12
perivas | negative: ABCA10, ABCC12, ABCC8, ABI3BP, AC007906.2, ADAM28, ADAMDEC1, ADCYAP1, ADGRE2, ADORA2B, ADORA3, ADRB2, ADTRP, AGR3, AIF1, AIM2, ALPK3, ANXA8, BAALC, BANK1, BARX2, BCL11B, BCL2A1, BCL6B, BDKRB2, BLK, BLNK, BMP6, BMP8B, BMPR1B, BNC2, BPIFB1, BRINP1, C3AR1, C4B, CACNA1B, CACNG4, CADM3, CALML3, CARD10, CARD14, CARD9, CASP10, CCL22, CCL28, CCR1, CCR4, CCR6, CD19, CD1C, CD1D, CD1E, CD209, CD22, CD27, CD274, CD33, CD38, CD7, CD72, CD79A, CD79B, CD83, CD86, CD8A, CDH13, CDH23, CDKN2B, CEBPA, CELSR3, CENPA, CES1, CGNL1, CHAD, CHST8, CLEC10A, CLEC12A, CLEC4C, CLEC5A, CLEC7A, CLGN, CLIC3, CMA1, CMKLR1, CMYA5, CNR2, COL10A1, COL17A1, COL4A3, COL4A4, COLEC12, COMP, CPVL, CPXM2, CR1, CRB2, CSF2RA, CSF3R, CST7, CTNND2, CTSG, CTSW, CUX2, CX3CL1, CXADR, CXCL2, CXCR3, CXCR6, CYP27A1, CYSLTR1, DERL3, DLK1, DLL4, DLX4, DNAH5, DNASE1L3, DPT, DSC3, DSG3, ECRG4, EDN1, EFR3B, EGR2, ENPP3, ENTPD2, EPB41L3, EPHB1, EREG, ERG, F2RL3, F7, FAT2, FAT4, FBLN5, FCER1A, FCGR2A, FCGR2B, FCGR3A, FCMR, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FGFR4, FGR, FLRT3, FLT3, FLT4, FOLH1, FOLR2, FPR1, FREM1, FST, FUT7, GABRP, GBP5, GIMAP5, GPR174, GPR34, GRIK4, GRM4, GRP, GZMA, GZMB, GZMK, HAVCR2, HBEGF, HCK, HDC, HMCN1, HMOX1, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HPSE2, HS3ST3A1, HSPA6, IDO1, IGF1, IL18, IL18R1, IL1RL1, IL33, IL3RA, IL6R, IRF4, IRS2, IRX1, ITK, JAM2, KCNF1, KCNH6, KCNK10, KCNK15, KCNMA1, KCNN3, KCNN4, KIAA0408, KIT, KLHL13, KLK10, KLK6, KLRD1, KLRG1, KMO, LAMP3, LCK, LCN2, LCNL1, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LOX, LPAR1, LRG1, LRRC15, LRRK2, LTK, LY75, MAOB, MAP1A, MAPK11, ME1, MET, MFAP5, MLXIPL, MME, MNDA, MNX1, MRC1, MS4A1, MS4A2, MSR1, MTNR1B, MUC16, MUC5B, MYCL, NCF1, NCF2, NIBAN3, NKX3-1, NLRP3, NOD2, NOS1AP, NOS3, NPR1, NR4A3, NR5A2, NRROS, OLR1, OPRD1, OXTR, P2RX1, P2RX5, P2RX7, P2RY13, P2RY2, P2RY6, PAX5, PCDH10, PCDH17, PCDH8, PDE2A, PDGFD, PDGFRA, PDGFRL, PDLIM4, PDPN, PDZK1, PHEX, PHF21B, PI16, PILRA, PLA2G7, PLAUR, PLCG2, PLXNC1, PMAIP1, POTEI, POTEJ, POU2AF1, POU2F2, PPFIA3, PPP1R1C, PRDM6, PRF1, PRICKLE1, PRKCQ, PRLR, PRODH, PROM1, PROX1, PTAFR, PTGES, PTGIS, PTGS1, RECK, RELN, RIMS3, RIPK4, RNF39, ROBO4, ROR2, RTN1, S100A1, SAMD5, SCGB1D2, SCIMP, SCN9A, SDK2, SELP, SEMA7A, SERPINA5, SERPINB5, SFRP1, SFRP4, SH2D1A, SH3RF2, SHANK3, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SIM2, SIRPA, SLAMF6, SLAMF8, SLC11A1, SLC18A2, SLC1A3, SLC35G2, SLC7A11, SLC7A7, SLCO2A1, SMPD3, SNCA, SNX10, SORCS1, SOSTDC1, SOX10, SOX17, SPA17, SPAG17, SPIB, SPOCK1, SPON1, STAP1, STEAP1, TAL1, TCL1A, TEK, TFAP2B, TFPI2, TGM2, TIE1, TIGIT, TLR1, TLR2, TLR6, TLR7, TLR9, TMEM255B, TNFRSF13B, TNFRSF13C, TNFRSF17, TNFSF8, TNNT2, TNS4, TP63, TPSG1, TREM2, TRH, TRIM29, TRPM2, TSPAN18, TSPAN7, TUBB2B, TUBB3, TWIST2, VSIG4, VSNL1, VTCN1, WNT2, WNT4, ZBP1, ZFHX4, ZNF296, ZNF683
stromal | positive: POSTN, DCN, ADAM33, RUNX1T1, PDGFRA, LUM, FAP, PLEKHH2, THBS2, COL5A1, COL5A2, AEBP1, CCN2, CDH11, SVEP1, TMEM119, FGF7, FBLN2, DCLK1, CCDC80, CXCL12, ABI3BP, ADAMTS2, FBLN5, SRPX, CCN4, SPON1, HMCN1, MFAP5, PTGIS, SERPINE1, ELN, SLIT2, SPOCK1, INHBA, COL10A1, TWIST2, ADAMTS12, FREM1, ADAM12, RBMS3, CD248, LRP1, PDGFRB, PCDH18, PRRX1, ZFHX4, TWIST1, SPON2, MMP14, GLT8D2, BGN, ANGPTL2, HPSE2, ROR2, EMP1, LPAR1, THY1, CTSK, CTHRC1, ABCA10, WNT2, PDPN, LOX, TIMP2, VCAM1, IGF1, CPXM2, LRRC15, PRICKLE1, HAS2, ABCA8, CCN1, HTRA1, DNM1, PDGFRL, PLXDC1, ASPN, BNC2, MRC2, OLFML3, SOD3, PI16, F2R, SULF1, DPT, RELN, PDGFD, COLEC12, STEAP1, COL4A4, SFRP4, GLI2, FAT4, TIMP3, IL33, VGLL3, SLIT3, EDNRA, LOXL1, PTK7, PLAGL1, TNXB, HGF, MMP11, ALPL, SMOC2, RECK, COMP, GXYLT2, SUGCT, TRO, HSPG2, SDC2, LTBP2, EGFR, FRMD6, C7, FMOD, NBL1, FRZB, PTGFRN, CD34, CYP1B1, JAM3, MEIS1, ACVRL1, ANGPTL4, COL18A1, TMEM98, DAB2, FILIP1L, JAM2, CDKN2B, IL1R1, EGR2, DIO2, TRPC1, MEIS2, PLA2R1, TGFB3, CLSTN3
stromal | negative: ABCC12, ABI3, AC007906.2, ADAMDEC1, ADCYAP1, ADGRE2, ADGRL4, ADORA2B, ADORA3, ADRA1B, ADRB2, ADTRP, AIM2, ALPK3, ANGPT1, ANXA3, ANXA8, APLNR, AURKB, AVPR1A, BAALC, BANK1, BARX2, BCL11B, BCL2A1, BCL6B, BDKRB2, BLK, BMP2, BMP6, BMP8B, BMPR1B, BPIFB1, BRINP1, C4B, CACNG4, CADM3, CALB2, CALML3, CARD10, CARD14, CARD9, CASP10, CAVIN2, CCDC141, CCL14, CCL22, CCL28, CCN3, CCR1, CCR4, CCR5, CCR6, CD19, CD1C, CD1D, CD1E, CD209, CD22, CD226, CD247, CD27, CD274, CD28, CD33, CD38, CD3G, CD40LG, CD5, CD7, CD72, CD79A, CD79B, CD83, CD86, CD8A, CDH13, CDH5, CDH6, CELSR3, CENPA, CFC1, CHAD, CHST8, CLDN5, CLEC12A, CLEC14A, CLEC4C, CLEC5A, CLEC7A, CLGN, CLIC3, CMA1, CNR2, COCH, COL17A1, COL4A3, CR1, CRB2, CSF3R, CST7, CTLA4, CTSG, CTSW, CUX2, CXADR, CXCL2, CXCR3, CXCR6, CYSLTR1, DERL3, DLL4, DLX4, DMD, DNAH5, DNASE1L3, DPY19L2, DSC3, DSG3, EBF2, ECRG4, EDN1, EGF, ENPP3, ENTPD2, EPHB1, EREG, ERG, ESM1, F2RL3, FAM107A, FAT2, FCER1A, FCGR2B, FCMR, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FGFR4, FGR, FLRT3, FLT1, FLT3, FLT4, FOLH1, FOXD2, FPR1, FUT7, GABRD, GABRP, GIMAP5, GIMAP8, GPR174, GPR39, GPR4, GRIK3, GRIK4, GRM4, GRP, GUCY1A2, GZMA, GZMB, GZMK, HAVCR2, HBEGF, HCK, HDAC9, HDC, HLX, HOXA5, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HS3ST3A1, ICAM2, ICOS, IDO1, IL12RB1, IL18, IL18R1, IL1RL1, IL21R, IL2RB, IL3RA, IL6R, IRF4, IRX1, ITGA2B, ITGA7, ITK, KCNA3, KCNF1, KCNH6, KCNJ8, KCNK10, KCNK17, KCNMB1, KCNN3, KCNN4, KDR, KIF18B, KIT, KLHL13, KLK10, KLK6, KLRD1, KLRG1, KLRK1, KMO, LAMB3, LAMC2, LAMP3, LCK, LCN2, LCNL1, LDB3, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LMO2, LRG1, LTK, MAOB, MAP2, MAP3K7CL, MECOM, MET, MLXIPL, MMRN2, MNDA, MNX1, MS4A1, MS4A2, MTNR1B, MUC16, MUC5B, MYCL, MYH11, NAV2, NCCRP1, NCF1, NEK2, NIBAN3, NKX3-1, NLRP2, NLRP3, NOD2, NOS1AP, NOS3, NOSTRIN, NPNT, NPR1, NPY1R, NR4A3, NR5A2, NRROS, NTRK2, OLR1, OPRD1, OXTR, P2RX1, P2RX5, P2RX7, P2RY13, P2RY14, P2RY2, P2RY6, PALMD, PAX5, PBK, PCDH10, PCDH17, PCDH8, PDE2A, PDE3A, PDZK1, PGR, PHEX, PHF21B, PILRA, PITX1, PLA2G7, PLCE1, PLCG2, PMAIP1, POTEI, POTEJ, POU2AF1, POU2F2, PPFIA3, PPP1R1C, PRF1, PRKAA2, PRKCQ, PROCR, PRODH, PROM1, PROX1, PTAFR, PTGDR, PTGS1, PTPRB, RASGRP1, RERG, RGS5, RIMS3, RIPK4, RNF39, ROBO4, RTN1, S100A1, S1PR1, SCGB1D2, SCIMP, SCN9A, SDK2, SELP, SERPINA5, SERPINB5, SH2D1A, SH2D2A, SH3RF2, SHANK3, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SIM2, SLAMF1, SLAMF6, SLC11A1, SLC18A2, SLC1A3, SLC2A9, SLC6A1, SLC7A11, SLC7A5, SLCO2A1, SMPD3, SNCA, SOSTDC1, SOX10, SOX17, SOX18, SPA17, SPAG17, SPIB, STAP1, TAL1, TBXA2R, TCL1A, TDO2, TEK, TFAP2B, TH, THBD, TICRR, TIE1, TIGIT, TLR6, TLR7, TLR9, TMEM255B, TMEM45B, TNFRSF13B, TNFRSF13C, TNFRSF17, TNFSF8, TNS4, TP63, TPPP3, TPSG1, TREM2, TREML2, TRH, TRIM29, TRPC6, TSPAN7, TUBA4A, TUBB2B, UBASH3A, UNC5A, VSNL1, VSTM2L, VTCN1, WNT5B, ZBP1, ZFAT, ZNF296, ZNF683
tumor | positive: FIBCD1, CLGN, TMEM97, MLXIPL, CDH2, ECM1, ITPRID2, SELENBP1, ITGA2B, NRAS, CYP24A1, CCDC170, DLK1, CACNA1B, MTNR1B, MUC1, PPM1D, FASN, ACE, GRIK4, IKZF2, RNF43, BRIP1, FGFR3, SPAG17, PBK, ABCC8, POTEJ, ABCC12, PBX1, PSMC5, UGDH, SLC12A2, TH, WDR90, INPP4B, SREBF1, ERBB3, PLXNB1, GREB1L, AR, POTEF, TLK2, PHF21B, ADGRB2, UNC5A, PPP1R1C, PCDH8, TNNT2, KCNH6, MLF1, SORCS1, KIF18B, TUBD1, CCND1, RGL3, HSF4, FADS2, SLC2A4RG, F7, MAP7, SIX1, EXO1, TONSL, SLC30A8, GSR, ITGB6, RRM2, GSE1, OVOL2, MAPK15, FGFR4, GRM4, MYCN, LMX1B, TCIM, CENPA, HES1, ANO1, GPR39, TICRR, EHF, TBC1D30, MST1R, TBX3, TCEA3, PRDM6, CHST8, HS6ST2, TC2N, PPM1H, RECQL4, TYMS, FBP1, CARD14, SLC25A39, PHGDH, FRAS1, KMO, NEK2, BMI1, AURKB, HSPD1, DNAH5, RET, MNX1
tumor | negative: ABCA10, ABCA8, ABCC9, ABI3, ABI3BP, AC007906.2, ACSL4, ACVRL1, ADA, ADAM12, ADAM33, ADAMDEC1, ADAMTS1, ADAMTS12, ADAMTS14, ADAMTS2, ADAMTS4, ADAMTS5, ADCYAP1, ADGRE2, ADGRL4, ADORA2B, ADORA3, ADRA1B, ADRA2A, ADTRP, AFAP1L2, AIF1, AIM2, ALPL, ANGPT1, ANGPTL2, ANGPTL4, ANXA3, ANXA8, AOAH, APLNR, APOBEC3G, ASPN, ATL1, AVPR1A, BAALC, BANK1, BCL11B, BCL2A1, BCL6B, BDKRB2, BLK, BMP2, BMP6, BMPR1B, BNC2, BPIFB1, BRINP1, C1QTNF1, C3AR1, C4B, C7, CACNG4, CADM3, CALB2, CALCRL, CALML3, CASP1, CASP10, CAVIN2, CAVIN3, CCDC102B, CCDC141, CCL14, CCL19, CCL22, CCN3, CCN4, CCND2, CCR1, CCR4, CCR5, CCR6, CD19, CD1C, CD1D, CD1E, CD209, CD22, CD226, CD247, CD248, CD27, CD274, CD28, CD302, CD33, CD34, CD38, CD3D, CD3E, CD3G, CD40, CD40LG, CD5, CD7, CD72, CD79A, CD79B, CD86, CD8A, CDH11, CDH13, CDH23, CDH5, CDH6, CEP112, CES1, CLDN5, CLEC10A, CLEC12A, CLEC14A, CLEC4C, CLEC5A, CLEC7A, CLIC3, CMA1, CMKLR1, CNN1, CNR2, CNRIP1, CNTNAP1, COCH, COL10A1, COL17A1, COL4A3, COL4A4, COLEC12, COMP, CPVL, CPXM2, CR1, CRB2, CSF1, CSF2RA, CSF3R, CSPG4, CST7, CTLA4, CTSG, CTSW, CUX2, CX3CL1, CXCL2, CXCR3, CXCR6, CYP27A1, CYSLTR1, DCLK1, DERL3, DKK3, DLL4, DLX4, DMD, DNASE1L3, DPT, DPY19L2, DSC3, DSG3, EBF2, ECRG4, EDN1, EDNRA, ELN, ENPP2, ENPP3, EPHB1, EREG, ESM1, ETV1, F13A1, F2RL3, F3, FAM107A, FAP, FAT2, FAT4, FBLN2, FBLN5, FCER1A, FCGR2A, FCGR2B, FCGR3A, FCMR, FCRL1, FCRL2, FCRL3, FCRL5, FCRLA, FES, FGF1, FGF2, FGF7, FGR, FILIP1L, FLT1, FLT3LG, FLT4, FMOD, FOLH1, FOLR2, FOXC2, FPR1, FREM1, FRZB, FSCN1, FST, FUT7, FYN, GABRD, GABRP, GAS6, GBP5, GIMAP5, GIMAP8, GJC1, GLI2, GLT8D2, GPR174, GPR34, GPR4, GRIK3, GRK5, GRP, GUCY1A2, GZMA, GZMB, GZMK, HAS2, HAVCR2, HCK, HDC, HEYL, HGF, HLX, HMCN1, HOXA5, HOXD10, HOXD9, HPGD, HPGDS, HPSE, HPSE2, HS3ST3A1, HSPA6, ICAM2, IDO1, IFI44L, IGF1, IL12RB1, IL18, IL18R1, IL1RL1, IL21R, IL2RB, IL33, IL34, IL3RA, IL6R, INHBA, IRF4, IRS2, IRX1, ITGA7, ITGAL, ITIH5, ITK, JAG1, JAK3, JAM2, JAM3, KCNA3, KCNF1, KCNJ8, KCNK10, KCNK17, KCNMB1, KCNN3, KCNN4, KDR, KIAA0408, KIT, KLHL13, KLK10, KLK6, KLRD1, KLRG1, KLRK1, LAIR1, LAMP3, LBH, LCK, LCN2, LCNL1, LDB3, LIF, LILRA4, LILRB2, LILRB4, LILRB5, LOX, LPAR1, LPL, LRRC15, LRRK2, LTK, LURAP1, LY75, LY96, MAOB, MAP1A, MAP3K7CL, MERTK, MFAP5, MME, MMP9, MMRN2, MNDA, MPP1, MRC1, MS4A1, MS4A2, MSR1, MUC16, MYH11, NAV2, NCCRP1, NCF1, NCF2, NGFR, NIBAN3, NLRP1, NLRP3, NOD2, NOS3, NOSTRIN, NPNT, NPR1, NR4A3, NR5A2, NRN1, NRP2, NRROS, NTRK2, OLFML3, OLR1, OPRD1, P2RX1, P2RX5, P2RX7, P2RY13, P2RY14, P2RY6, PALMD, PAMR1, PARP15, PAX5, PCDH10, PCDH17, PCDH18, PDE2A, PDE3A, PDGFD, PDGFRA, PDGFRB, PDPN, PDZK1, PGF, PGR, PHEX, PI16, PIEZO2, PLA2G7, PLAGL1, PLCE1, PLCG2, PLEKHH2, PLXDC1, POU2AF1, POU2F2, PPFIA3, PRF1, PRICKLE1, PRKCQ, PROCR, PROM1, PROX1, PRRX1, PTAFR, PTGDR, PTGIR, PTGIS, PTGS1, PTPRB, PTPRM, RASGRP1, RASSF2, RASSF4, RBMS3, RCAN2, RECK, RELN, RGS5, RIMS3, RNF180, RNF39, ROBO4, ROR2, RTN1, RUNX1T1, RUNX2, S1PR1, SAMD5, SASH1, SATB1, SCGB1D2, SCIMP, SCN9A, SDC2, SDK2, SELP, SELPLG, SEMA7A, SEPTIN4, SERPINB5, SFRP1, SFRP4, SH2D1A, SHANK3, SHD, SIGLEC1, SIGLEC6, SIGLEC9, SLAMF1, SLAMF6, SLAMF8, SLC11A1, SLC18A2, SLC1A3, SLC35G2, SLC6A1, SLC7A11, SLC7A7, SLCO2A1, SLCO2B1, SLIT2, SLIT3, SMPD3, SNCA, SOD3, SOSTDC1, SOX10, SOX17, SOX5, SP140, SPIB, SPOCK1, SPON1, SPRY2, SRPX, ST6GAL1, STAP1, STAT4, SUGCT, SULF1, SVEP1, SYNPO2, TAL1, TBX2, TBXA2R, TCF7, TCL1A, TDO2, TEK, TFAP2B, TGFB2, TGFBR3, TGM2, THBD, THEMIS, THY1, TIE1, TIGIT, TLR1, TLR2, TLR4, TLR6, TLR7, TLR9, TMEM119, TMEM255B, TNFRSF13B, TNFRSF17, TNFSF8, TNS4, TP63, TPPP3, TPSG1, TRBC1, TREM2, TREML2, TRH, TRIM29, TRO, TRPC1, TRPC6, TSPAN18, TSPAN7, TUBB2B, TUBB6, TWIST1, TWIST2, UBASH3A, VCAM1, VGLL3, VSIG4, VSIR, VSNL1, VTCN1, WFDC1, WNT2, WNT4, WNT5B, ZAP70, ZBP1, ZEB1, ZFHX4, ZNF683
Below, we show the number of negative markers that overlap with the positive markers of each cell type. To reliably estimate contamination, each cell type should share at least ~5 negative markers with the positive marker set of every other cell type. If these overlaps are too small, contamination estimates become unstable.
In such cases, the marker definition can be relaxed by adjusting the thresholds used in markers_from_reference above.
[9]:
ctypes = list(markers.keys())
overlap_df = pd.DataFrame(0, index=ctypes, columns=ctypes, dtype=int)
for c in ctypes:
neg_c = set(markers[c].get("negative", []))
for d in ctypes:
pos_d = set(markers[d].get("positive", []))
overlap_df.loc[d, c] = len(pos_d & neg_c)
overlap_df
[9]:
| B | DCIS1 | DCIS2 | T | dendritic | endo | macro | mast | myoepi | perivas | stromal | tumor | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| B | 0 | 50 | 48 | 41 | 26 | 44 | 29 | 47 | 41 | 49 | 48 | 57 |
| DCIS1 | 49 | 0 | 20 | 75 | 50 | 37 | 48 | 50 | 12 | 41 | 37 | 23 |
| DCIS2 | 39 | 16 | 0 | 78 | 41 | 27 | 40 | 56 | 5 | 29 | 25 | 12 |
| T | 26 | 48 | 52 | 0 | 27 | 37 | 24 | 43 | 33 | 28 | 47 | 66 |
| dendritic | 50 | 66 | 63 | 73 | 0 | 49 | 42 | 70 | 48 | 53 | 56 | 70 |
| endo | 108 | 90 | 92 | 110 | 101 | 0 | 94 | 86 | 63 | 45 | 66 | 95 |
| macro | 71 | 76 | 74 | 102 | 49 | 60 | 0 | 74 | 48 | 79 | 54 | 88 |
| mast | 28 | 27 | 29 | 37 | 24 | 24 | 20 | 0 | 20 | 28 | 27 | 30 |
| myoepi | 97 | 33 | 58 | 98 | 85 | 55 | 85 | 70 | 0 | 59 | 61 | 75 |
| perivas | 87 | 49 | 60 | 109 | 70 | 6 | 80 | 92 | 34 | 0 | 24 | 71 |
| stromal | 98 | 70 | 84 | 118 | 88 | 31 | 94 | 109 | 42 | 40 | 0 | 90 |
| tumor | 22 | 16 | 6 | 66 | 29 | 22 | 27 | 38 | 14 | 26 | 28 | 0 |
Compute marker purity#
We quantify how pure each spatial cell’s expression profile is with respect to its assigned cell type using positive and negative marker genes.
We assume that differences between scRNA-seq and spatial transcriptomics profiles arise primarily from local contamination by neighboring cells (e.g. diffusion or segmentation spillover). This motivates evaluating negative markers in a neighborhood-aware manner.
Identity evaluation
For each cell of type c, we compute the fraction of positive marker genes (markers[c]["positive"]) that are expressed in the cell (> 0). This quantity, positive_marker_recall, measures how consistently the cell expresses markers expected for its assigned type and is computed independently of the neighborhood.
Contamination (neighborhood-aware)
For a focal cell, we identify the cell types present in its spatial neighborhood and intersect the focal cell type’s negative markers with the positive markers of neighboring cell types. Optionally, these markers can be further restricted to genes that are expressed in at least one neighboring cell of the corresponding source type (require_neighbor_expression=True). These relevant negative markers represent genes that should be absent from the focal cell but present in nearby cells. The
metric negative_marker_avoidance is defined as the fraction of these markers that are not expressed in the focal cell.
If no neighborhood graph is present (neighbors_key not in sdata.tables[tables_key].obsp), it is automatically computed from cell centroids using a Delaunay graph.
Overall purity
Identity and contamination are combined using:
marker_balanced_accuracy = 0.5 * (positive_marker_recall + negative_marker_avoidance)
This corresponds to balanced accuracy, i.e. the mean of sensitivity (positive marker recall) and specificity (negative marker avoidance). High values indicate strong expression of expected markers together with minimal expression of markers attributable to neighboring cell types.
[10]:
purity = st.sp.marker_purity(
cell_type_key="transferred_cell_type",
markers=markers,
require_neighbor_expression=True,
neighbors_key="spatial_connectivities",
)
INFO Creating graph using `None` transform and `1` libraries.
/g/huber/users/meyerben/notebooks/spatial_transcriptomics/SegTraQ/src/segtraq/SegTraQ.py:1530: RuntimeWarning: neighbors_key='spatial_connectivities' not found in adata.obsp. A neighborhood graph based on Delaunay will be computed.
return sp.marker_purity(
negative_marker_avoidance#
[11]:
def boxplot_per_celltype(
sdata,
feature,
celltype_col="transferred_cell_type",
q=1.0,
figsize=(10, 5),
ascending=True,
palette=None,
):
obs = sdata.tables["table"].obs
df = obs[[celltype_col, feature]].dropna().copy()
if q < 1:
df = df[df[feature] <= df[feature].quantile(q)]
# order by median (low -> high). Use .sort_values(ascending=False) for high -> low
order = df.groupby(celltype_col)[feature].median().sort_values(ascending=ascending).index.tolist()
# ensure palette covers all categories (optional safety)
if palette is not None:
palette = {ct: palette.get(ct, "#808080") for ct in order}
fig, ax = plt.subplots(figsize=figsize)
sns.boxplot(
data=df,
x=celltype_col,
y=feature,
order=order,
hue=celltype_col,
palette=palette,
showcaps=True,
showfliers=False,
legend=False,
ax=ax,
)
sns.stripplot(
data=df,
x=celltype_col,
y=feature,
order=order,
hue=celltype_col,
palette=palette,
jitter=0.25,
dodge=False,
alpha=0.6,
edgecolor="black",
linewidth=0.4,
legend=False,
ax=ax,
)
ax.tick_params(axis="x", rotation=45)
ax.set_xlabel("Cell type")
ax.set_ylabel(feature)
fig.tight_layout()
plt.show()
The negative_marker_avoidance score indicates that cells of type DCIS1 are the most contaminated.
[12]:
boxplot_per_celltype(st.sdata, feature="negative_marker_avoidance", palette=col_celltype, ascending=False)
This can also be visualized spatially. The negative_marker_avoidance score is only computed for cells which have a neigbhor of a different type. This clearly shows the DCIS1 cells with low negative_marker_avoidance score, i.e. contamination.
[13]:
axes = plt.subplots(1, 2, figsize=(10, 5), constrained_layout=True)[1].flatten()
st.sdata.pl.render_shapes(
"cell_boundaries",
color="transferred_cell_type_plot",
palette=cols,
groups=labels,
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[0], title="Cell boundaries colored by cell type", coordinate_systems="global")
st.sdata.pl.render_shapes(
"cell_boundaries",
color="negative_marker_avoidance",
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[1], title="Cell boundaries colored by negative_marker_avoidance", coordinate_systems="global")
WARNING render_shapes: Found 155 NaN values in color data. These observations will be colored with the 'na_color'.
positive_marker_recall#
Cells annotated as mast and DCIS2 show the highest positive_marker_recall scores, suggesting that their cell identity is captured most consistently by positive markers.
[14]:
boxplot_per_celltype(st.sdata, feature="positive_marker_recall", palette=col_celltype)
The positive_marker_recallscore is computed globally, i.e. irrespective of the cell neighborhood, so there are fewer missing values than for negative_marker_avoidance. The spatial plot below is in line with the boxplot above, showing that cells of type DCIS2 and mast show the highest positive_marker_recall.
[15]:
axes = plt.subplots(1, 2, figsize=(10, 5), constrained_layout=True)[1].flatten()
st.sdata.pl.render_shapes(
"cell_boundaries",
color="transferred_cell_type_plot",
palette=cols,
groups=labels,
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[0], title="Cell boundaries colored by cell type", coordinate_systems="global")
st.sdata.pl.render_shapes(
"cell_boundaries",
color="positive_marker_recall",
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[1], title="Cell boundaries colored by positive_marker_recall", coordinate_systems="global")
WARNING render_shapes: Found 47 NaN values in color data. These observations will be colored with the 'na_color'.
marker_balanced_accuracy#
Cells of type DCIS1 (which have high transcript counts) show the highest negative_marker_avoidance and the third-highest positive_marker_recall. This is expected: cells with higher transcript counts tend to capture more positive markers, but also have a higher risk of capturing negative markers. As a result, the combined metric marker_balanced_accuracy, which balances positive_marker_recall and negative_marker_avoidance, provides a more representative measure of purity.
Accordingly, DCIS1 ranks among the cell types with the lowest purity, while DCIS2 and mast cells show the highest purity.
[16]:
boxplot_per_celltype(st.sdata, feature="marker_balanced_accuracy", palette=col_celltype)
Neighborhood contamination#
Marker purity summarizes how well a cell matches its own markers and avoids neighborhood-relevant negatives. In many cases, we also want to quantify
how many contaminating transcripts are present per cell and
which neighboring cell types contribute to this signal. We therefore compute neighborhood contamination.
We treat a gene as contamination-relevant for a target cell type c_tgt if it is
a negative marker of ``c_tgt``,
simultaneously a positive marker of a neighboring source type ``c_src``, and
actually expressed (>0) in at least one of the neighboring cells of the source type (
require_neighbor_expression, default=True).
This yields two levels of output:
Per-cell metrics. For each cell, we compute
contamination_counts: the total number of transcripts for contamination-relevant genes, andcontamination_strength: the fraction of transcripts assigned to the cell that correspond to contamination-relevant genes, computed ascontamination_counts/total_transcript_counts.
Directed cell-type contamination (stored in ``.uns``): Across all cells, we additionally summarize contamination between source and target cell types:
contamination_matrix: the fraction of target cells of typec_tgtthat contain at least one contamination-relevant transcript originating from source cell typec_src, andcontamination_strength_matrix: the mean contamination strength of target cells of typec_tgtattributable to source cell typec_src, computed by averaging the source-specific contamination strength across all evaluable target cells.contamination_evaluable_cells_matrix: Directed source-to-target matrix. Entry (c_src, c_tgt) is the number of target cells for which contamination from source type c_src could be evaluated.
If no neighborhood graph is present (neighbors_key not in sdata.tables[tables_key].obsp), it is automatically computed from cell centroids using a Delaunay graph.
[17]:
_, _, _, _ = st.sp.neighbor_contamination(
cell_type_key="transferred_cell_type",
markers=markers,
require_neighbor_expression=True,
neighbors_key="spatial_connectivities",
inplace=True,
)
contamination_counts#
The spatial plot below shows, for each target cell, the number of contaminating transcripts. If desired, this quantity can be normalized by the total number of transcripts per cell. As expected, the plot correlates with the negative_marker_avoidancescore from above.
[18]:
axes = plt.subplots(1, 2, figsize=(10, 5), constrained_layout=True)[1].flatten()
st.sdata.pl.render_shapes(
"cell_boundaries",
color="transferred_cell_type_plot",
palette=cols,
groups=labels,
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[0], title="Cell boundaries colored by cell type", coordinate_systems="global")
st.sdata.pl.render_shapes(
"cell_boundaries",
color="contamination_counts",
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[1], title="Cell boundaries colored by #contamination transcripts", coordinate_systems="global")
WARNING render_shapes: Found 155 NaN values in color data. These observations will be colored with the 'na_color'.
contamination_strength#
In addition, we can visualize contamination_strength, the fraction of transcripts assigned to a cell that correspond to locally relevant contamination marker genes. A value of contamination_strength = 0 indicates that no contamination-relevant transcripts were detected, whereas larger values indicate that a greater proportion of the cell’s assigned transcripts are consistent with potential contamination from neighboring cells.
[19]:
axes = plt.subplots(1, 2, figsize=(10, 5), constrained_layout=True)[1].flatten()
st.sdata.pl.render_shapes(
"cell_boundaries",
color="transferred_cell_type_plot",
palette=cols,
groups=labels,
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[0], title="Cell boundaries colored by cell type", coordinate_systems="global")
st.sdata.pl.render_shapes(
"cell_boundaries",
color="contamination_strength",
outline_color="white",
outline_width=0.5,
).pl.show(ax=axes[1], title="Cell boundaries colored by contamination strength", coordinate_systems="global")
WARNING render_shapes: Found 155 NaN values in color data. These observations will be colored with the 'na_color'.
.uns["contamination_matrix"]#
The heatmap below shows, for each source–target cell-type pair, the fraction of all target cells contaminated by transcripts from a neighboring source cell type.
Percentages within a column may sum to more than 100% because a single target cell can be contaminated by multiple neighboring source cell types and is therefore counted for each of them.
The bubble plot illustrates why both the contamination frequency (bubble color) and the number of evaluable target cells (bubble size) should be considered when interpreting directed contamination. For example, approximately 20% of evaluable T cells are contaminated by stromal cells, providing evidence for a common contamination pattern across many cells. In contrast, although 100% of evaluable T cells are contaminated by DCIS2 cells, this result is based on only a small number of evaluable T cells because few T cells have neighboring DCIS2 cells with relevant marker genes. Consequently, high contamination frequencies based on very few evaluable cells should be interpreted with caution.
[20]:
cont_mat = st.sdata.tables[st.tables_key].uns["contamination_matrix"]
cont_n = st.sdata.tables[st.tables_key].uns["contamination_evaluable_cells_matrix"]
plot_df = (
cont_mat.stack(dropna=False)
.rename("contamination")
.reset_index()
.rename(columns={"level_0": "source", "level_1": "target"})
)
plot_df["n_evaluable"] = cont_n.stack(dropna=False).values
plt.figure(figsize=(9, 7))
ax = sns.scatterplot(
data=plot_df,
x="target",
y="source",
size="n_evaluable",
hue="contamination",
sizes=(20, 600),
palette="Reds",
edgecolor="black",
)
ax.legend(
bbox_to_anchor=(1.02, 1),
loc="upper left",
borderaxespad=0,
)
plt.title("Directed Cell-Type Contamination")
plt.xlabel("Target Cell Type")
plt.ylabel("Source Cell Type")
plt.xticks(rotation=45, ha="right")
plt.tight_layout()
plt.show()
.uns["contamination_strength_matrix"]#
The heatmap below summarizes contamination strength for each source–target cell-type pair. Each entry represents the mean contamination strength across all evaluable target cells of the given target cell type, where the source-specific contamination strength is computed as the fraction of transcripts in the target cell that correspond to contamination-relevant markers of the source cell type.
The bubble plot of the contamination_strength_matrix provides complementary information by quantifying how large the contamination signal is when it occurs. For example, although myoepithelial and DCIS2 cells are frequently neighbors, contamination from DCIS2 into myoepithelial cells is negligible. Moreover, relatively few myoepithelial cells are evaluable for DCIS2 despite their spatial proximity because the two cell types share only a small number of mutually exclusive markers (four in
this example; see overlap_df), and these markers may not be expressed in the neighboring DCIS2 cells in every local neighborhood.
This can have both technical and biological causes. For example, when two cell types have similar expression profiles, contamination between them is less consequential because the contaminating transcripts largely match the expected expression of the target cell.
[21]:
cont_strength_mat = st.sdata.tables[st.tables_key].uns["contamination_strength_matrix"]
plot_df = (
cont_strength_mat.stack(dropna=False)
.rename("contamination_strength")
.reset_index()
.rename(columns={"level_0": "source", "level_1": "target"})
)
plot_df["n_evaluable"] = cont_n.stack(dropna=False).values
plt.figure(figsize=(9, 7))
ax = sns.scatterplot(
data=plot_df,
x="target",
y="source",
size="n_evaluable",
hue="contamination_strength",
sizes=(20, 600),
palette="Reds",
edgecolor="black",
)
ax.legend(
bbox_to_anchor=(1.02, 1),
loc="upper left",
borderaxespad=0,
)
plt.title("Directed Cell-Type Contamination Strength")
plt.xlabel("Target Cell Type")
plt.ylabel("Source Cell Type")
plt.xticks(rotation=45, ha="right")
plt.tight_layout()
plt.show()
! Important#
The observed contamination between two cell types is influenced by three main factors:
True contamination, i.e. transcript spillover or transcript misassignment between neighboring cells.
Spatial proximity, i.e. how frequently the two cell types occur as neighbors. The more often they are adjacent, the greater the opportunity for contamination.
Expression similarity, .ie. contamination between transcriptionally similar cell types is both less consequential and more difficult to detect. Because the two cell types share fewer mutually exclusive marker genes, transferred transcripts have less impact on the measured expression profile, and fewer informative genes are available for quantifying contamination.
Compute mutually exclusive co-expression rate (MECR)#
The mutually_exclusive_coexpression_rate function assesses mutual exclusivity between marker genes using Fisher’s exact test on binary gene detection (expression > 0). Candidate pairs are constructed as unique, unordered combinations of positive and negative markers across cell types, excluding gene pairs that co-occur as positive markers in any cell type. Fisher’s exact test with alternative="less" is used to test whether genes co-occur less often than expected under independence.
By conditioning on the marginal detection frequencies of each gene, Fisher’s exact test does not favor methods with low overall transcript counts.
[22]:
mecr = st.sp.mutually_exclusive_coexpression_rate(
markers=markers,
inplace=True,
)
[23]:
rows = []
tbl = st.sdata.tables["table"]
mecr_df = tbl.uns["mutually_exclusive_coexpression_rate"]
# Keep marker pairs with significant mutual exclusivity
df_sig = mecr_df.loc[
mecr_df["odds_ratio"].notna()
& np.isfinite(mecr_df["odds_ratio"])
& mecr_df["pvalue"].notna()
& np.isfinite(mecr_df["pvalue"])
& (mecr_df["odds_ratio"] < 1)
& (mecr_df["pvalue"] < 0.05)
].copy()
# Build plotting dataframe
rows.extend(
{
"method": "Xenium",
"coexpression_odds_ratio": row["odds_ratio"],
}
for _, row in df_sig.iterrows()
)
df = pd.DataFrame(rows)
# Order by mean odds ratio
mean_order = df.groupby("method")["coexpression_odds_ratio"].mean().sort_values().index.tolist()
means = df.groupby("method")["coexpression_odds_ratio"].mean().reindex(mean_order)
xtick_labels = [f"{m}\nmean: {means[m]:.2f}" for m in mean_order]
plt.figure(figsize=(3, 4))
ax = sns.violinplot(
data=df,
x="method",
y="coexpression_odds_ratio",
order=mean_order,
palette="Set2",
linewidth=2,
)
sns.stripplot(
data=df,
x="method",
y="coexpression_odds_ratio",
order=mean_order,
color="black",
size=2.5,
alpha=0.35,
jitter=0.25,
ax=ax,
)
# OR = 1 corresponds to independence
ax.axhline(
1,
ls="--",
lw=1,
color="gray",
alpha=0.6,
)
ax.set_xticklabels(xtick_labels)
ax.set_ylabel("Marker co-expression odds ratio")
ax.set_xlabel("")
ax.set_title("Significantly mutually exclusive marker pairs")
plt.grid(axis="y", alpha=0.3)
plt.tight_layout()
plt.show()
/scratch/jobs/61866415/ipykernel_1926364/1642314466.py:66: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
ax.set_xticklabels(xtick_labels)
Run all metrics.
[24]:
st.run_supervised(
adata_ref=adata_ref,
ref_cell_type="celltype_major",
ref_raw_counts_layer="raw",
)
WARNING: adata.X seems to be already log-transformed.
WARNING: adata.X seems to be already log-transformed.
[25]:
print(sd.__version__) # spatialdata
print(spatialdata_plot.__version__)
0.8.0
0.4.0