Torna al catalogo
Season 21 16 Episodi 59 min 2026

Scanpy Single-Cell Analysis

v1.11 — Edizione 2026. Una guida completa all'analisi single-cell utilizzando Scanpy (v1.11 - 2026). Scopri come pre-elaborare, visualizzare, eseguire il clustering e dedurre traiettorie per dati di espressione genica single-cell scalabili.

Calcolo Scientifico Analisi a Singola Cellula Bioinformatica
Scanpy Single-Cell Analysis
In Riproduzione
Click play to start
0:00
0:00
1
L'identità di Scanpy e AnnData
Scopri le idee fondamentali alla base di Scanpy e perché è stato creato per un'analisi single-cell scalabile. Esploriamo l'oggetto AnnData, la struttura dati principale che mantiene matrici, annotazioni ed embedding perfettamente allineati. Imparerai il modello mentale necessario per navigare nell'ecosistema di Scanpy.
4m 13s
2
Metriche di controllo qualità
Esploriamo come eseguire il controllo qualità iniziale sui dati single-cell utilizzando Scanpy. Isolando specifiche popolazioni geniche come l'RNA mitocondriale, possiamo identificare le cellule stressate o morenti. Imparerai come calcolare e interpretare queste metriche di QC fondamentali.
3m 26s
3
Filtraggio e normalizzazione
Questo episodio copre i passaggi critici del filtraggio e della normalizzazione delle matrici di espressione single-cell. Spieghiamo come scartare i dati di bassa qualità e applicare il count depth scaling con una trasformazione log1p. Imparerai come rendere direttamente comparabili cellule con diverse profondità di sequenziamento.
3m 29s
4
Rilevamento dei doppietti con Scrublet
Analizziamo il rilevamento dei doppietti, un passaggio cruciale per individuare gli artefatti tecnici nel sequenziamento single-cell microfluidico. Spieghiamo come Scrublet simula doppietti artificiali per segnalare le cellule sospette. Imparerai come identificare e rimuovere queste combinazioni artificiali dal tuo dataset.
3m 26s
5
Selezione delle feature e geni altamente variabili
Esaminiamo il concetto di selezione delle feature e perché è necessario identificare i geni altamente variabili. Scartando l'housekeeping noise, concentriamo l'analisi sui driver biologici. Imparerai come utilizzare Scanpy per isolare i geni più informativi per i passaggi successivi.
3m 31s
6
Scoring del ciclo cellulare e regressione
Esploriamo come gestire i fattori confondenti calcolando lo score ed eseguendo la regressione delle fasi del ciclo cellulare. Discutiamo come calcolare gli score S e G2M e utilizzare la regressione per rimuovere la loro influenza. Imparerai come evitare che la divisione cellulare attiva rovini la topologia del tuo clustering.
3m 50s
7
Riduzione della dimensionalità con PCA
Questo episodio spiega la Principal Component Analysis nel contesto dei dati single-cell. Discutiamo di come la PCA riduca il rumore nel dataset e perché la scelta del giusto numero di componenti sia importante. Imparerai come ridurre migliaia di geni in una base gestibile per algoritmi avanzati.
3m 31s
8
Il Nearest Neighbor Graph e UMAP
Analizziamo il nucleo assoluto della moderna topologia single-cell: il nearest neighbor graph. Spieghiamo poi come UMAP traduca questa complessa rete in un grafico 2D leggibile. Imparerai perché il neighbor graph è il prerequisito per quasi tutti gli strumenti avanzati in Scanpy.
3m 30s
9
Clustering con Leiden
Esploriamo come trovare popolazioni discrete di cellule utilizzando l'algoritmo di clustering Leiden. Ottimizzando la modularità sul neighborhood graph, Leiden isola comunità altamente connesse. Imparerai come regolare il parametro di risoluzione per trovare gruppi stabili e biologicamente significativi.
3m 53s
10
Scoperta dei geni marker
Ci immergiamo nella scoperta dei geni marker e nei test di espressione differenziale. Spieghiamo come i test statistici identifichino le firme trascrittomiche uniche dei tuoi cluster. Imparerai come passare da cluster numerati anonimi a tipi cellulari biologici etichettati con sicurezza.
3m 56s
11
Integrazione dei dati con Ingest
Questo episodio copre l'integrazione dei dati utilizzando lo strumento Ingest. Spieghiamo come proiettare nuovi dataset nello spazio PCA e UMAP di un atlante di riferimento pre-annotato. Imparerai un metodo veloce e invariante per mappare le etichette attraverso diversi esperimenti.
4m 03s
12
Visualizzazione dei pattern di espressione
Esploriamo tecniche di visualizzazione avanzate per valutare l'espressione genica attraverso i cluster. Ci concentriamo su dot plot e matrix plot, descrivendo in dettaglio come codificano sia l'intensità che la sparsità dell'espressione. Imparerai come convalidare visivamente le annotazioni dei tuoi tipi cellulari a colpo d'occhio.
3m 40s
13
Esplorazione dei manifold con Diffusion Maps
Introduciamo le Diffusion Maps, una potente tecnica di embedding per dati biologici continui. La confrontiamo con UMAP, spiegando perché la diffusione è più adatta per l'analisi della differenziazione cellulare. Imparerai come visualizzare transizioni continue e processi di sviluppo.
3m 49s
14
Grafi astratti con PAGA
Questo episodio tratta la Partition-based Graph Abstraction, o PAGA. Discutiamo come misurare l'effettiva connettività tra i cluster per preservare la topologia globale. Imparerai come utilizzare PAGA per scoprire le vere relazioni di lignaggio nascoste nei tuoi dati.
3m 30s
15
Inferenza delle traiettorie con DPT
Esploriamo l'inferenza delle traiettorie utilizzando il Diffusion Pseudotime (DPT). Spieghiamo come designare una root cell e calcolare le distanze geodetiche attraverso il grafo cellulare. Imparerai come disporre le cellule lungo una linea temporale di sviluppo continua.
3m 35s
16
Scale-up sperimentale con Dask
Nel nostro episodio finale, diamo un'occhiata alla frontiera sperimentale di Scanpy: lo scale-up con Dask. Spieghiamo come gestire dataset che superano la RAM della tua macchina utilizzando la lazy evaluation e l'elaborazione out-of-core. Grazie per esserti unito a noi in questo approfondimento su Scanpy!
3m 44s

Episodi

1

L'identità di Scanpy e AnnData

4m 13s

Scopri le idee fondamentali alla base di Scanpy e perché è stato creato per un'analisi single-cell scalabile. Esploriamo l'oggetto AnnData, la struttura dati principale che mantiene matrici, annotazioni ed embedding perfettamente allineati. Imparerai il modello mentale necessario per navigare nell'ecosistema di Scanpy.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 1 di 16. I dataset single-cell sono esplosi da migliaia a milioni di cellule in pochissimi anni. Prova a caricare questa mole di dati in toolkit più vecchi e pesanti in memoria, e la tua macchina andrà in tilt. Questo è esattamente il problema che risolve Scanpy. Scanpy è un toolkit scalabile, creato per analizzare enormi dataset single-cell di espressione genica in Python. Gestisce la memoria in modo efficiente basandosi su una struttura dati fondamentale molto specifica. Questa struttura si chiama Annotated Data, o AnnData. Chi arriva dai classici dati tabellari spesso dà per scontato che AnnData sia solo un dataframe pandas personalizzato. Non è così. Un singolo dataframe è decisamente troppo piatto per la biologia single-cell. In un esperimento single-cell, hai un'enorme matrice di conteggi di espressione, ma hai anche metadati complessi sulle cellule e metadati completamente separati sui geni. AnnData è un contenitore multidimensionale che lega saldamente la matrice principale e tutti i suoi metadati associati in un unico oggetto sincronizzato. Immagina uno scenario in cui stai caricando un dataset di un milione di cellule. Al centro del tuo oggetto AnnData si trova la matrice dati principale, a cui accedi tramite l'attributo dot X. Questa è una matrice bidimensionale che contiene i tuoi valori numerici effettivi, in genere i conteggi di espressione genica. Le righe rappresentano sempre le osservazioni, ovvero le tue singole cellule, e le colonne rappresentano sempre le variabili, ovvero i tuoi geni. Per un dataset di un milione di cellule, dot X viene quasi sempre salvato come sparse matrix per risparmiare RAM. Ecco il punto chiave. La matrice in dot X non salva i propri nomi di riga o colonna. Si affida completamente a due dataframe di metadati dedicati per fornire questo contesto. Il primo sono i metadati delle osservazioni, a cui accedi tramite l'attributo dot obs. Questo è un dataframe pandas standard, mappato direttamente sulle righe della tua matrice dot X. Contiene tutto ciò che sai sulle cellule. Per il tuo dataset da un milione di cellule, dot obs avrà esattamente un milione di righe. È qui che si trovano i tuoi barcode cellulari, le batch label, le metriche di quality control e le assegnazioni di clustering. Il secondo sono i metadati delle variabili, a cui accedi tramite l'attributo dot var. Questo è un altro dataframe mappato direttamente sulle colonne della tua matrice dot X. Contiene tutto ciò che sai sui geni o sulle feature che hai misurato. È qui che salvi i simboli dei geni, le posizioni sui cromosomi e le metriche statistiche, come i flag degli highly variable genes. Dato che dot obs e dot var sono rigorosamente allineati alle dimensioni di dot X, puoi fare slicing sull'oggetto AnnData in totale sicurezza. Se filtri via le cellule morte da dot obs, l'oggetto AnnData elimina automaticamente le righe corrispondenti dalla matrice dot X. L'allineamento dimensionale non si rompe mai. C'è un altro livello cruciale nella struttura di AnnData. Mentre processi i tuoi dati single-cell, generi rappresentazioni multidimensionali delle tue cellule, come le principal components o le coordinate UMAP. Questi output non si adattano bene a una singola colonna di dot obs. Finiscono invece in un dictionary separato chiamato dot obsm, che sta per observation matrices. L'unica regola è che qualsiasi matrice tu inserisca in dot obsm deve avere esattamente lo stesso numero di righe di dot X. Mantenendo la matrice principale, i metadati delle cellule e i metadati dei geni bloccati in un'unica struttura che si auto-aggiorna, AnnData garantisce che i tuoi dati restino perfettamente sincronizzati, dal primo step di filtering fino alla visualizzazione finale. Se trovi utili questi episodi, puoi supportare lo show cercando DevStoriesEU su Patreon. Come sempre, grazie per l'ascolto. Ci vediamo nel prossimo episodio.
2

Metriche di controllo qualità

3m 26s

Esploriamo come eseguire il controllo qualità iniziale sui dati single-cell utilizzando Scanpy. Isolando specifiche popolazioni geniche come l'RNA mitocondriale, possiamo identificare le cellule stressate o morenti. Imparerai come calcolare e interpretare queste metriche di QC fondamentali.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Analisi single-cell con Scanpy, episodio 2 di 16. Il modo più rapido per rovinare un'analisi single-cell è mantenere inconsapevolmente nel dataset cellule morenti o vuote. Magari pensi di aver scoperto una nuova sottopopolazione, ma in realtà stai solo facendo clustering di detriti cellulari. L'individuazione di queste cellule compromesse si basa interamente sulle metriche di controllo qualità. Chiariamo subito un punto. Spesso si confonde il calcolo delle metriche di qualità con il filtraggio dei dati sporchi. Non sono la stessa cosa. La funzione calculate qc metrics di Scanpy non rimuove una singola cellula o gene dal tuo dataset. È strettamente un tool di annotazione. Calcola delle statistiche e le aggiunge come nuove colonne al tuo dataframe observation, che tiene traccia delle cellule, e al tuo dataframe variable, che tiene traccia dei geni. La rimozione effettiva delle cellule errate avviene in uno step separato. Perché abbiamo bisogno di queste metriche specifiche? Prendi ad esempio un campione di midollo osseo. Durante l'estrazione, lo stress fisico può lacerare le cellule più fragili. Quando la membrana cellulare si rompe, l'RNA citoplasmatico fuoriesce e viene lavato via. Tuttavia, i mitocondri sono racchiusi nelle loro stesse membrane, quindi l'RNA mitocondriale rimane intrappolato all'interno del guscio della cellula rotta. Se sequenzi questa droplet, otterrai un'alta concentrazione di geni mitocondriali e ben poco altro. Questa è una cellula morta. Per identificare queste cellule danneggiate, devi tracciare specifiche popolazioni geniche. Nei dataset umani, i geni mitocondriali in genere iniziano con il prefisso MT trattino. I geni ribosomiali potrebbero iniziare con RPS o RPL. Prima di poter calcolare le metriche per queste popolazioni, devi etichettarle nel tuo dataset. Lo fai creando una nuova colonna boolean nel tuo dataframe var. Ad esempio, crei una colonna chiamata mt che restituisce True se il nome del gene inizia con MT trattino, e False altrimenti. Una volta contrassegnati questi geni, esegui la funzione calculate qc metrics. Di default, questa funzione calcola le statistiche di base standard, come il numero totale di count di RNA per cellula e il numero di geni espressi per cellula. Ma puoi anche dirle di guardare le specifiche popolazioni geniche che hai appena definito. Passi il nome della tua colonna boolean, come mt, nell'argomento qc vars. La funzione calcola quindi la proporzione di count provenienti da quello specifico gruppo di geni. Aggiunge nuove colonne al tuo dataframe obs. Una colonna mostrerà i count totali dei geni mitocondriali per ciascuna cellula. Un'altra colonna, più critica, mostrerà la percentuale dei count totali che provengono dai geni mitocondriali. Se una cellula mostra che il trenta percento del suo RNA è mitocondriale, sai che probabilmente è una cellula rotta e morente a causa del processo di estrazione. Ecco il punto chiave. La funzione calculate qc metrics trasforma matrici di count grezze e non interpretabili in segnali biologici sulla salute della cellula. Non prende decisioni al posto tuo, ma, taggando specifiche popolazioni geniche, ti fornisce l'esatta prova numerica di cui hai bisogno per separare la biologia reale dal rumore di estrazione. Grazie per aver passato qualche minuto con me. Alla prossima, stammi bene.
3

Filtraggio e normalizzazione

3m 29s

Questo episodio copre i passaggi critici del filtraggio e della normalizzazione delle matrici di espressione single-cell. Spieghiamo come scartare i dati di bassa qualità e applicare il count depth scaling con una trasformazione log1p. Imparerai come rendere direttamente comparabili cellule con diverse profondità di sequenziamento.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Analisi single-cell con Scanpy, episodio 3 di 16. Guardi due cellule nel tuo dataset. Una sembra esprimere il doppio dell'RNA rispetto all'altra. Ma non è una differenza biologica: una droplet è stata semplicemente sequenziata con una depth doppia dalla macchina. Se le confronti direttamente, tutta la tua downstream analysis sarà falsata da artefatti tecnici. Il filtering e la normalization sono gli strumenti che risolvono questa discrepanza. Prima di poter correggere la sequencing depth, devi rimuovere la spazzatura. I dati single-cell raw sono pieni di cellule morte, droplet vuote e rumore casuale. Fai questa pulizia lungo due assi distinti: le cellule e i geni. A volte le persone confondono questi due passaggi, ma fanno cose completamente diverse. Gestisci prima le cellule usando la funzione filter cells. Dici a Scanpy di scartare qualsiasi cellula che esprima meno di un numero minimo di geni. Se una droplet contiene solo duecento geni rilevati quando una cellula sana dovrebbe averne duemila, è probabile che quella droplet sia vuota o contenga una cellula danneggiata e morente. La scarti completamente. Successivamente, filtri i geni in tutto il tuo dataset. Usando la funzione filter genes, rimuovi i geni che sono espressi in troppe poche cellule. Se un gene specifico viene rilevato solo in una o due cellule su diecimila, non fornisce alcun valore statistico per raggruppare o classificare i tipi cellulari in seguito. È solo rumore computazionale. Scarti completamente quel gene. Una volta eliminate le cellule di bassa qualità e i geni non informativi, devi ancora affrontare il problema della sequencing depth. È qui che normalizzi i total counts. L'obiettivo è scalare ogni cellula in modo che tutte sembrino avere lo stesso numero totale di read counts. Prendi uno scenario in cui la Cellula A ha cinquemila total counts e la Cellula B ne ha ventimila. Scegli un size factor comune, in genere diecimila. Scanpy applica uno scaling factor a ciascuna cellula individualmente. Raddoppia i counts nella Cellula A e dimezza i counts nella Cellula B. Ora, entrambe le cellule sommano a diecimila total counts. Quando guardi un gene specifico in entrambe le cellule, stai confrontando la loro vera espressione relativa, in modo completamente indipendente da quanto pesantemente la macchina di sequenziamento le ha campionate. Rendere uguali i totali è solo metà della matematica. I dati di espressione biologica sono fortemente skewed. Una manciata di geni avrà un numero enorme di counts, mentre la maggior parte ne avrà pochissimi. Se in seguito dai in pasto questi dati skewed a calcoli di varianza o algoritmi di dimensionality reduction, quei pochi geni enormi domineranno la matematica e copriranno i segnali biologici più sottili. Risolvi questo problema usando una trasformazione log plus one. Chiami la funzione log one p in Scanpy, che applica un logaritmo naturale a tutti i tuoi counts normalizzati. La parte plus one della funzione è fondamentale perché la tua data matrix è composta principalmente da zeri, che rappresentano i geni non espressi in una data cellula. Il logaritmo di zero non è definito, ma il logaritmo di zero più uno è zero. Questo semplice passaggio comprime i valori estremamente alti mantenendo gli zeri esattamente dove si trovano, risultando in una distribuzione molto più bilanciata. Ecco il punto chiave. Il filtering e la normalization non alterano la biologia di base del tuo campione. Eliminano i bias meccanici dell'hardware di sequenziamento, permettendo così alla biologia reale di emergere. Grazie per l'ascolto, happy coding a tutti!
4

Rilevamento dei doppietti con Scrublet

3m 26s

Analizziamo il rilevamento dei doppietti, un passaggio cruciale per individuare gli artefatti tecnici nel sequenziamento single-cell microfluidico. Spieghiamo come Scrublet simula doppietti artificiali per segnalare le cellule sospette. Imparerai come identificare e rimuovere queste combinazioni artificiali dal tuo dataset.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 4 di 16. A volte due cellule completamente diverse rimangono intrappolate nello stesso droplet microfluidico, creando una firma trascrittomica Frankenstein che sembra uno stato biologico completamente nuovo. Non è una scoperta. È un errore, e se non lo intercetti subito, contaminerà la tua analisi. Questo è esattamente il problema che la Doublet Detection con Scrublet è progettata per risolvere. Quando esegui un esperimento single-cell usando la microfluidica a droplet, spingi una sospensione cellulare attraverso un canale, puntando ad avere una cellula per droplet. Statisticamente, questo processo non è perfetto. Ogni tanto, due cellule condividono un singolo droplet. Prendi uno scenario in cui un monocita e una cellula T rimangono intrappolati insieme. Il sequenziatore legge il loro RNA combinato come un'unica entità, restituendo in output un profilo che mescola i geni di entrambi i tipi cellulari. Spesso le persone scambiano questi profili misti per veri stati di transizione biologica, come una cellula a metà della differenziazione. Dobbiamo essere molto chiari. I doublet sono artefatti puramente tecnici. Non esistono nel tessuto e devono essere rimossi. In Scanpy, gestisci questo problema usando la funzione scrublet nel modulo di preprocessing. Scrublet si basa su una premessa molto efficace per trovare queste cellule false. Se vuoi rilevare i doublet, devi sapere che aspetto ha un doublet nel tuo dataset specifico. Dato che l'algoritmo non sa quali delle tue cellule osservate siano errori, ne crea di propri. Per prima cosa, Scrublet prende la expression matrix delle tue cellule osservate. Poi, seleziona casualmente coppie di queste cellule reali e somma computazionalmente i loro profili di espressione genica. Questi profili combinati sono i tuoi doublet simulati. Ora, Scrublet mappa sia le tue cellule osservate reali che questi nuovi doublet simulati nello stesso spazio ad alta dimensionalità. Costruisce un nearest-neighbor classifier per analizzare le relazioni tra di loro. Questa è l'intuizione chiave. Scrublet valuta il neighborhood immediato di ogni cellula reale nel tuo dataset. Se una cellula osservata è circondata principalmente da doublet simulati, quella cellula reale sembra matematicamente identica a un mashup artificiale. Scrublet le assegna un doublet score alto. Al contrario, se una cellula osservata si trova in un cluster con altre cellule reali e pochissimi doublet simulati, riceve uno score basso. È altamente probabile che sia una vera single cell. La funzione non si ferma all'assegnazione di uno score continuo. Valuta la distribuzione di tutti i doublet score nel tuo dataset per calcolare automaticamente una soglia di cutoff. Cerca una separazione tra il grande picco delle cellule normali e la coda più piccola dei doublet sospetti. Basandosi su questa soglia, Scrublet tagga ogni cellula nel tuo dataset con un valore boolean, segnandola come true se è un doublet predetto, e false se è un singlet. Questi risultati vengono salvati direttamente nel tuo data object, permettendoti di filtrare via le cellule false prima di passare alla downstream analysis. Il punto di forza fondamentale di Scrublet è che non si affida a reference database esterni per trovare errori tecnici. Impara le esatte modalità di fallimento del tuo esperimento specifico combinando proprio le cellule che hai sequenziato. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
5

Selezione delle feature e geni altamente variabili

3m 31s

Esaminiamo il concetto di selezione delle feature e perché è necessario identificare i geni altamente variabili. Scartando l'housekeeping noise, concentriamo l'analisi sui driver biologici. Imparerai come utilizzare Scanpy per isolare i geni più informativi per i passaggi successivi.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 5 di 16. Dei circa 30.000 geni nel genoma umano, la maggior parte fa solo il lavoro di base per il mantenimento cellulare. Se provi ad analizzarli tutti insieme, l'enorme volume dell'attività di base sommergerà la vera biologia che stai cercando. Per trovare il vero segnale, hai bisogno della Feature Selection e degli Highly Variable Genes. Prima, una rapida distinzione. Hai già usato una funzione di filtering di base per scartare i geni che sono a malapena rilevati nel tuo dataset. Questo passaggio ripulisce il rumore tecnico e gli empty droplets. La selezione degli highly variable genes fa qualcosa di completamente diverso. Dà per scontato che i geni rimasti siano reali, ma si chiede quali di questi siano effettivamente informativi. Pensala così. Setacciare decine di migliaia di geni per trovare quelli che guidano le differenze tra i tipi cellulari significa scartare i noiosi housekeeping genes di base. Un housekeeping gene è attivo in quasi tutte le cellule più o meno allo stesso livello. La sua espressione è stabile, il che lo rende inutile per distinguere una cellula T da una cellula B. Vogliamo geni che siano fortemente espressi in alcune cellule e totalmente silenti in altre. Questi sono gli highly variable genes. Di solito, vuoi restringere il tuo dataset a circa duemila di questi key driver. In Scanpy, gestisci tutto questo con la funzione highly variable genes. Ma non puoi semplicemente classificare i geni in base alla raw variance. Nei dati di sequenziamento, la varianza scala con la mean expression. Se un gene è altamente espresso ovunque, la sua raw variance sarà naturalmente alta, anche se non è biologicamente interessante. L'algoritmo deve disaccoppiare la varianza dalla mean expression. Lo fa dividendo i geni in bin in base ai loro livelli medi di espressione. Poi, calcola una dispersione normalizzata all'interno di ogni bin. Questo ti dice quanto un gene varia rispetto solo ad altri geni che sono espressi a livelli di base simili. Scanpy offre diversi metodi statistici per fare questi calcoli, chiamati flavor. Il flavor tradizionale di Seurat si aspetta che i tuoi dati siano prima log-normalized. Calcola la dispersione, divide i dati in bin e standardizza i valori. C'è anche un flavor più recente, Seurat v3, che richiede esplicitamente dati di count raw e unlogged per modellare correttamente la varianza. In alternativa, il flavor CellRanger usa un approccio leggermente diverso per calcolare la dispersione normalizzata basata sui count. Il flavor che scegli detta semplicemente la specifica distribuzione statistica usata per modellare quella relazione tra la media e la varianza. Quando lanci questa funzione, non elimina il resto dei tuoi dati. Invece, aggiunge alcune nuove colonne al tuo array delle variable annotations. La più importante è una colonna boolean chiamata semplicemente highly variable, che segna true per i primi duemila geni e false per il resto. I passaggi futuri nella tua pipeline cercheranno automaticamente questo flag e useranno solo quei geni selezionati per la downstream analysis. Ecco il punto chiave. La Feature Selection non è solo un trucco computazionale per far girare il tuo codice più velocemente; è il processo deliberato di eliminazione del rumore bianco biologico, in modo che le vere identità cellulari abbiano spazio per emergere. Grazie per essere stato con noi. Spero tu abbia imparato qualcosa di nuovo.
6

Scoring del ciclo cellulare e regressione

3m 50s

Esploriamo come gestire i fattori confondenti calcolando lo score ed eseguendo la regressione delle fasi del ciclo cellulare. Discutiamo come calcolare gli score S e G2M e utilizzare la regressione per rimuovere la loro influenza. Imparerai come evitare che la divisione cellulare attiva rovini la topologia del tuo clustering.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Analisi single-cell con Scanpy, episodio 6 di 16. Il tuo algoritmo di clustering ha appena diviso cellule T identiche in due gruppi distinti. Sono esattamente lo stesso tipo cellulare, ma l'algoritmo le ha separate semplicemente perché un gruppo si sta dividendo attivamente mentre l'altro è a riposo. Per risolvere questo problema, utilizziamo il Cell-Cycle Scoring e la regressione. L'eterogeneità del ciclo cellulare è una fonte enorme di varianza nei dati single-cell. Se non viene gestita, i geni altamente espressi che guidano la mitosi sovrasteranno le sottili gene signatures che definiscono i veri tipi cellulari. Finisci per avere cluster definiti da uno stato temporaneo piuttosto che da una vera identità biologica. Per risolvere il problema, Scanpy fornisce una funzione dedicata per calcolare lo score dei geni in base al ciclo cellulare. Passi a questa funzione il tuo dataset single-cell insieme a due liste specifiche di marker genes noti. Una lista contiene i geni attivi durante la fase S, la fase di sintesi del ciclo cellulare. L'altra lista contiene i geni attivi durante la fase G2M, la fase della mitosi. La funzione di scoring valuta ogni singola cellula e calcola due metriche continue: un S-score e un G2M-score. Lo fa analizzando quanto fortemente sono espressi questi specifici geni di fase rispetto al livello di espressione di background della cellula. In base a questi due score, la funzione assegna anche una label di fase categorica a ciascuna cellula nei tuoi metadata, etichettandola come S, G2M o G1 se nessuno dei due score è particolarmente alto. Ora che hai quantificato questo effetto, devi rimuovere la sua influenza dal dataset. È qui che usi la funzione regress out. Dici a regress out di guardare le colonne dell'S-score e del G2M-score che sono state appena aggiunte ai metadata delle tue cellule. L'algoritmo costruisce quindi un modello lineare per l'espressione di ogni singolo gene in tutte le cellule, usando quei due score del ciclo cellulare come variabili predittive. Calcola il residuo, ovvero l'esatta quantità di espressione genica che non può essere spiegata dalla posizione della cellula nel ciclo cellulare. Questo valore residuo diventa il nuovo livello di espressione corretto nel tuo dataset. Ecco il punto chiave. Spesso le persone confondono la regressione con la batch correction. Sono concetti correlati, ma sono tool fondamentalmente diversi. I metodi di batch correction sono progettati per allineare gruppi discreti e categorici, come campioni raccolti in giorni diversi o sequenziati su macchine diverse. Regress out è progettato specificamente per variabili confondenti continue. Lo usi per gradienti numerici continui come questi score del ciclo cellulare, le total counts per cellula, o la percentuale di geni mitocondriali. Modella una pendenza matematica e la appiattisce. Una volta che esegui questo step di regressione, il forte bias biologico della divisione cellulare viene matematicamente rimosso dalla expression matrix. Quando fai girare di nuovo il tuo algoritmo di clustering su questi dati corretti, quelle cellule T in divisione e quelle a riposo si riuniranno in un singolo cluster coeso. L'algoritmo non è più distratto dal rumore della replicazione del DNA. Fare il regress out degli score del ciclo cellulare assicura che la tua downstream analysis raggruppi le cellule in cluster strettamente in base a ciò che sono, piuttosto che a ciò che stavano facendo nel momento in cui sono state sequenziate. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
7

Riduzione della dimensionalità con PCA

3m 31s

Questo episodio spiega la Principal Component Analysis nel contesto dei dati single-cell. Discutiamo di come la PCA riduca il rumore nel dataset e perché la scelta del giusto numero di componenti sia importante. Imparerai come ridurre migliaia di geni in una base gestibile per algoritmi avanzati.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 7 di 16. La mente umana non può visualizzare duemila dimensioni. Peggio ancora, i complessi algoritmi di clustering ne vengono paralizzati a livello computazionale, rallentati da un mix di vero segnale biologico e rumore tecnico casuale. Hai bisogno di un modo per estrarre la struttura centrale dei tuoi dati prima di analizzarli. La riduzione della dimensionalità con la Principal Component Analysis è come risolvi questo problema. Prima di entrare nei dettagli, dobbiamo chiarire un malinteso comune. Spesso le persone pensano che la PCA sia solo uno scatter plot che mostra PC1 contro PC2, inteso come visualizzazione finale per l'occhio umano. Non è così. Anche se puoi plottare le prime due componenti, la PCA è fondamentalmente una base matematica. Comprime una matrice sparsa e rumorosa in un formato denso da passare a tool di downstream come i neighbor graph. Pensa al tuo punto di partenza. Hai appena isolato circa duemila geni altamente variabili. Ogni gene rappresenta una dimensione indipendente nel tuo dataset. Esegui la funzione scanpy tools pca per calcolare le principal component. Questa funzione valuta il tuo intero dataset e comprime quelle duemila dimensioni geniche in un set molto più piccolo di dimensioni sintetiche, in genere circa cinquanta. Queste dimensioni sintetiche sono ordinate in base a quanta varianza spiegano. La prima principal component rappresenta l'asse di variazione più forte in assoluto nelle tue cellule. La seconda rappresenta il secondo più forte, e così via. Ecco l'intuizione chiave. Le prime componenti catturano le differenze biologiche reali e strutturate. Man mano che scendi lungo l'elenco delle componenti, queste catturano progressivamente meno biologia e più rumore tecnico casuale. Tagliando via la coda di queste componenti, stai essenzialmente facendo il denoising della tua matrice di dati. Per valutare questa riduzione, devi decidere quante componenti conservare. Usi la funzione scanpy plot pca variance ratio. Questo comando genera un line chart che mostra la frazione di varianza totale spiegata da ciascuna singola componente. Scorri questa linea cercando l'elbow point, ovvero il punto in cui il calo ripido si appiattisce improvvisamente in una lunga coda. Se la curva si appiattisce alla componente quindici, potresti pensare di aver bisogno solo di quindici componenti. Tuttavia, nei workflow single-cell, sovrastimiamo deliberatamente il numero di principal component. Potresti vedere l'elbow a quindici ma dire comunque alle tue funzioni di downstream di usarne cinquanta. Gli algoritmi di clustering di downstream sono altamente robusti. Possono facilmente ignorare il leggero rumore tecnico contenuto nelle componenti dalla sedici alla cinquanta. Ciò che non possono fare è recuperare il segnale biologico che hai scartato troppo presto. Se la componente ventidue contiene la variance signature per un tipo di cellula molto raro, eliminarla significa che quel tipo di cellula scompare completamente dalla tua analisi. Calcoli le componenti, controlli il variance ratio per confermare la struttura dei dati e vai avanti. Il concetto più importante da ricordare è che la PCA non è un'immagine da guardare, ma un filtro matematico mirato che sacrifica la profondità dimensionale grezza per eliminare il rumore ed esporre i veri assi biologici dei tuoi dati. Spero sia stato utile. Grazie per aver ascoltato e goditi il resto della giornata.
8

Il Nearest Neighbor Graph e UMAP

3m 30s

Analizziamo il nucleo assoluto della moderna topologia single-cell: il nearest neighbor graph. Spieghiamo poi come UMAP traduca questa complessa rete in un grafico 2D leggibile. Imparerai perché il neighbor graph è il prerequisito per quasi tutti gli strumenti avanzati in Scanpy.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 8 di 16. Il segreto della moderna single-cell analysis non è semplicemente plottare punti su una griglia. È capire esattamente quali cellule sono vicine in uno spazio enorme e ad alta dimensionalità. Se sbagli questa struttura di base, ogni visualizzazione successiva ti porterà fuori strada. Il meccanismo per catturare questa struttura è il nearest neighbor graph, e oggi vedremo come costruirlo e proiettarlo usando UMAP. A questo punto in una tipica pipeline, hai già eseguito la Principal Component Analysis. Hai condensato migliaia di geni in forse quaranta o cinquanta principal components. Ma cinquanta dimensioni sono ancora impossibili da visualizzare, e non ci dicono esplicitamente quali cellule appartengono alla stessa community locale. Dobbiamo costruire una rete di connessioni. In Scanpy, lo fai usando la funzione sc dot pp dot neighbors. Questo step calcola il neighborhood graph delle tue cellule. Calcolare le distanze tra decine di migliaia di cellule su trentamila geni raw è computazionalmente brutale e altamente suscettibile al rumore. Calcolando invece i neighbor sulle principal components, la matematica è veloce e il rumore tecnico è già stato eliminato. Per ogni singola cellula, l'algoritmo guarda le sue coordinate su quelle principal components e trova i suoi peer più vicini. Di default, collega una cellula ai suoi quindici nearest neighbors. L'output è un network matematico in cui le cellule sono i nodi, e gli edge tra di loro rappresentano un'alta similarità. Questo neighborhood graph diventa la data structure fondamentale per i downstream task. Una volta che hai questa rete, vuoi effettivamente guardarla. È qui che entra in gioco UMAP, richiamato tramite sc dot tl dot umap. Ecco il punto chiave. Un malinteso molto comune è che UMAP calcoli le distanze direttamente dai tuoi dati di raw gene expression. Non è così. UMAP è completamente cieco ai tuoi geni. È semplicemente un layout engine. Il suo unico lavoro è prendere quel nearest neighbor graph precalcolato e appiattirlo in uno spazio bidimensionale. UMAP funziona ottimizzando un layout per farlo corrispondere al graph. Tira i neighbor connessi vicini tra loro, mentre spinge lontano le cellule disconnesse. Dato che si basa interamente sulle connessioni locali definite nello step precedente, è eccezionalmente bravo a preservare la struttura locale. Se un gruppo di cellule era strettamente connesso nel graph ad alta dimensionalità, formerà un'isola distinta e compatta sul tuo plot UMAP 2D. Ma fai attenzione, lo spazio vuoto tra le isole separate su un plot UMAP significa molto poco. UMAP sacrifica l'accuratezza spaziale globale per assicurarsi che i neighbor locali restino incollati tra loro. Questa separation of concerns è vitale. La forma che vedi su un UMAP è completamente dettata dal neighbor graph costruito subito prima. Se vuoi cambiare quanto il tuo layout sia sensibile ai tipi di cellule rare, non fai tuning su UMAP. Torni indietro e regoli il numero di neighbor nella costruzione del graph stesso. Se trovi questi episodi utili e vuoi supportare lo show, puoi cercare DevStoriesEU su Patreon. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
9

Clustering con Leiden

3m 53s

Esploriamo come trovare popolazioni discrete di cellule utilizzando l'algoritmo di clustering Leiden. Ottimizzando la modularità sul neighborhood graph, Leiden isola comunità altamente connesse. Imparerai come regolare il parametro di risoluzione per trovare gruppi stabili e biologicamente significativi.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 9 di 16. Gli algoritmi di clustering tradizionali presuppongono che i tuoi dati esistano in blob perfettamente sferici organizzati attorno a un punto centrale. Ma i dati biologici reali sono disordinati, interconnessi e formano strutture complesse e continue. Quando cerchi di forzare queste strutture complesse in semplici sfere, finisci per suddividere i singoli tipi di cellule in frammenti artificiali. Il clustering con Leiden risolve questo problema guardando a come le cellule si connettono tra loro, piuttosto che limitarsi a dove si trovano in uno spazio astratto. Spesso si tende a pensare al clustering come al K-means, dove definisci un punto centrale e raggruppi tutto ciò che c'è intorno usando le classiche distanze fisiche. Leiden non funziona in questo modo. È un algoritmo di clustering graph-based. Ignora completamente le distanze euclidee da un centroide. Si basa invece interamente sulla densità degli edge nel neighbor graph che hai costruito prima nella tua analisi. Pensa al neighbor graph come a un enorme social network. Le cellule sono gli individui, e gli edge tra di loro sono le amicizie. Leiden esegue quella che viene chiamata community detection. Cerca gruppi di cellule che hanno un numero molto alto di connessioni all'interno del loro gruppo specifico, ma pochissime connessioni verso il network esterno. Per ottenere questo, l'algoritmo ottimizza una metrica chiamata modularity. La modularity misura la densità dei link all'interno delle community rispetto ai link che ti aspetteresti se il network fosse totalmente casuale. L'algoritmo inizia assegnando ogni singola cellula alla propria community individuale. Poi, unisce iterativamente queste community, spostando i nodi avanti e indietro, controllando costantemente se il nuovo raggruppamento aumenta lo score di modularity complessivo. Leiden è progettato specificamente per raffinare queste partizioni con attenzione, garantendo che le community finali siano densamente connesse al loro interno e non soffrano di frammenti disconnessi, che era un problema noto nel vecchio algoritmo Louvain. In Scanpy, esegui tutto questo usando la tool function Leiden. Le passi il tuo data object principale, e opera direttamente sul neighbor graph esistente. L'output è una nuova colonna categorica aggiunta ai tuoi dati, che contiene un numero di cluster per ogni singola cellula. Ecco il punto chiave. Il controllo più importante che hai su tutto questo processo è il parametro resolution. Questo parametro agisce come una manopola che detta con quanta aggressività l'algoritmo divide i gruppi. Di default, Scanpy usa una resolution pari a uno. Se aumenti il valore della resolution, ottieni più cluster. L'algoritmo diventa molto sensibile, spezzando il grafo in sottopopolazioni più piccole e altamente specifiche. Se diminuisci il valore della resolution, ottieni meno cluster. L'algoritmo diventa più tollerante, raggruppando insieme porzioni più ampie del grafo. Supponi di eseguire Leiden e di guardare la mappa risultante. Potresti notare che un singolo tipo di cellula biologicamente noto è stato diviso in cinque minuscole sottopopolazioni iper-frammentate. L'algoritmo ha trovato lievi differenze, ma biologicamente quei cinque gruppi dovrebbero stare insieme come un unico stato cellulare distinto. Per risolvere questo problema, ti basta eseguire di nuovo la funzione Leiden, ma questa volta passi esplicitamente un numero più basso all'argomento resolution. Abbassando la resolution, istruisci l'algoritmo a rilassare i suoi criteri. Quei cinque piccoli frammenti si riuniranno in un unico cluster solido e biologicamente significativo. La resolution esatta di cui hai bisogno non è mai una verità matematica fissa; è una manopola regolabile che giri finché le community statistiche nel grafo non riflettono accuratamente la realtà biologica del tuo tessuto. Grazie per essere stato con noi. Spero tu abbia imparato qualcosa di nuovo.
10

Scoperta dei geni marker

3m 56s

Ci immergiamo nella scoperta dei geni marker e nei test di espressione differenziale. Spieghiamo come i test statistici identifichino le firme trascrittomiche uniche dei tuoi cluster. Imparerai come passare da cluster numerati anonimi a tipi cellulari biologici etichettati con sicurezza.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 10 di 16. Hai isolato un cluster di cellule ben definito nel tuo dataset, ma come fai a sapere se si tratta di una cellula T, di una cellula B o di uno stato completamente sconosciuto? La matematica le ha raggruppate, ma la biologia deve dirti di cosa si tratta. Questo passaggio di traduzione si basa interamente sulla marker gene discovery. Prima di guardare i tool, dobbiamo tracciare una linea netta tra clustering e annotation. Gli algoritmi di clustering si limitano a raggruppare le cellule in base alla similarità statistica su migliaia di dimensioni e ad assegnare loro una label arbitraria, come Cluster 0 o Cluster 1. Quel numero non ha alcun significato biologico. La marker gene discovery è il processo che trova i geni specifici che guidano quel raggruppamento statistico, permettendoti di assegnare veri nomi biologici a quei cluster. In Scanpy, trovi questi geni trainanti usando una funzione chiamata rank genes groups. Questa funzione esegue una differential expression analysis. Prende un categorical grouping, di solito i tuoi cluster calcolati, e confronta la gene expression delle cellule all'interno di un cluster con le cellule di tutti gli altri cluster combinati. L'obiettivo è trovare geni che sono altamente espressi nel tuo target cluster ma perlopiù silenti ovunque altrove. Di default, confronta ogni cluster con l'unione del resto delle cellule, ma puoi anche configurarla per confrontare un cluster con uno specifico reference group se stai cercando differenze sottili tra due tipi di cellule molto simili. Per decidere se un gene è davvero un marker, Scanpy esegue un test statistico per calcolare lo score della differenza di espressione. Puoi scegliere un t-test standard, ma il Wilcoxon rank-sum test è caldamente consigliato ed è la scelta standard per i dati single-cell. La single-cell gene expression non segue una normale curva a campana; è altamente variabile, fortemente asimmetrica e piena di valori zero dove un gene semplicemente non è stato rilevato. Il Wilcoxon test non presuppone una distribuzione normale. Invece di guardare ai raw mean values, fa il rank dei valori di espressione in tutte le cellule e confronta i rank tra il tuo target cluster e il resto del dataset. Questo lo rende molto più robusto contro gli outlier estremi. Guardiamo uno scenario specifico. Hai un dataset con diversi cluster e vuoi interrogare il Cluster 3. Chiami la funzione rank genes groups, le dici di usare le tue cluster label esistenti e imposti il metodo su Wilcoxon. Scanpy elabora i numeri e fa il rank di ogni singolo gene in base a quanto univocamente definisce il Cluster 3. A questo punto ispezioni i top result. Vedi che i geni con il rank più alto sono CD8A e GZMK. Se conosci l'immunologia, riconosci immediatamente che questi sono marker classici per le cellule T citotossiche. Dato che questi geni specifici sono unicamente upregulated qui rispetto al resto del dataset, puoi etichettare con sicurezza il Cluster 3 come una cellula T CD8 positiva. L'output di questa funzione viene salvato silenziosamente nel tuo oggetto AnnData sotto l'attributo uns. Scanpy salva simultaneamente array di nomi di geni, statistical score, p-value e log-fold change per ogni singolo cluster. Puoi estrarre questi array per costruire dataframe, salvarli in un file csv, o passarli direttamente a tool di downstream annotation. Ecco l'insight chiave. La differential expression trasforma forme matematiche arbitrarie in identità biologiche actionable. Senza marker gene, hai solo una mappa di numeri; con loro, hai un sistema biologico mappato. Questo è tutto per questo episodio. Grazie per l'ascolto, e keep building!
11

Integrazione dei dati con Ingest

4m 03s

Questo episodio copre l'integrazione dei dati utilizzando lo strumento Ingest. Spieghiamo come proiettare nuovi dataset nello spazio PCA e UMAP di un atlante di riferimento pre-annotato. Imparerai un metodo veloce e invariante per mappare le etichette attraverso diversi esperimenti.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 11 di 16. Hai un reference dataset perfettamente annotato e un campione di un paziente completamente nuovo da analizzare. Normalmente, combinarli significa eseguire una batch correction, ricalcolare le tue principal component e aspettare che un enorme joint UMAP venga renderizzato da zero. La Data Integration con Ingest offre un'alternativa più rapida e non distruttiva. Spesso si confonde ingest con la batch correction standard. I tradizionali tool di batch correction prendono più dataset e calcolano un joint model completamente nuovo. Modificano la rappresentazione sottostante dei tuoi reference data per forzare un allineamento. Ingest fa l'opposto. È una proiezione asimmetrica. Il tuo reference dataset funge da ground truth assoluta. Il modello spaziale è bloccato, e i nuovi dati vengono semplicemente fatti passare attraverso di esso senza alterare in alcun modo il modello originale. Prendi un reference atlas di cellule mononucleate del sangue periferico perfettamente annotato. Ogni cluster è verificato e ha una label. Hai appena ricevuto un campione di un paziente non annotato e disordinato. Vuoi applicare quelle label dell'atlante al tuo nuovo campione, e vuoi plottare le nuove cellule nello stesso identico coordinate space della reference. Per far funzionare tutto questo, le variabili nei tuoi due dataset devono allinearsi. Questo significa che entrambi i dataset devono condividere esattamente gli stessi geni. In pratica, filtri il tuo nuovo query dataset in modo che i suoi geni corrispondano agli highly variable genes già identificati nel tuo reference atlas. Il tuo reference dataset deve essere completamente processato prima di iniziare. Ha bisogno di una Principal Component Analysis esistente, di un neighborhood graph calcolato e di una rappresentazione UMAP. Contiene anche le label categoriche che vuoi trasferire, salvate nei suoi observation metadata. L'esecuzione è un singolo comando. Chiami la funzione ingest, passandole il tuo nuovo query dataset, il tuo reference dataset annotato e la colonna observation specifica che vuoi mappare, come la label del cell type. Ecco il punto chiave. Quando lanci la funzione, ingest prende i profili di espressione delle tue nuove cellule e li proietta matematicamente nel principal component space esistente del reference atlas. Evita completamente di calcolare una nuova Principal Component Analysis globale. Una volta che le query cells atterrano in quel layout spaziale condiviso, l'algoritmo cerca i nearest neighbors. Mappa le query cells direttamente sul neighbor graph preesistente del reference dataset. Il lavoro computazionale pesante per costruire un grafo è già stato fatto dal reference model. Dato che le nuove cellule ora hanno dei neighbor stabiliti nei reference data, avvengono due trasferimenti finali. Primo, le coordinate UMAP dei reference neighbor vengono assegnate alle nuove cellule. Secondo, le label dei metadata, come i tuoi cell type, vengono copiate in base al majority voting di quei reference neighbor più vicini. Il risultato è un query dataset che porta con sé l'esatto layout UMAP e le annotazioni dei cell type del tuo atlante. Puoi sovrapporre il campione del paziente precedentemente non annotato direttamente sopra la tua reference visualization, e le popolazioni biologiche corrispondenti si inseriranno perfettamente nei cluster visivi già stabiliti. Proiettando nuove cellule su un modello esistente, ingest sposta il tuo workflow dalla costante ricostruzione di fragili spazi globali alla creazione di un singolo reference atlas robusto, facendo fluire senza interruzioni tutti gli esperimenti futuri attraverso di esso. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
12

Visualizzazione dei pattern di espressione

3m 40s

Esploriamo tecniche di visualizzazione avanzate per valutare l'espressione genica attraverso i cluster. Ci concentriamo su dot plot e matrix plot, descrivendo in dettaglio come codificano sia l'intensità che la sparsità dell'espressione. Imparerai come convalidare visivamente le annotazioni dei tuoi tipi cellulari a colpo d'occhio.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Analisi single-cell con Scanpy, episodio 12 di 16. Un feature plot standard è ottimo per mostrare dove è attivo un gene specifico, ma diventa completamente inutile quando devi confrontare venti geni diversi su dieci cluster distinti contemporaneamente. Per risolvere questo problema, oggi parliamo di come visualizzare i pattern di espressione. Quando controlli i marker gene, l'istinto iniziale è spesso quello di usare una heatmap. Allinei tutte le tue cellule, allinei i geni e cerchi i blocchi di colore. Ma i dati di single-cell RNA sequencing sono notoriamente sparsi. La maggior parte delle cellule ha count pari a zero per la maggior parte dei geni. In una heatmap single-cell standard, questa sparsità crea rumore visivo. Finisci per fissare un mare di colore di background, cercando di indovinare se un gene è effettivamente un marker specifico per un cluster o se ha semplicemente subito un dropout casuale ovunque. È qui che entra in gioco il dot plot. Invece di plottare le singole cellule, un dot plot le aggrega. Posizioni i tuoi gruppi di cellule, come i tuoi cluster Leiden, su un asse, e i geni di interesse sull'altro. Ad ogni intersezione ottieni un cerchio. Ecco il punto chiave. Un dot plot codifica due informazioni completamente diverse in quel singolo cerchio. Primo, il colore del punto rappresenta il livello di espressione medio del gene in quelle cellule. Colori più scuri o più intensi indicano un'espressione più alta. Secondo, la dimensione del punto rappresenta la frazione di cellule in quel cluster che esprimono effettivamente il gene. Un punto grande significa che quasi tutte le cellule nel cluster hanno almeno un po' di RNA per quel gene. Un punto minuscolo significa che solo poche cellule lo esprimono. Questa doppia codifica è incredibilmente potente per i dati sparsi. Separa la quantità di un gene presente da quanto è ampiamente distribuito. Diciamo che stai analizzando quindici marker gene candidati su cinque cluster Leiden. Passi i tuoi dati, la tua lista di geni e le label dei cluster alla funzione dot plot. Puoi vedere all'istante se i marker dei monociti che ti aspetti sono sia altamente espressi che ampiamente espressi nel Cluster uno, pur essendo totalmente assenti negli altri quattro cluster. Non devi strizzare gli occhi per guardare le singole righe di cellule. I punti grandi e scuri nella riga del Cluster uno ti danno una validazione immediata. A volte, non ti servono le informazioni sulla frequenza fornite dalla dimensione del punto. Vuoi solo una griglia pulita che mostri l'espressione media. Per questo, Scanpy offre la funzione matrix plot. Pensa a un matrix plot come a una heatmap raggruppata. Aggrega comunque le tue cellule per cluster, ma riempie l'intero quadrato della griglia con un colore che rappresenta il valore di espressione medio. Non ci sono dimensioni dei punti che cambiano. È un modo più veloce e denso per verificare i pattern di espressione generali quando hai una lista enorme di geni e la frazione di cellule che li esprimono ti interessa meno. Entrambi i tool prendono il tuo data object, una lista dei tuoi geni target e la categoria di metadati per cui vuoi raggruppare. Vengono eseguiti rapidamente e scalano magnificamente su decine di geni. Quando hai a che fare con la sparsità dei dati single-cell, separare l'intensità di espressione dalla frequenza di espressione è il modo più affidabile per confermare che un marker gene definisca effettivamente un cluster. Per questo episodio è tutto. Grazie per l'ascolto, e continua a sviluppare!
13

Esplorazione dei manifold con Diffusion Maps

3m 49s

Introduciamo le Diffusion Maps, una potente tecnica di embedding per dati biologici continui. La confrontiamo con UMAP, spiegando perché la diffusione è più adatta per l'analisi della differenziazione cellulare. Imparerai come visualizzare transizioni continue e processi di sviluppo.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 13 di 16. UMAP è fantastico per separare i diversi tipi di cellule, ma può spezzare violentemente i processi biologici continui. Quando studi lo sviluppo cellulare, non vuoi isole di cellule disgiunte; hai bisogno di vedere il continuum fluido dei cambiamenti di stato. Esplorare i manifold con le Diffusion Map risolve esattamente questo problema. In Scanpy, calcoli tutto questo usando il tool diffmap. Spesso gli utenti usano UMAP di default per tutta la dimensionality reduction. Devi capire che UMAP è una tecnica di embedding ottimizzata per trovare cluster distinti e preservare i neighborhood locali. Le Diffusion Map sono fondamentalmente diverse. Preservano la probabilità matematica continua di transizione tra gli stati. Questo le rende la scelta ideale per analizzare processi continui come la differenziazione cellulare. L'algoritmo diffmap tratta il manifold dei tuoi dati come un network continuo. Si basa interamente sul nearest neighbor graph delle tue cellule. Una volta stabilito questo grafo, l'algoritmo simula un random walk attraverso le connessioni. Pensalo come la modellazione di un processo di diffusione, simile a come il calore si propaga attraverso un materiale fisico. L'algoritmo valuta con quanta facilità un segnale può viaggiare attraverso le regioni dense dei tuoi dati. Calcola la probabilità di passare da uno stato cellulare all'altro in un numero specifico di step. Le cellule che condividono un'alta probabilità di transizione vengono posizionate più vicine tra loro nello spazio finale a dimensionalità ridotta. Considera di tracciare una cellula staminale ematopoietica che si differenzia in un eritrocita. Se proietti questi dati usando un embedding che favorisce la separazione discreta, le cellule progenitrici intermedie vengono spesso forzate in cluster artificiali e separati. La matematica sottostante frattura la timeline biologica. Se invece fai girare diffmap, l'algoritmo calcola le probabilità di transizione lungo l'intero percorso di sviluppo. Il risultato è una traiettoria fluida e continua. La cellula staminale si trova a un'estremità, l'eritrocita maturo all'altra. Ogni stato intermedio viene plottato lungo un percorso connesso, basato strettamente sulla probabilità di transizione di stato. Non stai guardando snapshot isolati di tipi cellulari distinti. Stai guardando un evento biologico fluido. Applicare tutto questo in Scanpy segue una sequenza rigida. Per prima cosa, devi calcolare il neighborhood graph nel tuo oggetto. La Diffusion Map non può girare senza quelle connessioni neighbor precalcolate. Successivamente, chiami il tool diffmap e gli passi il tuo oggetto AnnData. Puoi opzionalmente specificare il numero di componenti che vuoi calcolare, il che imposta le dimensioni dell'output. Scanpy calcola la Diffusion Map e salva le nuove coordinate nell'attributo multidimensional observation del tuo oggetto, sotto la chiave X diffmap. Il tool salva anche gli autovalori nell'attributo unstructured data. Questi valori ti dicono quanta varianza cattura ogni componente di diffusione. Un brusco calo di questi autovalori indica che hai catturato le transizioni biologiche più importanti, e che le componenti successive sono probabilmente rumore. In un tipico dataset di differenziazione, la prima componente di diffusione non banale si allinea direttamente con l'asse temporale primario dello sviluppo. Ecco il concetto chiave. In una Diffusion Map, la distanza fisica tra due cellule sul plot non è solo una misura generica della similarità trascrittomica. Quella distanza rappresenta esplicitamente la probabilità matematica che si verifichi una transizione biologica tra quei due stati specifici. Per questa volta è tutto. Ci sentiamo alla prossima!
14

Grafi astratti con PAGA

3m 30s

Questo episodio tratta la Partition-based Graph Abstraction, o PAGA. Discutiamo come misurare l'effettiva connettività tra i cluster per preservare la topologia globale. Imparerai come utilizzare PAGA per scoprire le vere relazioni di lignaggio nascoste nei tuoi dati.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 14 di 16. Solo perché due cluster di cellule si trovano vicini in un plot UMAP, non significa che siano biologicamente correlati. La vicinanza visiva in due dimensioni è spesso un'illusione matematica e, se ti affidi a questa per tracciare traiettorie di sviluppo, rischi di collegare punti che in realtà non si toccano nello spazio high-dimensional. Per mappare la connettività reale e supportata statisticamente, hai bisogno degli Abstracted Graph con PAGA. PAGA sta per Partition-based Graph Abstraction. Dobbiamo chiarire subito un malinteso comune. PAGA non è un embedding di dimensionality reduction come t-SNE o UMAP. Non calcola le coordinate delle singole cellule per disegnare uno scatter plot. Al contrario, PAGA crea un grafo semplificato e coarse-grained. I nodi in questo grafo sono interi cluster, o partition, di cellule. Gli edge che collegano questi nodi rappresentano la statistical confidence che quei cluster condividano un confine continuo. Quando chiami la funzione PAGA sui tuoi dati annotati, la punti verso uno specifico set di label di gruppo, di solito i tuoi cluster Leiden o Louvain. L'algoritmo poi valuta i confini tra questi gruppi scavando nel neighborhood graph single-cell sottostante. Guarda le singole cellule nel cluster A e conta quanti dei loro neighbor diretti appartengono al cluster B. Conteggiando tutte queste connessioni cross-cluster e confrontandole con un random model, PAGA genera una connectivity matrix quantificabile. Un valore alto significa che i cluster sono profondamente intrecciati, suggerendo una transizione biologica. Un valore basso significa che sono isole separate. Considera uno scenario concreto. Stai tracciando lo sviluppo delle cellule immunitarie e devi dimostrare che uno specifico cluster progenitore dà origine direttamente a un cluster di cellule T effettrici. Su un visual plot standard, l'algoritmo di layout potrebbe piazzare un cluster completamente scollegato proprio in mezzo a loro, facendo sembrare la loro relazione indiretta. Esaminando la connectivity matrix di PAGA, bypassi questa distorsione visiva. Guardi direttamente l'edge weight matematico tra i tuoi gruppi progenitore ed effettore. PAGA ti permette di impostare una connectivity threshold minima. Quando applichi questa threshold, filtri via le connessioni spurie e a bassa confidence. Se l'edge forte tra i tuoi due cluster target sopravvive al taglio, hai stabilito un link statisticamente robusto. Questa è la parte che conta. PAGA non si limita ad affiancare i tuoi embedding; può correggerli. Dato che PAGA preserva la global topology in modo così affidabile, puoi usare l'abstracted graph per inizializzare un embedding UMAP. Invece di lasciare che UMAP parta da un layout spaziale random, gli dici di posizionare le singole cellule basandosi sul grafo PAGA coarse-grained. Questo ancora la tua visualizzazione bidimensionale finale alla vera realtà high-dimensional, assicurando che stati biologici distanti non vengano schiacciati insieme artificialmente. Le visualizzazioni distorceranno sempre i dati complessi per farli stare su uno schermo piatto, ma l'astrazione di un neighborhood graph si basa interamente sulla vicinanza matematica. Fidati del grafo più che dell'immagine. Questo è tutto per questo episodio. Grazie per aver ascoltato, e continua a sviluppare!
15

Inferenza delle traiettorie con DPT

3m 35s

Esploriamo l'inferenza delle traiettorie utilizzando il Diffusion Pseudotime (DPT). Spieghiamo come designare una root cell e calcolare le distanze geodetiche attraverso il grafo cellulare. Imparerai come disporre le cellule lungo una linea temporale di sviluppo continua.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 15 di 16. Il sequenziamento single-cell distrugge la cellula stessa che stai cercando di studiare. Ottieni un'istantanea statica della sua espressione genica, il che significa che non puoi registrare un video di una cellula staminale che si differenzia in uno stato maturo. Per vedere questo percorso di sviluppo, devi dedurre matematicamente una timeline calcolando le distanze trascrittomiche. Questo è esattamente ciò che facciamo usando la Trajectory Inference con DPT. DPT sta per Diffusion Pseudotime. Prima di vedere come opera l'algoritmo, dobbiamo chiarire cosa significa effettivamente questo nome. Lo pseudotime non è un vero tempo cronologico. Non misura ore, giorni o l'età biologica di una cellula. È strettamente una metrica di distanza trascrittomica. Misura quanti cambiamenti di espressione incrementali ha subito una cellula rispetto a uno specifico punto di partenza. Per eseguirlo in Scanpy, usi la funzione chiamata sc dot tl dot dpt. Questa funzione opera sul neighborhood graph esistente del tuo dataset, che collega le cellule in base alla loro somiglianza. Tuttavia, un grafo da solo non ha una direzione intrinseca. Per dargli una direzione, devi definire un punto di partenza. Lo fai impostando una root cell. Considera uno scenario in cui stai studiando lo sviluppo del sangue. Esamini i tuoi cluster e identifichi le cellule staminali ematopoietiche naive. Scegli un cell index specifico da quel gruppo e lo assegni come root nella struttura del tuo dataset. Questo funge da punto di origine, o tempo zero, per l'intero calcolo. Una volta stabilita la root, esegui la funzione DPT. Ecco il punto chiave. L'algoritmo non misura una distanza dritta e lineare tra la root e un'altra cellula. Lo sviluppo biologico non è una linea retta; segue percorsi complessi e ramificati. Per catturare questo aspetto, DPT calcola le distanze geodetiche lungo il tuo neighborhood graph. Valuta la struttura dei dati simulando dei random walk a partire dalla root. Passa da una cellula all'altra attraverso gli edge densi del grafo, trovando i percorsi più probabili di cambiamento trascrittomico. Il risultato di questo calcolo è un nuovo array di valori aggiunto alle tue cell annotations. Ogni singola cellula nel tuo dataset riceve uno pseudotime score. La root cell si trova a zero. Man mano che la distanza geodetica dalla root aumenta, lo score cresce. Nel nostro scenario di sviluppo del sangue, una cellula progenitrice intermedia potrebbe ottenere uno score di zero virgola quattro, mentre una cellula completamente matura all'estremità terminale di un branch ottiene uno score vicino a uno. In pratica, hai mappato un cluster statico di punti in un ordinamento di sviluppo continuo, ordinandoli dal meno al più differenziato. Ora puoi usare questo asse numerico per tracciare le dinamiche dei singoli geni, plottando esattamente quando uno specifico fattore di trascrizione si attiva lungo il percorso di sviluppo. L'affidabilità della tua trajectory inference dipende interamente dal tuo punto di partenza, il che significa che una root scelta in modo errato produrrà una timeline calcolata perfettamente ma biologicamente priva di significato. Se trovi utili questi episodi e vuoi supportare lo show, puoi cercare DevStoriesEU su Patreon. Questo è tutto per questo episodio. Grazie per l'ascolto e continua a costruire!
16

Scale-up sperimentale con Dask

3m 44s

Nel nostro episodio finale, diamo un'occhiata alla frontiera sperimentale di Scanpy: lo scale-up con Dask. Spieghiamo come gestire dataset che superano la RAM della tua macchina utilizzando la lazy evaluation e l'elaborazione out-of-core. Grazie per esserti unito a noi in questo approfondimento su Scanpy!

Download
Ciao, sono Alex di DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 16 di 16. Cosa succede quando il tuo dataset single-cell raggiunge i cinque milioni di cellule ed esaurisce completamente la memoria del tuo computer? Non puoi filtrarlo, non puoi normalizzarlo e il tuo kernel semplicemente crasha. La soluzione a questo hard limit di memoria è l'Experimental Scale-Up con Dask. Spesso, quando senti nominare Dask, pensi subito al parallel processing su un cluster distribuito per velocizzare il codice. Sebbene Dask possa farlo, il suo superpotere principale in Scanpy in questo momento è la gestione della memoria out-of-core tramite la lazy evaluation. Non si tratta solo di fare le cose più velocemente. Si tratta di fare cose che prima erano impossibili su una singola macchina. I workflow standard di Scanpy si basano su array in-memory. Questo richiede che l'intero dataset risieda nella tua RAM attiva. Quando usi il backend Dask, Scanpy sostituisce questi array standard all'interno del tuo oggetto AnnData con dei Dask array. Un Dask array è essenzialmente una collezione di molti array più piccoli, chiamati chunk. Invece di caricare l'intera matrice in memoria tutta in una volta, Dask lascia il grosso dei dati al sicuro sul disco. Quando esegui una funzione di preprocessing di Scanpy supportata da Dask, il risultato non viene calcolato immediatamente. È qui che entra in gioco la lazy evaluation. Invece di macinare numeri, Dask costruisce una ricetta. Crea un task graph che delinea esattamente quali operazioni matematiche devono essere eseguite su ogni singolo chunk di dati. Immagina uno scenario in cui hai un enorme dataset da due milioni di cellule sul disco, e devi calcolare le metriche di quality control. Se provi a farlo con un array standard, il tuo sistema si bloccherà mentre cerca di caricare tutto nella RAM. Ma se il tuo oggetto AnnData contiene un Dask array, chiami semplicemente la funzione standard di quality control di Scanpy. La funzione ritorna quasi istantaneamente. La tua memoria non ha picchi perché nessun numero è stato ancora effettivamente processato. Scanpy ha semplicemente preso nota del tuo intento. Quando sei finalmente pronto a plottare quelle metriche o a salvare le summary statistics, dici esplicitamente a Dask di calcolare il risultato. Questa è la parte che conta. In questo preciso istante, Dask tira fuori il primo chunk di dati dal tuo hard drive, calcola le metriche solo per quel chunk, salva il piccolo risultato e poi butta immediatamente il chunk di dati grezzi fuori dalla memoria. Poi passa al chunk successivo. Il tuo memory footprint attivo rimane minuscolo. È dettato interamente dalla dimensione di un singolo chunk, non dai milioni di cellule dell'intero dataset. In questo momento, questo backend Dask in Scanpy è classificato come sperimentale. Non tutte le funzioni nell'ecosistema lo supportano ancora. Tuttavia, gli step di preprocessing core come la normalizzazione, lo scaling e la highly variable gene selection sono completamente equipaggiati per gestire enormi operazioni out-of-core. Quando passi dall'eager processing in-memory al lazy processing su disco, la dimensione del tuo dataset non è più limitata dalla RAM del tuo hardware, ma solo dalla tua pazienza. Questo ci porta alla fine della nostra serie sul single-cell. Ti incoraggio vivamente a esplorare la documentazione ufficiale di Scanpy e a provare a costruire questi data graph hands-on. Se hai idee su quali tecnologie dovremmo trattare nella nostra prossima serie, visita devstories dot eu e faccelo sapere. Grazie per l'ascolto, happy coding a tutti!