Ediția v1.11 — 2026. Un ghid cuprinzător pentru analiza single-cell folosind Scanpy (v1.11 - 2026). Învață cum să preprocesezi, să vizualizezi, să realizezi clustering și să deduci traiectorii pentru date scalabile de expresie genică single-cell.
Descoperă ideile fundamentale din spatele Scanpy și de ce a fost creat pentru analiza single-cell scalabilă. Explorăm obiectul AnnData, structura de date de bază care menține matricele, adnotările și embedding-urile perfect aliniate. Vei învăța modelul mental necesar pentru a naviga în ecosistemul Scanpy.
4m 34s
2
Metrici pentru controlul calității
Explorăm modul în care se efectuează controlul inițial al calității pe datele single-cell folosind Scanpy. Prin izolarea unor populații specifice de gene, cum ar fi ARN-ul mitocondrial, putem identifica celulele stresate sau pe moarte. Vei învăța cum să calculezi și să interpretezi aceste metrici QC cruciale.
3m 52s
3
Filtrare și normalizare
Acest episod acoperă pașii critici de filtrare și normalizare a matricelor de expresie single-cell. Explicăm cum să elimini datele de calitate slabă și să aplici scalarea profunzimii de numărare (count depth scaling) cu o transformare log1p. Vei învăța cum să faci direct comparabile celulele cu profunzimi de secvențiere diferite.
3m 51s
4
Detectarea dubletelor cu Scrublet
Aprofundăm detectarea dubletelor, un pas crucial pentru surprinderea artefactelor tehnice în secvențierea microfluidică single-cell. Detaliem modul în care Scrublet simulează dublete artificiale pentru a marca celulele suspecte. Vei învăța cum să identifici și să elimini aceste combinații artificiale din setul tău de date.
3m 43s
5
Selecția caracteristicilor și genele cu variabilitate ridicată
Examinăm conceptul de feature selection și de ce este necesar să identificăm genele cu variabilitate ridicată. Prin eliminarea zgomotului de fond (housekeeping noise), ne concentrăm analiza pe factorii biologici determinanți. Vei învăța cum să folosești Scanpy pentru a izola cele mai informative gene pentru etapele ulterioare.
3m 45s
6
Scoringul ciclului celular și regresia
Explorăm modul de gestionare a factorilor de confuzie prin evaluarea și eliminarea prin regresie a fazelor ciclului celular. Discutăm cum să calculăm scorurile S și G2M și să folosim regresia pentru a le elimina influența. Vei învăța cum să previi ca diviziunea celulară activă să-ți distrugă topologia de clustering.
3m 38s
7
Reducerea dimensionalității cu PCA
Acest episod explică Principal Component Analysis (PCA) în contextul datelor single-cell. Discutăm cum PCA reduce zgomotul din setul de date și de ce contează selectarea numărului corect de componente. Vei învăța cum să reduci mii de gene la o bază gestionabilă pentru algoritmi avansați.
3m 47s
8
Graful Nearest Neighbor și UMAP
Detaliem nucleul absolut al topologiei moderne single-cell: graful nearest neighbor. Apoi explicăm cum UMAP traduce această rețea complexă într-un grafic 2D ușor de citit. Vei învăța de ce graful vecinilor este o condiție prealabilă pentru aproape orice instrument avansat din Scanpy.
3m 52s
9
Clustering cu Leiden
Explorăm cum să găsim populații discrete de celule folosind algoritmul de clustering Leiden. Prin optimizarea modularității pe graful vecinătăților, Leiden izolează comunități puternic conectate. Vei învăța cum să ajustezi parametrul de rezoluție pentru a găsi grupuri stabile, relevante din punct de vedere biologic.
4m 23s
10
Descoperirea genelor marker
Aprofundăm descoperirea genelor marker și testarea expresiei diferențiale. Explicăm cum testele statistice identifică semnăturile transcriptomice unice ale cluster-elor tale. Vei învăța cum să faci tranziția de la cluster-e anonime numerotate la tipuri de celule biologice etichetate cu încredere.
5m 02s
11
Integrarea datelor cu Ingest
Acest episod acoperă integrarea datelor folosind instrumentul Ingest. Explicăm cum să proiectezi noi seturi de date în spațiul PCA și UMAP al unui atlas de referință pre-adnotat. Vei învăța o metodă rapidă și invariantă pentru maparea etichetelor între diferite experimente.
3m 56s
12
Vizualizarea tiparelor de expresie
Explorăm tehnici avansate de vizualizare pentru evaluarea expresiei genice la nivelul cluster-elor. Ne concentrăm pe dot plots și matrix plots, detaliind modul în care acestea codifică atât intensitatea expresiei, cât și raritatea (sparsity). Vei învăța cum să validezi vizual, dintr-o privire, adnotările tipurilor tale de celule.
3m 37s
13
Explorarea manifold-urilor cu Diffusion Maps
Introducem Diffusion Maps, o tehnică puternică de embedding pentru date biologice continue. O comparăm cu UMAP, explicând de ce difuzia este mai potrivită pentru analiza diferențierii celulare. Vei învăța cum să vizualizezi tranzițiile continue și procesele de dezvoltare.
4m 20s
14
Grafuri abstractizate cu PAGA
Acest episod acoperă Partition-based Graph Abstraction, sau PAGA. Discutăm cum să măsurăm conectivitatea reală dintre cluster-e pentru a păstra topologia globală. Vei învăța cum să folosești PAGA pentru a descoperi adevăratele relații de descendență ascunse în datele tale.
3m 32s
15
Deducerea traiectoriilor cu DPT
Explorăm deducerea traiectoriilor folosind Diffusion Pseudotime (DPT). Explicăm cum să desemnezi o celulă rădăcină și să calculezi distanțele geodezice pe graful celular. Vei învăța cum să aranjezi celulele de-a lungul unei axe cronologice continue de dezvoltare.
3m 46s
16
Scalare experimentală cu Dask
În ultimul nostru episod, privim spre frontiera experimentală a Scanpy: scalarea cu Dask. Explicăm cum să gestionezi seturile de date care depășesc memoria RAM a mașinii tale folosind lazy evaluation și procesarea out-of-core. Îți mulțumim că ni te-ai alăturat în această explorare aprofundată a Scanpy!
3m 38s
Episoade
1
Identitatea Scanpy și AnnData
4m 34s
Descoperă ideile fundamentale din spatele Scanpy și de ce a fost creat pentru analiza single-cell scalabilă. Explorăm obiectul AnnData, structura de date de bază care menține matricele, adnotările și embedding-urile perfect aliniate. Vei învăța modelul mental necesar pentru a naviga în ecosistemul Scanpy.
Salut, sunt Alex de la DEV STORIES DOT EU. Analiza single-cell cu Scanpy, episodul 1 din 16. Dataset-urile single-cell au explodat de la mii de celule la milioane în doar câțiva ani. Încearcă să încarci volumul ăsta în toolkit-uri mai vechi, care consumă multă memorie, și mașina ta se va bloca. Asta e exact problema pe care o rezolvă Scanpy.
Scanpy este un toolkit scalabil construit pentru a analiza dataset-uri masive de expresie genică single-cell în Python. Gestionează memoria eficient, bazându-se pe o structură de date fundamentală foarte specifică. Această structură se numește Annotated Data, sau AnnData.
Oamenii care vin din zona de date tabulare standard presupun adesea că AnnData este doar un dataframe pandas customizat. Nu este. Un singur dataframe este mult prea plat pentru biologia single-cell. Într-un experiment single-cell, ai o matrice masivă de expression counts, dar ai și metadata complexe despre celule și metadata complet separate despre gene. AnnData este un container multidimensional care leagă strâns matricea de bază și toate metadata asociate într-un singur obiect sincronizat.
Gândește-te la un scenariu în care încarci un dataset de un milion de celule. În centrul obiectului tău AnnData se află matricea de date de bază, accesată prin atributul dot X. Asta e o matrice bidimensională care conține valorile tale numerice reale, de obicei expression counts pentru gene. Rândurile reprezintă întotdeauna observații, care sunt celulele tale individuale, iar coloanele reprezintă întotdeauna variabile, care sunt genele tale. Pentru un dataset de un milion de celule, dot X este aproape întotdeauna stocat ca o sparse matrix pentru a economisi RAM.
Iată ideea cheie. Matricea din dot X nu își stochează propriile nume de rânduri sau coloane. Se bazează în întregime pe două dataframe-uri de metadata dedicate pentru a oferi acel context.
Primul este metadata observațiilor, accesat prin atributul dot obs. Acesta este un dataframe pandas standard, mapat direct pe rândurile matricei tale dot X. Conține tot ce știi despre celule. Pentru dataset-ul tău de un milion de celule, dot obs va avea exact un milion de rânduri. Aici se află barcode-urile celulelor, batch label-urile, metricile de quality control și asignările de clustering.
Al doilea este metadata variabilelor, accesat prin atributul dot var. Acesta este un alt dataframe mapat direct pe coloanele matricei tale dot X. Conține tot ce știi despre genele sau feature-urile pe care le-ai măsurat. Aici stochezi simbolurile genelor, locațiile pe cromozomi și metricile statistice, cum ar fi flag-urile pentru highly variable genes.
Pentru că dot obs și dot var sunt strict aliniate cu dimensiunile lui dot X, poți face slice pe obiectul AnnData în siguranță. Dacă filtrezi celulele moarte din dot obs, obiectul AnnData elimină automat rândurile corespunzătoare din matricea dot X. Alinierea dimensională nu se strică niciodată.
Mai există un strat crucial în structura AnnData. Pe măsură ce îți procesezi datele single-cell, generezi reprezentări multidimensionale ale celulelor tale, cum ar fi principal components sau coordonate UMAP. Aceste output-uri nu se potrivesc perfect într-o singură coloană din dot obs. În schimb, ele intră într-un dicționar separat numit dot obsm, care vine de la observation matrices. Singura regulă e că orice matrice pe care o pui în dot obsm trebuie să aibă exact același număr de rânduri ca dot X.
Păstrând matricea de bază, metadata celulelor și metadata genelor blocate într-o singură structură care se auto-actualizează, AnnData garantează că datele tale rămân perfect sincronizate de la primul pas de filtrare până la vizualizarea finală.
Dacă găsești aceste episoade utile, poți susține emisiunea căutând DevStoriesEU pe Patreon. Ca întotdeauna, mersi că asculți. Ne vedem în episodul următor.
2
Metrici pentru controlul calității
3m 52s
Explorăm modul în care se efectuează controlul inițial al calității pe datele single-cell folosind Scanpy. Prin izolarea unor populații specifice de gene, cum ar fi ARN-ul mitocondrial, putem identifica celulele stresate sau pe moarte. Vei învăța cum să calculezi și să interpretezi aceste metrici QC cruciale.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 2 din 16. Cea mai rapidă modalitate de a strica o analiză single-cell este să păstrezi, fără să-ți dai seama, celule pe moarte sau goale în dataset. S-ar putea să crezi că descoperi o subpopulație nouă, dar de fapt tu doar faci clustering pe resturi celulare. Identificarea acestor celule compromise se bazează în întregime pe metrici de Quality Control.
Hai să clarificăm un lucru de la bun început. Lumea confundă adesea calcularea metricilor de calitate cu filtrarea datelor proaste. Nu sunt deloc același lucru. Funcția Scanpy calculate qc metrics nu elimină nicio celulă sau genă din dataset-ul tău. Este strict un tool de adnotare. Calculează statistici și le atașează ca noi coloane la dataframe-ul tău observation, care urmărește celulele, și la dataframe-ul tău variable, care urmărește genele. Eliminarea efectivă a celulelor proaste se face într-un pas separat.
De ce avem nevoie de aceste metrici specifice? Ia în considerare o probă de măduvă osoasă. În timpul extracției, stresul fizic poate sparge celulele fragile. Când membrana celulară se rupe, ARN-ul citoplasmatic se scurge și se pierde. Totuși, mitocondriile sunt închise în propriile lor membrane, așa că ARN-ul mitocondrial rămâne blocat în interiorul resturilor celulei sparte. Dacă secvențiezi această picătură, vei obține o concentrație mare de gene mitocondriale și mai nimic altceva. Asta este o celulă moartă.
Pentru a identifica aceste celule rupte, trebuie să urmărești anumite populații de gene. În dataset-urile umane, genele mitocondriale încep de obicei cu prefixul MT-dash. Genele ribozomale ar putea începe cu RPS sau RPL. Înainte să poți calcula metrici pentru aceste populații, trebuie să le etichetezi în dataset-ul tău. Faci asta creând o nouă coloană boolean în dataframe-ul tău var. De exemplu, creezi o coloană numită mt care este evaluată la True dacă numele genei începe cu MT-dash, și False în caz contrar.
Odată ce ai marcat aceste gene, rulezi funcția calculate qc metrics. By default, această funcție calculează statistici standard de bază, cum ar fi numărul total de RNA counts per celulă și numărul de gene exprimate per celulă. Dar îi poți spune, de asemenea, să se uite la populațiile specifice de gene pe care tocmai le-ai definit. Pasezi numele coloanei tale boolean, cum ar fi mt, în argumentul qc vars.
Funcția calculează apoi proporția de counts care provin din acel grup specific de gene. Ea adaugă noi coloane la dataframe-ul tău obs. O coloană va afișa totalul de counts al genelor mitocondriale pentru fiecare celulă. O altă coloană, mult mai importantă, va afișa procentul din totalul de counts care provine din genele mitocondriale. Dacă o celulă arată că treizeci la sută din ARN-ul ei este mitocondrial, știi că este probabil o celulă ruptă, pe moarte, din cauza procesului de extracție.
Iată ideea principală. Funcția calculate qc metrics transformă matricile de counts brute, neinterpretabile, în semnale biologice despre sănătatea celulei. Nu ia decizii în locul tău, dar prin etichetarea unor populații specifice de gene, îți oferă dovezile numerice exacte de care ai nevoie pentru a separa biologia reală de zgomotul de extracție.
Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
3
Filtrare și normalizare
3m 51s
Acest episod acoperă pașii critici de filtrare și normalizare a matricelor de expresie single-cell. Explicăm cum să elimini datele de calitate slabă și să aplici scalarea profunzimii de numărare (count depth scaling) cu o transformare log1p. Vei învăța cum să faci direct comparabile celulele cu profunzimi de secvențiere diferite.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 3 din 16. Te uiți la două celule din dataset-ul tău. Una pare să exprime de două ori mai mult ARN decât cealaltă. Dar nu este o diferență biologică - un droplet a fost pur și simplu secvențiat de două ori mai adânc de către mașină. Dacă le compari direct, toată analiza ta downstream va fi distorsionată de artefacte tehnice. Filtrarea și normalizarea sunt tool-urile care rezolvă această discrepanță.
Înainte să poți ajusta sequencing depth-ul, trebuie să elimini gunoiul. Datele raw single-cell sunt pline de celule moarte, droplet-uri goale și zgomot aleatoriu. Cureți asta pe două axe distincte: celulele și genele. Uneori, oamenii confundă acești doi pași, dar fac lucruri complet diferite. Mai întâi te ocupi de celule folosind funcția filter cells. Îi spui lui Scanpy să elimine orice celulă care exprimă mai puțin de un număr minim de gene. Dacă un droplet conține doar două sute de gene detectate, când o celulă sănătoasă ar trebui să aibă două mii, acel droplet este probabil gol sau conține o celulă distrusă, pe moarte. Îl elimini complet.
Apoi, filtrezi genele în întregul tău dataset. Folosind funcția filter genes, elimini genele care sunt exprimate în prea puține celule. Dacă o anumită genă este detectată doar într-una sau două celule din zece mii, nu oferă nicio valoare statistică pentru gruparea sau clasificarea ulterioară a tipurilor de celule. Este doar zgomot computațional. Elimini complet acea genă.
Odată ce celulele de calitate scăzută și genele neinformative au dispărut, te confrunți în continuare cu problema de sequencing depth. Aici normalizezi total counts. Scopul este să scalezi fiecare celulă astfel încât toate să pară că au același număr total de read counts. Ia un scenariu în care Celula A are cinci mii de total counts, iar Celula B are douăzeci de mii. Alegi un size factor comun, de obicei zece mii. Scanpy aplică un scaling factor fiecărei celule în parte. Dublează count-urile din Celula A și înjumătățește count-urile din Celula B. Acum, ambele celule însumează zece mii de total counts. Când te uiți la o anumită genă din ambele celule, compari expresia lor relativă reală, complet independent de cât de mult le-a eșantionat mașina de secvențiere.
Să faci totalurile egale este doar jumătate din matematică. Datele de expresie biologică sunt masiv skewed. Câteva gene vor avea un număr enorm de count-uri, în timp ce majoritatea vor avea foarte puține. Dacă introduci aceste date skewed în calcule de varianță sau în algoritmi de dimensionality reduction mai târziu, acele câteva gene masive vor domina matematica și vor acoperi semnalele biologice subtile. Repari asta folosind o transformare log plus one. Apelezi funcția log one p în Scanpy, care aplică un logaritm natural tuturor count-urilor tale normalizate. Partea de plus one a funcției este critică deoarece matricea ta de date este în mare parte formată din zerouri, reprezentând gene care nu sunt exprimate într-o anumită celulă. Logaritmul din zero este nedefinit, dar logaritmul din zero plus unu este zero. Acest pas simplu comprimă valorile extrem de mari, păstrând în același timp zerourile exact acolo unde sunt, rezultând într-o distribuție mult mai echilibrată.
Iată ideea cheie. Filtrarea și normalizarea nu modifică biologia de bază a sample-ului tău. Ele elimină bias-urile mecanice ale hardware-ului de secvențiere, astfel încât biologia reală să poată ieși la iveală. Mulțumesc pentru ascultare, happy coding tuturor!
4
Detectarea dubletelor cu Scrublet
3m 43s
Aprofundăm detectarea dubletelor, un pas crucial pentru surprinderea artefactelor tehnice în secvențierea microfluidică single-cell. Detaliem modul în care Scrublet simulează dublete artificiale pentru a marca celulele suspecte. Vei învăța cum să identifici și să elimini aceste combinații artificiale din setul tău de date.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 4 din 16. Uneori, două celule complet diferite rămân prinse în același droplet microfluidic, creând o semnătură transcriptomică Frankenstein care arată ca o stare biologică complet nouă. Nu este o descoperire. Este o eroare și, dacă nu o depistezi din timp, îți va contamina analiza. Asta e exact problema pe care Doublet Detection cu Scrublet este conceput să o rezolve.
Când rulezi un experiment single-cell folosind droplet microfluidics, împingi o suspensie de celule printr-un canal, țintind o celulă per droplet. Statistic, procesul ăsta nu e perfect. Ocazional, două celule împart un singur droplet. Ia un scenariu în care un monocit și o celulă T rămân prinse împreună. Mașina de secvențiere citește RNA-ul lor combinat ca o singură entitate, generând un profil care combină gene din ambele tipuri de celule. Oamenii confundă adesea aceste profiluri mixte cu stări de tranziție biologică reale, cum ar fi o celulă aflată la jumătatea procesului de diferențiere. Trebuie să fim complet clari. Doublet-urile sunt artefacte pur tehnice. Ele nu există în țesut și trebuie eliminate.
În Scanpy, gestionezi asta folosind funcția scrublet din modulul de preprocessing. Scrublet operează pe o premisă extrem de eficientă pentru a găsi aceste celule false. Dacă vrei să detectezi doublet-uri, trebuie să știi cum arată un doublet în dataset-ul tău specific. Din moment ce algoritmul nu știe care dintre celulele tale observate sunt erori, și le fabrică pe ale lui.
Mai întâi, Scrublet ia expression matrix-ul celulelor tale observate. Apoi, alege random perechi din aceste celule reale și adună computațional profilurile lor de gene expression. Aceste profiluri combinate sunt doublet-urile tale simulate. Acum, Scrublet mapează atât celulele tale reale observate, cât și aceste doublet-uri nou simulate, în același high-dimensional space. Construiește un nearest-neighbor classifier pentru a analiza relațiile dintre ele.
Asta e ideea de bază. Scrublet evaluează vecinătatea imediată a fiecărei celule reale din dataset-ul tău. Dacă o celulă observată este înconjurată în principal de doublet-uri simulate, acea celulă reală arată matematic identic cu un mashup artificial. Scrublet îi atribuie un doublet score mare. În schimb, dacă o celulă observată stă într-un cluster cu alte celule reale și foarte puține doublet-uri simulate, primește un scor mic. Este foarte probabil să fie un single cell autentic.
Funcția nu se oprește la atribuirea unui scor continuu. Evaluează distribuția tuturor doublet scores din dataset-ul tău pentru a calcula automat un cutoff threshold. Caută o separare între peak-ul mare de celule normale și tail-ul mai mic de doublet-uri suspecte. Pe baza acestui threshold, Scrublet etichetează fiecare celulă din dataset-ul tău cu o valoare boolean, marcând-o cu true dacă este un doublet prezis, și cu false dacă este un singlet. Aceste rezultate sunt salvate direct în data object-ul tău, permițându-ți să filtrezi celulele false înainte să treci la downstream analysis.
Punctul forte fundamental al Scrublet este că nu se bazează pe baze de date de referință externe pentru a găsi erori tehnice. Învață exact failure modes ale experimentului tău specific prin combinarea chiar a celulelor pe care le-ai secvențiat.
Asta e tot pentru acest episod. Mulțumesc că ai ascultat și continuă să construiești!
5
Selecția caracteristicilor și genele cu variabilitate ridicată
3m 45s
Examinăm conceptul de feature selection și de ce este necesar să identificăm genele cu variabilitate ridicată. Prin eliminarea zgomotului de fond (housekeeping noise), ne concentrăm analiza pe factorii biologici determinanți. Vei învăța cum să folosești Scanpy pentru a izola cele mai informative gene pentru etapele ulterioare.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 5 din 16. Din cele aproximativ 30.000 de gene din genomul uman, majoritatea se ocupă doar de întreținerea celulară de bază. Dacă încerci să le analizezi pe toate deodată, volumul uriaș de activitate de bază va acoperi biologia reală pe care o cauți. Pentru a găsi semnalul real, ai nevoie de Feature Selection și Highly Variable Genes.
Mai întâi, o scurtă distincție. Ai folosit deja o funcție de filtrare de bază pentru a elimina genele care sunt abia detectate în dataset-ul tău. Acest pas curăță zgomotul tehnic și acele empty droplets. Selecția de highly variable genes face ceva complet diferit. Ea presupune că genele rămase sunt reale, dar se întreabă care dintre ele sunt cu adevărat informative.
Gândește-te așa. Să cauți prin zeci de mii de gene pentru a le găsi pe cele care dictează diferențele dintre tipurile de celule înseamnă să elimini genele plictisitoare de housekeeping. O genă de housekeeping este activă în aproape fiecare celulă la aproximativ același nivel. Expresia ei este stabilă, ceea ce o face inutilă pentru a distinge o celulă T de o celulă B. Noi vrem gene care sunt puternic exprimate în unele celule și complet silențioase în altele. Acestea sunt highly variable genes. De obicei, vrei să îți restrângi dataset-ul la aproximativ două mii dintre acești factori cheie.
În Scanpy, gestionezi asta cu funcția highly variable genes. Dar nu poți pur și simplu să ordonezi genele după varianța brută. În datele de secvențiere, varianța scalează cu expresia medie. Dacă o genă este puternic exprimată peste tot, varianța ei brută va fi în mod natural mare, chiar dacă nu este interesantă din punct de vedere biologic. Algoritmul trebuie să decupleze varianța de expresia medie.
Face asta împărțind genele în bin-uri pe baza nivelurilor lor medii de expresie. Apoi, calculează o dispersie normalizată în cadrul fiecărui bin. Asta îți spune cât de mult variază o genă în comparație doar cu alte gene care sunt exprimate la niveluri de bază similare. Scanpy oferă diferite metode statistice pentru a face aceste calcule, numite flavors.
Flavor-ul tradițional Seurat se așteaptă ca datele tale să fie mai întâi log-normalizate. Calculează dispersia, împarte datele în bin-uri și standardizează valorile. Există, de asemenea, un flavor mai nou Seurat v3, care necesită în mod explicit date de tip count brute, fără logaritmare, pentru a modela corect varianța. Alternativ, flavor-ul CellRanger folosește o abordare ușor diferită pentru a calcula dispersia normalizată pe baza count-urilor. Flavor-ul pe care îl alegi dictează pur și simplu distribuția statistică specifică utilizată pentru a modela relația dintre medie și varianță.
Când rulezi această funcție, ea nu șterge restul datelor tale. În schimb, adaugă câteva coloane noi la array-ul tău de variable annotations. Cea mai importantă este o coloană booleană numită pur și simplu highly variable, care marchează true pentru primele două mii de gene și false pentru restul. Pașii viitori din pipeline-ul tău vor căuta automat acest flag și vor utiliza doar acele gene selectate pentru analiza downstream.
Iată ideea cheie. Feature selection nu este doar un truc computațional pentru a face codul tău să ruleze mai repede; este procesul deliberat de eliminare a zgomotului alb biologic, astfel încât adevăratele identități celulare să aibă loc să iasă la iveală.
Mersi că ai fost aici. Sper că ai învățat ceva nou.
6
Scoringul ciclului celular și regresia
3m 38s
Explorăm modul de gestionare a factorilor de confuzie prin evaluarea și eliminarea prin regresie a fazelor ciclului celular. Discutăm cum să calculăm scorurile S și G2M și să folosim regresia pentru a le elimina influența. Vei învăța cum să previi ca diviziunea celulară activă să-ți distrugă topologia de clustering.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 6 din 16. Algoritmul tău de clustering tocmai a împărțit celulele T identice în două grupuri distincte. Sunt exact același tip de celulă, dar algoritmul le-a separat pur și simplu pentru că un grup se divide activ, în timp ce celălalt este în repaus. Pentru a remedia acest lucru, folosim Cell-Cycle Scoring și Regression.
Heterogenitatea ciclului celular este o sursă masivă de varianță în datele single-cell. Dacă o ignori, genele cu expresie ridicată care conduc mitoza vor acoperi semnăturile genice subtile care definesc adevăratele tipuri de celule. Ajungi să ai clustere definite de o stare temporară, în loc de o identitate biologică reală. Pentru a rezolva asta, Scanpy oferă o funcție dedicată pentru a calcula un score pentru gene pe baza ciclului celular.
Îi pasezi acestei funcții dataset-ul tău single-cell, împreună cu două liste specifice de gene marker cunoscute. O listă conține gene care sunt active în timpul fazei S, faza de sinteză a ciclului celular. Cealaltă listă conține gene active în timpul fazei G2M, faza de mitoză. Funcția de scoring evaluează fiecare celulă în parte și calculează două metrici continue: un S-score și un G2M-score. Face asta uitându-se la cât de puternic sunt exprimate acele gene specifice fazei, în comparație cu nivelul de background expression al celulei. Pe baza acestor două scoruri, funcția atribuie și un label categoric de fază fiecărei celule în metadata ta, etichetând-o ca S, G2M sau G1 dacă niciunul dintre scoruri nu este deosebit de mare.
Acum că ai cuantificat acest efect, trebuie să îi elimini influența din dataset. Aici folosești funcția regress out. Instruiești regress out să se uite la coloanele S-score și G2M-score care tocmai au fost adăugate în metadata celulei. Algoritmul construiește apoi un model liniar pentru expresia fiecărei gene în toate celulele, folosind acele două scoruri ale ciclului celular ca variabile predictoare. Calculează reziduul, care este cantitatea exactă de expresie genică ce nu poate fi explicată de poziția celulei în ciclul celular. Această valoare reziduală devine noul nivel de expresie corectat din dataset-ul tău.
Iată ideea cheie. Oamenii confundă adesea regresia cu batch correction. Sunt concepte înrudite, dar sunt instrumente fundamental diferite. Metodele de batch correction sunt concepute pentru a alinia grupuri discrete, categorice, cum ar fi probele colectate în zile diferite sau secvențiate pe mașini diferite. Regress out este conceput special pentru variabile de confuzie continue. Îl folosești pentru gradienți numerici continui, cum ar fi aceste scoruri ale ciclului celular, total counts per cell sau procentul de gene mitocondriale. Modelează o pantă matematică și o aplatizează.
Odată ce rulezi acest pas de regresie, bias-ul biologic puternic al diviziunii celulare este eliminat matematic din expression matrix. Când rulezi din nou algoritmul de clustering pe aceste date corectate, acele celule T care se divid și celulele T în repaus se vor reuni într-un singur cluster coeziv. Algoritmul nu mai este distras de zgomotul replicării ADN-ului. Folosirea regress out pe scorurile ciclului celular asigură că analiza ta downstream face clustering pe celule strict după ceea ce sunt, în loc de ceea ce se întâmplă să facă în momentul în care au fost secvențiate.
Asta e tot pentru acest episod. Mulțumesc pentru ascultare și continuă să construiești!
7
Reducerea dimensionalității cu PCA
3m 47s
Acest episod explică Principal Component Analysis (PCA) în contextul datelor single-cell. Discutăm cum PCA reduce zgomotul din setul de date și de ce contează selectarea numărului corect de componente. Vei învăța cum să reduci mii de gene la o bază gestionabilă pentru algoritmi avansați.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 7 din 16. Mintea umană nu poate vizualiza două mii de dimensiuni. Mai rău, algoritmii complecși de clustering devin paralizați computațional de ele, împotmoliți de un amestec de semnal biologic real și zgomot tehnic aleator. Ai nevoie de o metodă prin care să extragi structura de bază a datelor tale înainte de a le analiza. Dimensionality reduction cu Principal Component Analysis este soluția pentru asta.
Înainte să intrăm în detalii, trebuie să clarificăm o confuzie frecventă. Lumea crede adesea că PCA este doar un scatter plot care arată PC1 versus PC2, gândit ca o vizualizare finală pentru ochiul uman. Nu este așa. Deși poți face un plot cu primele două componente, PCA este în esență o fundație matematică. Comprimă o matrice sparse și plină de zgomot într-un format dense, pentru a fi trimisă mai departe către tool-uri downstream, cum ar fi neighbor graphs.
Gândește-te la punctul tău de plecare. Tocmai ai izolat cam două mii de gene highly variable. Fiecare genă reprezintă o dimensiune independentă în dataset-ul tău. Rulezi funcția scanpy tools pca pentru a calcula componentele principale. Această funcție evaluează întregul tău dataset și comprimă acele două mii de dimensiuni ale genelor într-un set mult mai mic de dimensiuni sintetice, de obicei în jur de cincizeci.
Aceste dimensiuni sintetice sunt ordonate în funcție de câtă varianță explică. Prima componentă principală reprezintă axa cu cea mai puternică variație din celulele tale. A doua o reprezintă pe următoarea cea mai puternică, și tot așa. Aici e ideea cheie. Primele câteva componente captează diferențele biologice reale, structurate. Pe măsură ce cobori pe lista de componente, ele captează progresiv mai puțină biologie și mai mult zgomot tehnic aleator. Prin eliminarea părții de final a acestor componente, practic faci denoising pe matricea ta de date.
Pentru a evalua această reducere, trebuie să decizi câte componente să păstrezi. Folosești funcția scanpy plot pca variance ratio. Această comandă generează un line chart care arată fracția din varianța totală explicată de fiecare componentă în parte. Scanezi această linie căutând acel elbow point, locul unde scăderea abruptă se aplatizează brusc într-o coadă lungă.
Dacă curba se aplatizează la componenta cincisprezece, ai putea presupune că ai nevoie doar de cincisprezece componente. Totuși, în workflow-urile single-cell, supraestimăm intenționat numărul de componente principale. S-ar putea să vezi acel elbow la cincisprezece, dar să le spui funcțiilor downstream să folosească oricum cincizeci. Algoritmii de clustering downstream sunt foarte robuști. Pot ignora cu ușurință zgomotul tehnic minor conținut în componentele de la șaisprezece la cincizeci. Ce nu pot face, în schimb, este să recupereze semnalul biologic pe care l-ai aruncat prea devreme. Dacă componenta douăzeci și doi conține semnătura de varianță pentru un tip de celulă foarte rar, eliminarea ei înseamnă că acel tip de celulă dispare complet din analiza ta.
Calculezi componentele, verifici variance ratio pentru a confirma structura datelor și mergi mai departe. Cea mai importantă concluzie este că PCA nu este o poză la care să te uiți, ci un filtru matematic țintit care sacrifică adâncimea dimensională brută pentru a elimina zgomotul și a expune adevăratele axe biologice ale datelor tale.
Sper că a fost util. Mulțumesc că m-ai ascultat și îți doresc o zi frumoasă în continuare.
8
Graful Nearest Neighbor și UMAP
3m 52s
Detaliem nucleul absolut al topologiei moderne single-cell: graful nearest neighbor. Apoi explicăm cum UMAP traduce această rețea complexă într-un grafic 2D ușor de citit. Vei învăța de ce graful vecinilor este o condiție prealabilă pentru aproape orice instrument avansat din Scanpy.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 8 din 16. Secretul analizei single-cell moderne nu este doar să plotezi puncte pe o grilă. Ci să înțelegi exact care celule sunt vecine într-un spațiu masiv, high-dimensional. Dacă greșești structura de bază, fiecare vizualizare care urmează te va induce în eroare. Mecanismul pentru a capta această structură este graful de nearest neighbors, iar astăzi ne uităm la cum să îl construim și să îl proiectăm folosind UMAP.
În această etapă dintr-un pipeline tipic, ai rulat deja Principal Component Analysis. Ai condensat mii de gene la poate patruzeci sau cincizeci de componente principale. Dar cincizeci de dimensiuni sunt încă imposibil de vizualizat și nu ne spun explicit care celule aparțin aceleiași comunități locale. Avem nevoie să construim o rețea de conexiuni. În Scanpy, faci asta folosind funcția sc dot pp dot neighbors. Acest pas calculează neighborhood graph-ul celulelor tale.
Să calculezi distanțele dintre zeci de mii de celule pe treizeci de mii de gene raw este brutal din punct de vedere computațional și foarte susceptibil la noise. Calculând în schimb vecinii pe componentele principale, matematica este rapidă, iar noise-ul tehnic este deja eliminat. Pentru fiecare celulă în parte, algoritmul se uită la coordonatele ei pe acele componente principale și îi găsește cei mai apropiați vecini. By default, leagă o celulă de cei cincisprezece nearest neighbors ai săi. Output-ul este o rețea matematică în care celulele sunt noduri, iar muchiile dintre ele reprezintă o similaritate ridicată. Acest neighborhood graph devine structura de date fundamentală pentru task-urile downstream.
Odată ce ai această rețea, vrei să te și uiți la ea. Aici intervine UMAP, apelat via sc dot tl dot umap. Iată ideea cheie. O concepție greșită foarte comună este că UMAP calculează distanțele direct din datele tale raw de expresie genică. Nu face asta. UMAP este complet orb la genele tale. Este pur și simplu un layout engine. Singurul său job este să ia acel graf de nearest neighbors precalculat și să-l aplatizeze într-un spațiu bidimensional.
UMAP funcționează prin optimizarea unui layout pentru a se potrivi cu graful. Trage vecinii conectați mai aproape unii de alții, în timp ce împinge celulele deconectate mai departe. Pentru că se bazează în întregime pe conexiunile locale definite în pasul anterior, este excepțional de bun la păstrarea structurii locale. Dacă un grup de celule era strâns conectat în graful high-dimensional, acestea vor forma o insulă distinctă și compactă pe plot-ul tău UMAP 2D. Dar ține cont că spațiul gol dintre insulele separate de pe un plot UMAP înseamnă foarte puțin. UMAP sacrifică acuratețea spațială globală pentru a se asigura că vecinii locali rămân lipiți între ei.
Această separation of concerns este vitală. Forma pe care o vezi pe un UMAP este complet dictată de graful de vecini construit chiar înainte. Dacă vrei să schimbi cât de sensibil este layout-ul tău la tipurile rare de celule, nu faci tuning la UMAP. Te întorci și ajustezi numărul de vecini în construcția grafului în sine.
Dacă găsești aceste episoade utile și vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Îți mulțumesc că ai ascultat și continuă să construiești!
9
Clustering cu Leiden
4m 23s
Explorăm cum să găsim populații discrete de celule folosind algoritmul de clustering Leiden. Prin optimizarea modularității pe graful vecinătăților, Leiden izolează comunități puternic conectate. Vei învăța cum să ajustezi parametrul de rezoluție pentru a găsi grupuri stabile, relevante din punct de vedere biologic.
Salut, sunt Alex de la DEV STORIES DOT EU. Analiza single-cell cu Scanpy, episodul 9 din 16. Algoritmii tradiționali de clustering presupun că datele tale există sub forma unor bule perfect rotunde, organizate în jurul unui punct central. Dar datele biologice reale sunt dezordonate, interconectate și creează forme complexe, continue. Când încerci să forțezi aceste structuri complexe în sfere simple, ajungi să împarți tipuri individuale de celule în fragmente artificiale. Clustering-ul cu Leiden rezolvă asta uitându-se la modul în care celulele se conectează între ele, nu doar la locul în care se află într-un spațiu abstract.
Oamenii se gândesc adesea la clustering ca la K-means, unde definești un punct central și grupezi tot ce e în apropiere folosind distanțe fizice standard. Leiden nu funcționează așa. Este un algoritm de clustering bazat pe grafuri. Ignoră complet distanțele euclidiene față de un centroid. În schimb, se bazează în întregime pe densitatea de edges din neighbor graph-ul pe care l-ai construit mai devreme în analiza ta.
Gândește-te la acest neighbor graph ca la o rețea socială masivă. Celulele sunt indivizii, iar acele edges dintre ele sunt prieteniile. Leiden face ceea ce se numește community detection. Caută grupuri de celule care au un număr foarte mare de conexiuni în interiorul grupului lor, dar foarte puține conexiuni cu rețeaua din exterior.
Pentru a obține asta, algoritmul optimizează o metrică numită modularity. Modularity măsoară densitatea legăturilor din interiorul comunităților, în comparație cu legăturile la care te-ai aștepta dacă rețeaua ar fi complet aleatoare. Algoritmul începe prin a atribui fiecare celulă propriei sale comunități. Apoi, unește iterativ aceste comunități, mutând acele nodes înainte și înapoi, verificând constant dacă noua grupare crește scorul general de modularity. Leiden este special conceput pentru a rafina cu atenție aceste partiții, garantând că acele comunități finale sunt dens conectate intern și nu suferă de fragmente deconectate, o problemă cunoscută a vechiului algoritm Louvain.
În Scanpy, rulezi asta folosind funcția Leiden. Îi pasezi obiectul tău principal de date, iar ea operează direct pe neighbor graph-ul existent. Output-ul este o nouă coloană categorială adăugată la datele tale, care conține un număr de cluster pentru fiecare celulă în parte.
Aici e ideea principală. Cel mai important control pe care îl ai asupra întregului proces este parametrul resolution. Acest parametru acționează ca un buton rotativ care dictează cât de agresiv împarte algoritmul grupurile. By default, Scanpy folosește un resolution de unu. Dacă crești valoarea pentru resolution, obții mai multe clustere. Algoritmul devine foarte sensibil, împărțind graful în subpopulații mai mici și foarte specifice. Dacă scazi valoarea pentru resolution, obții mai puține clustere. Algoritmul devine mai tolerant, grupând laolaltă porțiuni mai mari din graf.
Să presupunem că rulezi Leiden și te uiți la harta rezultată. S-ar putea să observi că un singur tip de celulă biologică cunoscut a fost împărțit în cinci subpopulații minuscule, suprafragmentate. Algoritmul a găsit mici diferențe, dar din punct de vedere biologic, acele cinci grupuri aparțin împreună ca o singură stare celulară distinctă. Pentru a repara asta, pur și simplu rulezi din nou funcția Leiden, dar de data asta îi pasezi explicit un număr mai mic argumentului resolution. Scăzând acel resolution, instruiești algoritmul să-și relaxeze criteriile. Acele cinci fragmente minuscule se vor uni la loc într-un singur cluster solid, relevant din punct de vedere biologic.
Valoarea exactă pentru resolution de care ai nevoie nu este niciodată un adevăr matematic fix; este un buton reglabil pe care îl rotești până când acele comunități statistice din graf reflectă cu exactitate realitățile biologice ale țesutului tău.
Mersi că ai stat cu noi. Sper că ai învățat ceva nou.
10
Descoperirea genelor marker
5m 02s
Aprofundăm descoperirea genelor marker și testarea expresiei diferențiale. Explicăm cum testele statistice identifică semnăturile transcriptomice unice ale cluster-elor tale. Vei învăța cum să faci tranziția de la cluster-e anonime numerotate la tipuri de celule biologice etichetate cu încredere.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 10 din 16. Ai izolat un cluster compact și distinct de celule în dataset-ul tău, dar cum știi dacă este o celulă T, o celulă B sau o stare complet necunoscută? Matematica le-a grupat împreună, dar biologia trebuie să-ți spună ce sunt. Acest pas de traducere se bazează în întregime pe descoperirea genelor marker.
Înainte să ne uităm la tool-uri, trebuie să tragem o linie clară între clustering și adnotare. Algoritmii de clustering pur și simplu grupează celulele pe baza similarității statistice pe mii de dimensiuni și le atribuie un label arbitrar, cum ar fi Cluster 0 sau Cluster 1. Acel număr nu înseamnă nimic din punct de vedere biologic. Descoperirea genelor marker este procesul prin care găsești genele specifice care determină acea grupare statistică, permițându-ți să atribui nume biologice reale acelor clustere.
În Scanpy, găsești aceste gene determinante folosind o funcție numită rank genes groups. Această funcție face o analiză de expresie diferențială. Ea ia o grupare categorică, de obicei clusterele tale calculate, și compară expresia genelor din celulele unui cluster cu celulele din toate celelalte clustere combinate. Scopul este să găsești gene care sunt puternic exprimate în clusterul tău target, dar în mare parte silențioase peste tot în rest. By default, compară fiecare cluster cu uniunea restului de celule, dar o poți configura și să compare un cluster cu un grup de referință specific, dacă cauți diferențe subtile între două tipuri de celule foarte înrudite.
Pentru a decide dacă o genă este cu adevărat un marker, Scanpy rulează un test statistic ca să dea un scor diferenței de expresie. Poți alege un t-test standard, dar testul Wilcoxon rank-sum este foarte recomandat și este alegerea standard pentru datele single-cell. Expresia genelor single-cell nu urmează o curbă normală în formă de clopot; este foarte variabilă, puternic asimetrică și plină de valori zero, unde o genă pur și simplu nu a fost detectată. Testul Wilcoxon nu presupune o distribuție normală. În loc să se uite la valorile medii brute, el face un ranking al valorilor de expresie în toate celulele și compară rangurile între clusterul tău target și restul dataset-ului. Asta îl face mult mai robust la outlieri extremi.
Hai să ne uităm la un scenariu specific. Ai un dataset cu mai multe clustere și vrei să interoghezi Cluster 3. Apelezi funcția rank genes groups, îi spui să folosească label-urile tale de cluster existente și setezi metoda pe Wilcoxon. Scanpy procesează numerele și face un ranking pentru fiecare genă în parte, în funcție de cât de unic definește Cluster 3. Apoi inspectezi rezultatele de top. Vezi că genele cu cel mai mare rank sunt CD8A și GZMK. Dacă îți știi imunologia, recunoști imediat că aceștia sunt markeri clasici pentru celulele T citotoxice. Pentru că aceste gene specifice sunt upregulated în mod unic aici, comparativ cu restul dataset-ului, poți pune cu încredere label-ul de celulă T CD8 pozitivă pe Cluster 3.
Output-ul acestei funcții este stocat discret în obiectul tău AnnData, sub atributul uns. Scanpy salvează simultan array-uri cu nume de gene, scoruri statistice, p-value-uri și log-fold changes pentru fiecare cluster în parte. Poți extrage aceste array-uri ca să construiești dataframe-uri, să le salvezi într-un fișier csv sau să le pasezi direct către tool-urile de adnotare downstream.
Aici e insight-ul cheie. Expresia diferențială transformă formele matematice arbitrare în identități biologice acționabile. Fără gene marker, ai doar o hartă de numere; cu ele, ai un sistem biologic cartografiat.
Asta e tot pentru acest episod. Mersi că m-ai ascultat și continuă să construiești!
11
Integrarea datelor cu Ingest
3m 56s
Acest episod acoperă integrarea datelor folosind instrumentul Ingest. Explicăm cum să proiectezi noi seturi de date în spațiul PCA și UMAP al unui atlas de referință pre-adnotat. Vei învăța o metodă rapidă și invariantă pentru maparea etichetelor între diferite experimente.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 11 din 16. Ai un reference dataset perfect adnotat și un sample de pacient complet nou pe care trebuie să-l analizezi. În mod normal, combinarea lor înseamnă să rulezi un batch correction, să recalculezi componentele principale și să aștepți să se randeze de la zero un joint UMAP masiv. Integrarea datelor cu Ingest oferă o alternativă mai rapidă și non-distructivă.
Oamenii confundă adesea ingest cu un batch correction standard. Tool-urile tradiționale de batch correction iau mai multe dataset-uri și calculează un joint model complet nou. Ele modifică reprezentarea de bază a datelor tale de referință pentru a forța o aliniere. Ingest face exact opusul. Este o proiecție asimetrică. Dataset-ul tău de referință acționează ca un ground truth absolut. Modelul spațial este blocat pe poziție, iar datele noi sunt pur și simplu trecute prin el, fără a modifica deloc modelul original.
Ia un atlas de referință Peripheral Blood Mononuclear Cell frumos adnotat. Fiecare cluster este verificat și etichetat. Tocmai ai primit un sample de pacient neadnotat și dezordonat. Vrei să aplici acele etichete din atlas pe noul tău sample și vrei să plotezi noile celule în exact același spațiu de coordonate ca referința.
Pentru ca asta să funcționeze, variabilele din cele două dataset-uri trebuie să se alinieze. Asta înseamnă că ambele dataset-uri trebuie să împartă exact aceleași gene. În practică, îți filtrezi noul query dataset astfel încât genele sale să se potrivească cu genele foarte variabile deja identificate în atlasul tău de referință.
Dataset-ul tău de referință trebuie să fie complet procesat înainte să începi. Are nevoie de un Principal Component Analysis existent, un neighborhood graph calculat și o reprezentare UMAP. De asemenea, conține etichetele categorice pe care vrei să le transferi, stocate în observation metadata.
Execuția se face printr-o singură comandă. Apelezi funcția ingest, pasându-i noul tău query dataset, dataset-ul de referință adnotat și coloana specifică de observație pe care vrei să o mapezi, cum ar fi eticheta de cell type.
Aici este ideea cheie. Când declanșezi funcția, ingest ia profilurile de expresie ale noilor tale celule și le proiectează matematic în spațiul de principal components existent al atlasului de referință. Sare complet peste calcularea unui nou global principal component analysis.
Odată ce query cells ajung în acel layout spațial comun, algoritmul caută nearest neighbors. Mapează query cells direct pe neighbor graph-ul preexistent al dataset-ului de referință. Greul computațional de a construi un graf a fost deja făcut de modelul de referință.
Pentru că noile celule au acum vecini stabiliți în datele de referință, au loc două transferuri finale. În primul rând, coordonatele UMAP de la vecinii de referință sunt atribuite noilor celule. În al doilea rând, etichetele de metadata, cum ar fi cell types, sunt copiate pe baza unui majority voting de la acei vecini de referință cei mai apropiați.
Rezultatul este un query dataset care poartă exact layout-ul UMAP și adnotările de cell type ale atlasului tău. Poți suprapune sample-ul de pacient anterior neadnotat direct peste vizualizarea ta de referință, iar populațiile biologice care se potrivesc vor pica perfect în clusterele vizuale stabilite.
Prin proiectarea de noi celule pe un model existent, ingest îți schimbă workflow-ul de la a reconstrui constant spații globale fragile, la a construi un singur atlas de referință robust și a trece fluid toate experimentele viitoare prin el.
Asta e tot pentru acest episod. Mulțumesc pentru audiție și spor la construit!
12
Vizualizarea tiparelor de expresie
3m 37s
Explorăm tehnici avansate de vizualizare pentru evaluarea expresiei genice la nivelul cluster-elor. Ne concentrăm pe dot plots și matrix plots, detaliind modul în care acestea codifică atât intensitatea expresiei, cât și raritatea (sparsity). Vei învăța cum să validezi vizual, dintr-o privire, adnotările tipurilor tale de celule.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 12 din 16. Un feature plot standard este excelent pentru a arăta unde este activă o anumită genă, dar devine complet inutil atunci când trebuie să compari simultan douăzeci de gene diferite din zece clustere distincte. Pentru a rezolva asta, ne uităm la Visualizing Expression Patterns. Atunci când verifici gene marker, instinctul tău este adesea să apelezi la un heatmap. Îți aliniezi toate celulele, îți aliniezi genele și cauți blocuri de culoare. Dar datele de single-cell RNA sequencing sunt recunoscute ca fiind sparse. Majoritatea celulelor au zero counts pentru majoritatea genelor. Într-un heatmap single-cell standard, această sparsity creează zgomot vizual. Ajungi să te uiți la o mare de culoare de background, încercând să ghicești dacă o genă este de fapt un marker specific pentru un cluster sau dacă este doar un dropout aleatoriu peste tot în altă parte. Aici intervine dot plot-ul. În loc să plotezi celule individuale, un dot plot le agregă. Îți plasezi grupurile de celule, cum ar fi clusterele Leiden, pe o axă, și genele de interes pe cealaltă. La fiecare intersecție, obții un cerc. Iată ideea cheie. Un dot plot codifică două informații complet diferite în acel singur cerc. În primul rând, culoarea punctului reprezintă nivelul de mean expression al genei în acele celule. Culorile mai închise sau mai intense înseamnă o expresie mai mare. În al doilea rând, dimensiunea punctului reprezintă fracția de celule din acel cluster care chiar exprimă gena. Un punct mare înseamnă că aproape fiecare celulă din cluster are cel puțin niște ARN pentru acea genă. Un punct mic înseamnă că doar câteva celule o exprimă. Această codificare duală este incredibil de puternică pentru date sparse. Separă cât de mult dintr-o genă este prezent de cât de larg este distribuită. Să zicem că te uiți la cincisprezece gene marker candidate în cinci clustere Leiden. Pasezi datele, lista de gene și cluster labels în funcția dot plot. Poți vedea instantaneu dacă markerii tăi de monocite așteptați sunt atât highly expressed, cât și widely expressed în Clusterul unu, în timp ce sunt complet absenți în celelalte patru clustere. Nu trebuie să te chiorăști la rânduri individuale de celule. Punctele mari și închise la culoare din rândul Clusterului unu îți oferă validare imediată. Uneori, nu ai nevoie de informațiile de frecvență oferite de dimensiunea punctului. Vrei doar un grid curat care să arate expresia medie. Pentru asta, Scanpy oferă funcția matrix plot. Gândește-te la un matrix plot ca la un heatmap grupat. Îți agregă în continuare celulele pe cluster, dar umple întregul pătrat din grid cu culoarea care reprezintă valoarea de mean expression. Nu există dimensiuni de puncte care se schimbă. Este o modalitate mai rapidă și mai densă de a verifica pattern-uri largi de expresie atunci când ai o listă masivă de gene, iar fracția de celule care le exprimă contează mai puțin pentru tine. Ambele tool-uri preiau data object-ul tău, o listă cu target genes și categoria de metadata după care vrei să grupezi. Se execută rapid și se scalează perfect la zeci de gene. Când ai de-a face cu sparsity-ul din single-cell, separarea intensității expresiei de frecvența expresiei este cea mai sigură modalitate de a confirma că o genă marker definește cu adevărat un cluster. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
13
Explorarea manifold-urilor cu Diffusion Maps
4m 20s
Introducem Diffusion Maps, o tehnică puternică de embedding pentru date biologice continue. O comparăm cu UMAP, explicând de ce difuzia este mai potrivită pentru analiza diferențierii celulare. Vei învăța cum să vizualizezi tranzițiile continue și procesele de dezvoltare.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 13 din 16. UMAP este fantastic pentru separarea tipurilor distincte de celule, dar poate rupe violent procesele biologice continue. Când studiezi dezvoltarea celulară, nu vrei insule disjuncte de celule; trebuie să vezi continuumul lin al schimbărilor de stare. Explorarea manifold-urilor cu Diffusion Maps rezolvă exact această problemă.
În Scanpy, calculezi asta folosind tool-ul diffmap. Utilizatorii aleg adesea UMAP ca default pentru orice dimensionality reduction. Înțelege că UMAP este o tehnică de embedding optimizată pentru găsirea de clustere distincte și păstrarea vecinătăților locale. Diffusion maps sunt fundamental diferite. Ele păstrează probabilitatea matematică continuă de tranziție între stări. Asta le face alegerea ideală pentru analiza proceselor continue, cum ar fi diferențierea celulară.
Algoritmul diffmap tratează manifold-ul tău de date ca pe o rețea continuă. Se bazează în întregime pe nearest neighbor graph-ul celulelor tale. Odată ce graful este stabilit, algoritmul simulează un random walk prin conexiuni. Gândește-te la asta ca la modelarea unui proces de difuzie, similar cu modul în care căldura se răspândește printr-un material fizic. Algoritmul evaluează cât de ușor poate călători un semnal prin regiunile dense ale datelor tale. Calculează probabilitatea trecerii de la o stare celulară la alta pe parcursul unui număr specific de pași. Celulele care au o probabilitate mare de tranziție sunt plasate mai aproape una de alta în spațiul final cu dimensionalitate redusă.
Imaginează-ți trasarea unei celule stem hematopoietice care se diferențiază într-un eritrocit. Dacă proiectezi aceste date folosind un embedding care favorizează separarea discretă, celulele progenitoare intermediare sunt adesea forțate în clustere artificiale, separate. Matematica din spate fracturează cronologia biologică. Dacă rulezi în schimb diffmap, algoritmul calculează probabilitățile de tranziție de-a lungul întregii căi de dezvoltare. Rezultatul este o traiectorie lină și continuă. Celula stem se află la un capăt, iar eritrocitul matur la celălalt. Fiecare stare intermediară este plotată de-a lungul unei căi conectate, bazată strict pe probabilitatea tranziției de stare. Nu te uiți la snapshot-uri izolate ale unor tipuri distincte de celule. Te uiți la un eveniment biologic fluid.
Aplicarea acestui proces în Scanpy urmează o secvență strictă. Mai întâi, trebuie să calculezi neighborhood graph-ul în obiectul tău. Diffusion map-ul nu poate rula fără acele conexiuni neighbor precalculate. Apoi, apelezi tool-ul diffmap și îi pasezi obiectul tău AnnData. Opțional, poți specifica numărul de componente pe care vrei să le calculezi, ceea ce setează dimensiunile output-ului. Scanpy calculează diffusion map-ul și stochează noile coordonate în atributul de observații multidimensionale al obiectului tău, sub cheia X diffmap.
Tool-ul stochează, de asemenea, valorile proprii în atributul de date nestructurate. Aceste valori îți spun câtă varianță capturează fiecare componentă de difuzie. O scădere bruscă a acestor valori proprii indică faptul că ai captat cele mai importante tranziții biologice, iar componentele ulterioare sunt probabil noise. Într-un dataset de diferențiere tipic, prima componentă de difuzie non-trivială se aliniază direct cu axa temporală de dezvoltare primară.
Iată ideea cheie. Într-un diffusion map, distanța fizică dintre două celule de pe plot nu este doar o măsură generică a similarității transcriptomice. Această distanță reprezintă în mod explicit probabilitatea matematică a unei tranziții biologice între acele două stări specifice.
Asta e tot pentru acest episod. Ne auzim data viitoare!
14
Grafuri abstractizate cu PAGA
3m 32s
Acest episod acoperă Partition-based Graph Abstraction, sau PAGA. Discutăm cum să măsurăm conectivitatea reală dintre cluster-e pentru a păstra topologia globală. Vei învăța cum să folosești PAGA pentru a descoperi adevăratele relații de descendență ascunse în datele tale.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 14 din 16. Doar pentru că două clustere de celule stau unul lângă altul pe un plot UMAP nu înseamnă că sunt înrudite biologic. Proximitatea vizuală în două dimensiuni este adesea o iluzie matematică și, dacă te bazezi pe ea ca să desenezi traiectorii de dezvoltare, s-ar putea să conectezi puncte care nu se ating de fapt în spațiul high-dimensional. Pentru a cartografia conectivitatea reală, susținută statistic, ai nevoie de Abstracted Graphs cu PAGA.
PAGA vine de la Partition-based Graph Abstraction. Trebuie să clarificăm imediat o confuzie frecventă. PAGA nu este un embedding de dimensionality reduction precum t-SNE sau UMAP. Nu calculează coordonate pentru celulele individuale ca să deseneze un scatter plot. În schimb, PAGA creează un graf simplificat, coarse-grained. Nodurile din acest graf sunt clustere întregi, sau partiții, de celule. Muchiile care conectează aceste noduri reprezintă încrederea statistică că acele clustere împart o graniță continuă.
Când apelezi funcția PAGA pe datele tale adnotate, îi indici un set specific de etichete de grup, de obicei clusterele tale Leiden sau Louvain. Algoritmul evaluează apoi granițele dintre aceste grupuri analizând neighborhood graph-ul single-cell de la bază. Se uită la celulele individuale din clusterul A și numără câți dintre vecinii lor direcți aparțin clusterului B. Adunând toate aceste conexiuni cross-cluster și comparându-le cu un model random, PAGA generează o matrice de conectivitate cuantificabilă. O valoare mare înseamnă că clusterele sunt profund întrepătrunse, sugerând o tranziție biologică. O valoare mică înseamnă că sunt insule separate.
Ia în considerare un scenariu concret. Urmărești dezvoltarea celulelor imunitare și trebuie să demonstrezi că un anumit cluster progenitor dă naștere direct unui cluster de celule T efectoare. Pe un plot vizual standard, algoritmul de layout ar putea arunca un cluster complet fără legătură fix între ele, făcând relația lor să pară indirectă. Examinând matricea de conectivitate PAGA, ocolești această distorsiune vizuală. Te uiți direct la edge weight-ul matematic dintre grupurile tale de progenitori și efectoare. PAGA îți permite să setezi un threshold minim de conectivitate. Când aplici acest threshold, filtrezi conexiunile false, cu confidence scăzut. Dacă edge-ul puternic dintre cele două clustere target supraviețuiește tăierii, ai stabilit o legătură robustă statistic.
Asta e partea care contează. PAGA nu stă pur și simplu alături de embedding-urile tale; le poate repara. Pentru că PAGA păstrează topologia globală atât de fiabil, poți folosi graful abstractizat pentru a inițializa un embedding UMAP. În loc să lași UMAP să pornească de la un layout spațial random, îi spui să poziționeze celulele individuale pe baza grafului PAGA coarse-grained. Acest lucru ancorează vizualizarea ta bidimensională finală la adevărata realitate high-dimensional, asigurându-te că stările biologice îndepărtate nu sunt presate artificial la un loc.
Vizualizările vor distorsiona mereu datele complexe pentru a le potrivi pe un ecran plat, dar abstractizarea unui neighborhood graph se bazează în întregime pe proximitatea matematică. Ai încredere în graf mai mult decât în imagine.
Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
15
Deducerea traiectoriilor cu DPT
3m 46s
Explorăm deducerea traiectoriilor folosind Diffusion Pseudotime (DPT). Explicăm cum să desemnezi o celulă rădăcină și să calculezi distanțele geodezice pe graful celular. Vei învăța cum să aranjezi celulele de-a lungul unei axe cronologice continue de dezvoltare.
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 15 din 16. Secvențierea single-cell distruge chiar celula pe care încerci să o studiezi. Obții un snapshot static al expresiei genelor sale, ceea ce înseamnă că nu poți înregistra un video cu o celulă stem care se diferențiază într-o stare matură. Pentru a vedea acest parcurs de dezvoltare, trebuie să deduci matematic un timeline, calculând distanțele transcriptomice. Exact asta facem folosind Trajectory Inference cu DPT.
DPT vine de la Diffusion Pseudotime. Înainte să ne uităm la cum funcționează algoritmul, trebuie să clarificăm ce înseamnă de fapt acest nume. Pseudotime nu este timpul cronologic real. Nu măsoară ore, zile sau vârsta biologică a unei celule. Este strict o metrică a distanței transcriptomice. Măsoară câte schimbări incrementale de expresie a suferit o celulă în raport cu un punct de pornire specific.
Pentru a rula asta în Scanpy, folosești funcția numită sc punct tl punct dpt. Această funcție operează pe neighborhood graph-ul existent din dataset-ul tău, care conectează celulele pe baza similarității lor. Totuși, un graf singur nu are o direcție inerentă. Pentru a-i da o direcție, trebuie să definești un punct de pornire. Faci asta setând o celulă root.
Ia în considerare un scenariu în care studiezi dezvoltarea sângelui. Îți examinezi cluster-ele și identifici celulele stem hematopoietice naive. Alegi un index de celulă specific din acel grup și îl atribui ca root în structura dataset-ului tău. Acesta acționează ca punct de origine, sau timpul zero, pentru întregul calcul.
Odată ce root-ul este stabilit, execuți funcția DPT. Aici e ideea cheie. Algoritmul nu măsoară o distanță liniară, dreaptă, între root și o altă celulă. Dezvoltarea biologică nu este o linie dreaptă; urmează căi complexe, ramificate. Pentru a capta asta, DPT calculează distanțele geodezice de-a lungul neighborhood graph-ului tău. Evaluează structura datelor simulând random walks de la root. Pășește din celulă în celulă peste edge-urile dense ale grafului, găsind cele mai probabile căi de schimbare transcriptomică.
Rezultatul acestui calcul este un nou array de valori adăugat la adnotările celulelor tale. Fiecare celulă din dataset-ul tău primește un scor pseudotime. Celula root se află la zero. Pe măsură ce distanța geodezică față de root crește, scorul crește. În scenariul nostru de dezvoltare a sângelui, o celulă progenitoare intermediară ar putea obține un scor de zero virgulă patru, în timp ce o celulă complet matură la capătul terminal al unui branch obține un scor apropiat de unu.
Ai mapat efectiv un cluster static de puncte într-o ordine continuă de dezvoltare, sortându-le de la cel mai puțin la cel mai mult diferențiate. Acum poți folosi această axă numerică pentru a urmări dinamica genelor individuale, plotând exact când se activează un factor de transcripție specific de-a lungul parcursului de dezvoltare.
Fiabilitatea Trajectory Inference-ului tău depinde în întregime de punctul de pornire, ceea ce înseamnă că un root ales incorect va produce un timeline perfect calculat, dar lipsit de sens biologic.
Dacă găsești aceste episoade utile și vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
16
Scalare experimentală cu Dask
3m 38s
În ultimul nostru episod, privim spre frontiera experimentală a Scanpy: scalarea cu Dask. Explicăm cum să gestionezi seturile de date care depășesc memoria RAM a mașinii tale folosind lazy evaluation și procesarea out-of-core. Îți mulțumim că ni te-ai alăturat în această explorare aprofundată a Scanpy!
Salut, sunt Alex de la DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodul 16 din 16. Ce se întâmplă când acel dataset single-cell atinge cinci milioane de celule și îți epuizează complet memoria computerului? Nu îl poți filtra, nu îl poți normaliza, iar kernelul tău pur și simplu dă crash. Soluția la această limită hard de memorie este scale-up experimental cu Dask.
Lumea aude adesea de Dask și se gândește imediat la procesare paralelă pe un cluster distribuit pentru a accelera codul. Deși Dask poate face asta, principala sa superputere în Scanpy în acest moment este memory management-ul out-of-core prin lazy evaluation. Nu e vorba doar de a face lucrurile mai rapid. E vorba de a face lucruri care înainte erau imposibile pe o singură mașină.
Workflow-urile standard din Scanpy se bazează pe array-uri in-memory. Asta necesită ca întregul dataset să stea în memoria ta RAM activă. Când folosești backend-ul Dask, Scanpy înlocuiește aceste array-uri standard din interiorul obiectului tău AnnData cu array-uri Dask. Un array Dask este în esență o colecție de mai multe array-uri mai mici, numite chunk-uri. În loc să încarce toată matricea în memorie dintr-o dată, Dask lasă cea mai mare parte a datelor în siguranță pe disk.
Când rulezi o funcție de preprocessing din Scanpy susținută de Dask, aceasta nu calculează rezultatul imediat. Aici intervine lazy evaluation. În loc să calculeze numere, Dask construiește o rețetă. Creează un task graph care subliniază exact ce operații matematice trebuie efectuate pe fiecare chunk individual de date.
Ia în considerare un scenariu în care ai un dataset masiv de două milioane de celule pe disk și trebuie să calculezi metricile de quality control. Dacă încerci asta cu un array standard, sistemul tău va îngheța în timp ce încearcă să tragă totul în RAM. Dar dacă obiectul tău AnnData conține un array Dask, pur și simplu apelezi funcția standard de quality control din Scanpy. Funcția returnează aproape instantaneu. Memoria ta nu are spike-uri, deoarece niciun număr nu a fost procesat încă. Scanpy doar ți-a notat intenția.
Când ești în sfârșit gata să faci plot la acele metrici sau să salvezi statisticile, îi spui explicit lui Dask să dea compute la rezultat. Asta e partea care contează. Exact în acest moment, Dask trage primul chunk de date de pe hard drive-ul tău, calculează metricile doar pentru acel chunk, stochează rezultatul mic, și apoi aruncă imediat acel chunk de date brute din memorie. Apoi trece la următorul chunk. Amprenta ta de memorie activă rămâne minusculă. Este dictată în întregime de dimensiunea unui singur chunk, nu de milioanele de celule din întregul dataset.
În acest moment, acest backend Dask din Scanpy este categorisit ca experimental. Nu toate funcțiile din ecosistem îl suportă încă. Totuși, pașii core de preprocessing, cum ar fi normalizarea, scalarea și selecția de highly variable genes, sunt complet echipați pentru a gestiona operațiuni masive out-of-core.
Când treci de la eager processing in-memory la lazy processing pe disk, dimensiunea datasetului tău nu mai este limitată de memoria RAM a hardware-ului tău, ci doar de răbdarea ta.
Asta ne aduce la sfârșitul seriei noastre despre single-cell. Te încurajez cu tărie să explorezi documentația oficială Scanpy și să încerci să construiești aceste data graphs hands-on. Dacă ai idei despre ce tehnologii ar trebui să acoperim în următoarea noastră serie, vizitează devstories dot eu și spune-ne. Mersi pentru audiție, happy coding tuturor!
Tap to start playing
Browsers block autoplay
Share this episode
Episode
—
Copy this episode in another language:
Acest site nu folosește cookie-uri. Furnizorul nostru de hosting ar putea înregistra adresa ta IP în scopuri de analiză. Află mai multe.