Wróć do katalogu
Season 21 16 Odcinki 1h 3m 2026

Scanpy Single-Cell Analysis

Wersja 1.11 — Edycja 2026. Kompleksowy przewodnik po analizie single-cell przy użyciu Scanpy (v1.11 - 2026). Dowiedz się, jak wstępnie przetwarzać, wizualizować, klastrować i wnioskować o trajektoriach dla skalowalnych danych ekspresji genów na poziomie pojedynczych komórek.

Obliczenia naukowe Analiza pojedynczych komórek Bioinformatyka
Scanpy Single-Cell Analysis
Teraz odtwarzane
Click play to start
0:00
0:00
1
Tożsamość Scanpy i AnnData
Odkryj podstawowe idee stojące za Scanpy i dowiedz się, dlaczego został stworzony do skalowalnej analizy single-cell. Omawiamy obiekt AnnData, główną strukturę danych, która utrzymuje macierze, adnotacje i osadzenia (embeddings) w idealnym porządku. Poznasz model mentalny niezbędny do poruszania się po ekosystemie Scanpy.
4m 33s
2
Metryki kontroli jakości
Omawiamy, jak przeprowadzić wstępną kontrolę jakości danych single-cell przy użyciu Scanpy. Izolując specyficzne populacje genów, takie jak mitochondrialne RNA, możemy zidentyfikować zestresowane lub obumierające komórki. Dowiedz się, jak obliczać i interpretować te kluczowe metryki QC.
3m 45s
3
Filtrowanie i normalizacja
Ten odcinek obejmuje kluczowe kroki filtrowania i normalizacji macierzy ekspresji single-cell. Wyjaśniamy, jak odrzucać dane niskiej jakości i stosować skalowanie głębokości zliczeń za pomocą transformacji log1p. Dowiesz się, jak sprawić, by komórki o różnej głębokości sekwencjonowania były bezpośrednio porównywalne.
4m 16s
4
Wykrywanie dubletów za pomocą Scrublet
Zagłębiamy się w wykrywanie dubletów, kluczowy krok w wychwytywaniu technicznych artefaktów w mikroprzepływowym sekwencjonowaniu single-cell. Wyjaśniamy, jak Scrublet symuluje sztuczne dublety, aby oflagować podejrzane komórki. Dowiesz się, jak identyfikować i usuwać te sztuczne kombinacje ze swojego zbioru danych.
3m 53s
5
Selekcja cech i geny o wysokiej zmienności
Analizujemy koncepcję selekcji cech i powody, dla których identyfikacja genów o wysokiej zmienności jest niezbędna. Odrzucając szum genów metabolizmu podstawowego (housekeeping genes), skupiamy analizę na biologicznych czynnikach napędowych. Dowiesz się, jak używać Scanpy do izolowania najbardziej informatywnych genów dla kolejnych etapów analizy.
3m 53s
6
Ocenianie cyklu komórkowego i regresja
Omawiamy, jak radzić sobie z czynnikami zakłócającymi poprzez ocenianie i usuwanie faz cyklu komórkowego za pomocą regresji. Dyskutujemy, jak obliczać wyniki S i G2M oraz jak używać regresji do usunięcia ich wpływu. Dowiesz się, jak zapobiec zrujnowaniu topologii klastrowania przez aktywne podziały komórkowe.
4m 07s
7
Redukcja wymiarowości za pomocą PCA
Ten odcinek wyjaśnia analizę głównych składowych (PCA) w kontekście danych single-cell. Omawiamy, jak PCA odszumia zbiór danych i dlaczego wybór odpowiedniej liczby składowych ma znaczenie. Dowiesz się, jak zredukować tysiące genów do łatwiejszej w zarządzaniu podstawy dla zaawansowanych algorytmów.
3m 48s
8
Graf najbliższych sąsiadów i UMAP
Rozkładamy na czynniki pierwsze absolutny rdzeń współczesnej topologii single-cell: graf najbliższych sąsiadów. Następnie wyjaśniamy, jak UMAP tłumaczy tę złożoną sieć na czytelny wykres 2D. Dowiesz się, dlaczego graf sąsiedztwa jest warunkiem wstępnym dla prawie każdego zaawansowanego narzędzia w Scanpy.
3m 52s
9
Klastrowanie za pomocą algorytmu Leiden
Omawiamy, jak znaleźć dyskretne populacje komórek za pomocą algorytmu klastrowania Leiden. Optymalizując modularność na grafie sąsiedztwa, Leiden izoluje silnie połączone społeczności. Dowiesz się, jak dostosować parametr rozdzielczości, aby znaleźć stabilne, biologicznie znaczące grupy.
4m 18s
10
Odkrywanie genów markerowych
Zagłębiamy się w odkrywanie genów markerowych i testowanie zróżnicowanej ekspresji. Wyjaśniamy, jak testy statystyczne identyfikują unikalne sygnatury transkryptomiczne twoich klastrów. Dowiesz się, jak przejść od anonimowych, ponumerowanych klastrów do pewnie oznaczonych biologicznych typów komórek.
4m 13s
11
Integracja danych za pomocą Ingest
Ten odcinek obejmuje integrację danych przy użyciu narzędzia Ingest. Wyjaśniamy, jak rzutować nowe zbiory danych na przestrzeń PCA i UMAP wstępnie zaadnotowanego atlasu referencyjnego. Poznasz szybką, niezmienniczą metodę mapowania etykiet pomiędzy różnymi eksperymentami.
3m 52s
12
Wizualizacja wzorców ekspresji
Omawiamy zaawansowane techniki wizualizacji do oceny ekspresji genów w klastrach. Skupiamy się na wykresach kropkowych (dot plots) i wykresach macierzowych (matrix plots), szczegółowo opisując, jak kodują one zarówno intensywność ekspresji, jak i jej rzadkość. Dowiesz się, jak na pierwszy rzut oka wizualnie zweryfikować adnotacje typów komórek.
3m 35s
13
Eksploracja rozmaitości za pomocą Diffusion Maps
Wprowadzamy Diffusion Maps, potężną technikę osadzania (embedding) dla ciągłych danych biologicznych. Zestawiamy ją z UMAP, wyjaśniając, dlaczego dyfuzja lepiej nadaje się do analizy różnicowania komórkowego. Dowiesz się, jak wizualizować ciągłe przejścia i procesy rozwojowe.
3m 58s
14
Abstrakcyjne grafy za pomocą PAGA
Ten odcinek dotyczy abstrakcji grafów opartej na partycjach, czyli PAGA. Omawiamy, jak mierzyć rzeczywistą łączność między klastrami, aby zachować globalną topologię. Dowiesz się, jak używać PAGA do odkrywania prawdziwych relacji pokrewieństwa ukrytych w twoich danych.
3m 42s
15
Wnioskowanie o trajektoriach za pomocą DPT
Omawiamy wnioskowanie o trajektoriach przy użyciu Diffusion Pseudotime (DPT). Wyjaśniamy, jak wyznaczyć komórkę źródłową (root cell) i obliczyć odległości geodezyjne w grafie komórkowym. Dowiesz się, jak ułożyć komórki wzdłuż ciągłej osi czasu rozwoju.
3m 34s
16
Eksperymentalne skalowanie za pomocą Dask
W naszym ostatnim odcinku przyglądamy się eksperymentalnej granicy Scanpy: skalowaniu za pomocą Dask. Wyjaśniamy, jak radzić sobie ze zbiorami danych, które przekraczają pamięć RAM twojego komputera, wykorzystując leniwe wartościowanie (lazy evaluation) i przetwarzanie out-of-core. Dziękujemy, że dołączyłeś do nas w tym dogłębnym kursie Scanpy!
3m 51s

Odcinki

1

Tożsamość Scanpy i AnnData

4m 33s

Odkryj podstawowe idee stojące za Scanpy i dowiedz się, dlaczego został stworzony do skalowalnej analizy single-cell. Omawiamy obiekt AnnData, główną strukturę danych, która utrzymuje macierze, adnotacje i osadzenia (embeddings) w idealnym porządku. Poznasz model mentalny niezbędny do poruszania się po ekosystemie Scanpy.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Analiza single-cell w Scanpy, odcinek 1 z 16. Zbiory danych single-cell rozrosły się z tysięcy do milionów komórek w ciągu zaledwie kilku lat. Spróbuj załadować taką skalę do starszych, pamięciożernych toolkitów, a twój sprzęt się zadławi. Właśnie ten problem rozwiązuje Scanpy. Scanpy to skalowalny toolkit stworzony do analizy ogromnych datasetów ekspresji genów single-cell w Pythonie. Efektywnie zarządza pamięcią, opierając się na bardzo specyficznej, bazowej strukturze danych. Ta struktura to Annotated Data, czyli w skrócie AnnData. Osoby przechodzące ze standardowych danych tabelarycznych często zakładają, że AnnData to po prostu zmodyfikowany dataframe w pandas. Tak nie jest. Pojedynczy dataframe jest zdecydowanie zbyt płaski dla biologii single-cell. W eksperymencie single-cell masz ogromną macierz zliczeń ekspresji, ale masz też złożone metadane o komórkach i całkowicie oddzielne metadane o genach. AnnData to wielowymiarowy kontener, który ściśle wiąże główną macierz i wszystkie powiązane z nią metadane w jeden zsynchronizowany obiekt. Wyobraź sobie scenariusz, w którym ładujesz dataset składający się z miliona komórek. W samym centrum twojego obiektu AnnData znajduje się główna macierz danych, do której masz dostęp przez atrybut .X. To dwuwymiarowa macierz przechowująca twoje rzeczywiste wartości liczbowe, zazwyczaj zliczenia ekspresji genów. Wiersze zawsze reprezentują obserwacje, czyli twoje pojedyncze komórki, a kolumny zawsze reprezentują zmienne, czyli twoje geny. W przypadku datasetu z milionem komórek, .X jest prawie zawsze przechowywane jako sparse matrix, żeby oszczędzać RAM. Oto kluczowa kwestia. Macierz w .X nie przechowuje własnych nazw wierszy ani kolumn. Opiera się całkowicie na dwóch dedykowanych dataframe'ach z metadanymi, które dostarczają ten kontekst. Pierwsze to metadane obserwacji, dostępne przez atrybut .obs. To standardowy dataframe w pandas, zmapowany bezpośrednio na wiersze twojej macierzy .X. Przechowuje wszystko, co wiesz o komórkach. Dla twojego datasetu z milionem komórek, .obs będzie miał dokładnie milion wierszy. To tutaj żyją twoje cell barcodes, etykiety batchy, metryki quality control i przypisania clusteringu. Drugie to metadane zmiennych, dostępne przez atrybut .var. To kolejny dataframe zmapowany bezpośrednio na kolumny twojej macierzy .X. Przechowuje wszystko, co wiesz o genach lub cechach, które zmierzyłeś. To tutaj przechowujesz symbole genów, lokalizacje na chromosomach i metryki statystyczne, takie jak flagi highly variable genes. Ponieważ .obs i .var są ściśle wyrównane do wymiarów .X, możesz bezpiecznie slicować obiekt AnnData. Jeśli odfiltrujesz martwe komórki z .obs, obiekt AnnData automatycznie odrzuci odpowiednie wiersze z macierzy .X. Wyrównanie wymiarów nigdy się nie psuje. W strukturze AnnData jest jeszcze jedna kluczowa warstwa. Podczas przetwarzania swoich danych single-cell, generujesz wielowymiarowe reprezentacje komórek, takie jak principal components czy współrzędne UMAP. Te wyniki nie pasują idealnie do pojedynczej kolumny w .obs. Zamiast tego trafiają do osobnego słownika o nazwie .obsm, co jest skrótem od observation matrices. Jedyną zasadą jest to, że każda macierz, którą umieścisz w .obsm, musi mieć dokładnie taką samą liczbę wierszy co .X. Trzymając główną macierz, metadane komórek i metadane genów zamknięte w jednej, samoaktualizującej się strukturze, AnnData gwarantuje, że twoje dane pozostaną idealnie zsynchronizowane od pierwszego kroku filtrowania aż po końcową wizualizację. Jeśli uważasz te odcinki za pomocne, możesz wesprzeć podcast, wyszukując DevStoriesEU na Patreon. Jak zawsze, dzięki za odsłuch. Do usłyszenia w następnym odcinku.
2

Metryki kontroli jakości

3m 45s

Omawiamy, jak przeprowadzić wstępną kontrolę jakości danych single-cell przy użyciu Scanpy. Izolując specyficzne populacje genów, takie jak mitochondrialne RNA, możemy zidentyfikować zestresowane lub obumierające komórki. Dowiedz się, jak obliczać i interpretować te kluczowe metryki QC.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Analiza single-cell w Scanpy, odcinek 2 z 16. Najszybszym sposobem na zepsucie analizy single-cell jest nieświadome zostawienie martwych lub pustych komórek w datasecie. Możesz myśleć, że odkrywasz nową subpopulację, ale w rzeczywistości po prostu klastrujesz szczątki komórkowe. Wykrycie tych uszkodzonych komórek opiera się całkowicie na metrykach Quality Control. Wyjaśnijmy sobie od razu jedną rzecz. Ludzie często mylą obliczanie metryk jakości z filtrowaniem złych danych. To nie to samo. Funkcja Scanpy calculate qc metrics nie usuwa ani jednej komórki czy genu z twojego datasetu. To narzędzie służy wyłącznie do adnotacji. Oblicza statystyki i dodaje je jako nowe kolumny do twojego dataframe'u obserwacji, który śledzi komórki, oraz dataframe'u zmiennych, który śledzi geny. Właściwe usuwanie złych komórek odbywa się w osobnym kroku. Po co nam te konkretne metryki? Weźmy na przykład próbkę szpiku kostnego. Podczas ekstrakcji, stres fizyczny może rozerwać delikatne komórki. Kiedy błona komórkowa pęka, cytoplazmatyczne RNA wycieka i zostaje wypłukane. Jednak mitochondria są zamknięte we własnych błonach, więc mitochondrialne RNA zostaje uwięzione wewnątrz uszkodzonej powłoki komórki. Jeśli zsekwencjonujesz taką kroplę, otrzymasz wysokie stężenie genów mitochondrialnych i niewiele poza tym. To jest martwa komórka. Aby zidentyfikować te pęknięte komórki, musisz śledzić konkretne populacje genów. W ludzkich datasetach, geny mitochondrialne zazwyczaj zaczynają się od prefiksu MT-myślnik. Geny rybosomalne mogą zaczynać się od RPS lub RPL. Zanim będziesz mógł obliczyć metryki dla tych populacji, musisz je oznaczyć w swoim datasecie. Robisz to, tworząc nową kolumnę typu boolean w twoim dataframe var. Na przykład, tworzysz kolumnę o nazwie mt, która przyjmuje wartość True, jeśli nazwa genu zaczyna się od MT-myślnik, i False w przeciwnym razie. Kiedy już oznaczysz te geny, uruchamiasz funkcję calculate qc metrics. Domyślnie ta funkcja oblicza standardowe statystyki bazowe, takie jak całkowita liczba zliczeń RNA na komórkę i liczba genów ulegających ekspresji na komórkę. Ale możesz też kazać jej spojrzeć na konkretne populacje genów, które właśnie zdefiniowałeś. Przekazujesz nazwę swojej kolumny boolean, na przykład mt, do argumentu qc vars. Funkcja oblicza wtedy proporcję zliczeń pochodzących z tej konkretnej grupy genów. Dodaje nowe kolumny do twojego dataframe'u obs. Jedna kolumna pokaże całkowitą liczbę zliczeń genów mitochondrialnych dla każdej komórki. Inna, bardziej kluczowa kolumna, pokaże procent całkowitych zliczeń pochodzących z genów mitochondrialnych. Jeśli komórka wykazuje, że trzydzieści procent jej RNA jest mitochondrialne, wiesz, że to prawdopodobnie pęknięta, umierająca komórka z procesu ekstrakcji. Oto kluczowy wniosek. Funkcja calculate qc metrics przekształca surowe, nieinterpretowalne macierze zliczeń w biologiczne sygnały o zdrowiu komórki. Nie podejmuje decyzji za ciebie, ale poprzez tagowanie konkretnych populacji genów, daje ci dokładne liczbowe dowody, których potrzebujesz, aby oddzielić rzeczywistą biologię od szumu z ekstrakcji. Dzięki za spędzenie ze mną tych kilku minut. Do usłyszenia następnym razem, trzymaj się.
3

Filtrowanie i normalizacja

4m 16s

Ten odcinek obejmuje kluczowe kroki filtrowania i normalizacji macierzy ekspresji single-cell. Wyjaśniamy, jak odrzucać dane niskiej jakości i stosować skalowanie głębokości zliczeń za pomocą transformacji log1p. Dowiesz się, jak sprawić, by komórki o różnej głębokości sekwencjonowania były bezpośrednio porównywalne.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 3 z 16. Patrzysz na dwie komórki w swoim datasecie. Jedna wydaje się ekspresjonować dwa razy więcej RNA niż druga. Ale to nie jest różnica biologiczna — jeden droplet został po prostu zsekwencjonowany przez maszynę dwa razy głębiej. Jeśli porównasz je bezpośrednio, cała twoja downstream analysis zostanie zniekształcona przez techniczne artefakty. Filtrowanie i normalizacja to narzędzia, które rozwiązują tę rozbieżność. Zanim będziesz mógł skorygować sequencing depth, musisz usunąć śmieci. Surowe dane single-cell są pełne martwych komórek, pustych dropletów i losowego szumu. Czyścisz to wzdłuż dwóch różnych osi: komórek i genów. Ludzie czasami mylą te dwa kroki, ale robią one zupełnie różne rzeczy. Najpierw zajmujesz się komórkami, używając funkcji filter cells. Mówisz Scanpy, żeby odrzucił każdą komórkę, która ekspresjonuje mniej niż minimalną liczbę genów. Jeśli droplet zawiera tylko dwieście wykrytych genów, podczas gdy zdrowa komórka powinna mieć dwa tysiące, ten droplet jest prawdopodobnie pusty lub zawiera uszkodzoną, umierającą komórkę. Całkowicie go odrzucasz. Następnie filtrujesz geny w całym swoim datasecie. Używając funkcji filter genes, usuwasz geny, które są ekspresjonowane w zbyt małej liczbie komórek. Jeśli konkretny gen zostanie wykryty tylko w jednej lub dwóch komórkach na dziesięć tysięcy, nie ma on żadnej wartości statystycznej do późniejszego grupowania lub klasyfikowania typów komórek. To tylko szum obliczeniowy. Całkowicie odrzucasz ten gen. Kiedy pozbędziesz się komórek niskiej jakości i nieinformatywnych genów, nadal masz przed sobą problem sequencing depth. W tym miejscu normalizujesz total counts. Celem jest przeskalowanie każdej komórki tak, aby wszystkie wydawały się mieć taką samą całkowitą liczbę read counts. Weźmy scenariusz, w którym komórka A ma pięć tysięcy total counts, a komórka B dwadzieścia tysięcy. Wybierasz wspólny size factor, zazwyczaj dziesięć tysięcy. Scanpy aplikuje scaling factor do każdej komórki indywidualnie. Podwaja counts w komórce A i zmniejsza o połowę counts w komórce B. Teraz obie komórki sumują się do dziesięciu tysięcy total counts. Kiedy patrzysz na konkretny gen w obu komórkach, porównujesz ich prawdziwą względną ekspresję, całkowicie niezależnie od tego, jak mocno maszyna sekwencjonująca je zsamplowała. Wyrównanie sum to tylko połowa matematyki. Biologiczne dane ekspresji są mocno skośne. Garstka genów będzie miała ogromne wartości counts, podczas gdy większość będzie miała ich bardzo niewiele. Jeśli później wrzucisz te skośne dane do obliczeń wariancji lub algorytmów dimensionality reduction, te kilka masywnych genów zdominuje matematykę i zagłuszy subtelne sygnały biologiczne. Naprawiasz to, używając transformacji log plus one. Wywołujesz funkcję log one p w Scanpy, która aplikuje logarytm naturalny do wszystkich twoich znormalizowanych counts. Część plus one tej funkcji jest krytyczna, ponieważ twoja macierz danych to w większości zera, reprezentujące geny, które nie są ekspresjonowane w danej komórce. Logarytm z zera jest niezdefiniowany, ale logarytm z zera plus jeden to zero. Ten prosty krok kompresuje ekstremalnie wysokie wartości, jednocześnie trzymając zera dokładnie tam, gdzie są, co daje znacznie bardziej zbalansowany rozkład. Oto kluczowy wniosek. Filtrowanie i normalizacja nie zmieniają podstawowej biologii twojej próbki. Usuwają mechaniczne odchylenia sprzętu sekwencjonującego, pozwalając wyłonić się rzeczywistej biologii. Dzięki za wysłuchanie, happy coding wszystkim!
4

Wykrywanie dubletów za pomocą Scrublet

3m 53s

Zagłębiamy się w wykrywanie dubletów, kluczowy krok w wychwytywaniu technicznych artefaktów w mikroprzepływowym sekwencjonowaniu single-cell. Wyjaśniamy, jak Scrublet symuluje sztuczne dublety, aby oflagować podejrzane komórki. Dowiesz się, jak identyfikować i usuwać te sztuczne kombinacje ze swojego zbioru danych.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 4 z 16. Czasami dwie zupełnie różne komórki zostają uwięzione w tej samej kropli mikroprzepływowej, tworząc transkryptomiczną sygnaturę Frankensteina, która wygląda jak zupełnie nowy stan biologiczny. To nie jest odkrycie. To błąd, i jeśli nie wyłapiesz go wcześnie, zanieczyści twoją analizę. Właśnie ten problem ma rozwiązać detekcja dubletów za pomocą Scrublet. Kiedy odpalasz eksperyment single-cell z użyciem mikroprzepływów kropelkowych, przepuszczasz zawiesinę komórek przez kanał, celując w jedną komórkę na kroplę. Statystycznie ten proces nie jest idealny. Czasami dwie komórki dzielą jedną kroplę. Weźmy scenariusz, w którym monocyt i limfocyt T zostają uwięzione razem. Sekwenator odczytuje ich połączone RNA jako pojedynczą jednostkę, zwracając profil, który miesza geny z obu typów komórek. Ludzie często mylą te mieszane profile z prawdziwymi biologicznymi stanami przejściowymi, na przykład z komórką w połowie procesu różnicowania. Musimy mieć całkowitą jasność. Dublety to czysto techniczne artefakty. Nie istnieją w tkance i muszą zostać usunięte. W Scanpy ogarniasz to za pomocą funkcji scrublet w module preprocessing. Scrublet działa w oparciu o wysoce skuteczne założenie, żeby znaleźć te fałszywe komórki. Jeśli chcesz wykryć dublety, musisz wiedzieć, jak wygląda dublet w twoim konkretnym datasecie. Ponieważ algorytm nie wie, które z twoich obserwowanych komórek to błędy, tworzy swoje własne. Najpierw Scrublet bierze expression matrix twoich obserwowanych komórek. Następnie losowo wybiera pary tych prawdziwych komórek i obliczeniowo dodaje do siebie ich profile ekspresji genów. Te połączone profile to twoje symulowane dublety. Teraz Scrublet mapuje zarówno twoje faktyczne, obserwowane komórki, jak i te nowo symulowane dublety w tę samą wielowymiarową przestrzeń. Buduje klasyfikator nearest-neighbor, żeby przeanalizować relacje między nimi. To jest kluczowe spostrzeżenie. Scrublet ocenia bezpośrednie sąsiedztwo każdej prawdziwej komórki w twoim datasecie. Jeśli obserwowana komórka jest otoczona głównie przez symulowane dublety, ta prawdziwa komórka wygląda matematycznie identycznie jak sztuczny mashup. Scrublet przypisuje jej wysoki doublet score. Z kolei, jeśli obserwowana komórka siedzi w klastrze z innymi prawdziwymi komórkami i bardzo małą liczbą symulowanych dubletów, dostaje niski score. Jest wysoce prawdopodobne, że to prawdziwa pojedyncza komórka. Funkcja nie zatrzymuje się na przypisaniu ciągłego score'u. Ocenia rozkład wszystkich doublet scores w twoim datasecie, żeby automatycznie obliczyć próg odcięcia. Szuka separacji między dużym pikiem normalnych komórek a mniejszym ogonem podejrzanych dubletów. Na podstawie tego progu, Scrublet taguje każdą komórkę w twoim datasecie wartością boolean, oznaczając ją jako true, jeśli jest to przewidywany dublet, i false, jeśli to singlet. Te wyniki są zapisywane bezpośrednio w twoim obiekcie danych, co pozwala ci odfiltrować fałszywe komórki, zanim przejdziesz do downstream analysis. Podstawową siłą Scrubleta jest to, że nie polega na zewnętrznych referencyjnych bazach danych, żeby znajdować błędy techniczne. Uczy się dokładnych trybów awarii twojego konkretnego eksperymentu, łącząc dokładnie te komórki, które zsekwencjonowałeś. To wszystko w tym odcinku. Dzięki za wysłuchanie i buduj dalej!
5

Selekcja cech i geny o wysokiej zmienności

3m 53s

Analizujemy koncepcję selekcji cech i powody, dla których identyfikacja genów o wysokiej zmienności jest niezbędna. Odrzucając szum genów metabolizmu podstawowego (housekeeping genes), skupiamy analizę na biologicznych czynnikach napędowych. Dowiesz się, jak używać Scanpy do izolowania najbardziej informatywnych genów dla kolejnych etapów analizy.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 5 z 16. Spośród około 30 000 genów w ludzkim genomie, większość odpowiada po prostu za podstawowe utrzymanie komórki. Jeśli spróbujesz przeanalizować je wszystkie naraz, ogromna ilość aktywności bazowej zagłuszy faktyczną biologię, której szukasz. Aby znaleźć prawdziwy sygnał, potrzebujesz Feature Selection i Highly Variable Genes. Na początek szybkie rozróżnienie. Użyłeś już podstawowej funkcji filtrującej, żeby odrzucić geny, które są ledwo wykrywalne w twoim datasecie. Ten krok usuwa techniczny szum i puste droplets. Selekcja highly variable genes robi coś zupełnie innego. Zakłada, że pozostałe geny są prawdziwe, ale pyta, które z nich niosą faktyczne informacje. Pomyśl o tym w ten sposób. Przesiewanie dziesiątek tysięcy genów, żeby znaleźć te, które napędzają różnice między typami komórek, oznacza odrzucenie nudnych, bazowych housekeeping genes. Taki housekeeping gene jest aktywny w niemal każdej komórce na mniej więcej tym samym poziomie. Jego ekspresja jest stabilna, co czyni go bezużytecznym przy odróżnianiu limfocytu T od limfocytu B. Szukamy genów, które ulegają silnej ekspresji w niektórych komórkach, a w innych są całkowicie wyciszone. To właśnie są highly variable genes. Zazwyczaj chcesz zawęzić swój dataset do około dwóch tysięcy takich kluczowych driverów. W Scanpy robisz to za pomocą funkcji highly variable genes. Ale nie możesz po prostu uszeregować genów według surowej wariancji. W danych z sekwencjonowania wariancja skaluje się ze średnią ekspresją. Jeśli gen ulega silnej ekspresji we wszystkich komórkach, jego surowa wariancja będzie naturalnie wysoka, nawet jeśli nie jest on biologicznie interesujący. Algorytm musi oddzielić wariancję od średniej ekspresji. Robi to, dzieląc geny na tak zwane bins na podstawie ich średnich poziomów ekspresji. Następnie oblicza znormalizowaną dyspersję w każdym z tych bins. To mówi ci, jak bardzo gen się zmienia w porównaniu tylko z innymi genami, które ulegają ekspresji na podobnym poziomie bazowym. Scanpy oferuje różne metody statystyczne do tych obliczeń, nazywane flavors. Tradycyjny flavor Seurat oczekuje, że twoje dane będą najpierw log-normalized. Oblicza dyspersję, dzieli dane na bins i standaryzuje wartości. Jest też nowszy flavor Seurat v3, który wyraźnie wymaga surowych, niezlogarytmowanych danych count, aby poprawnie modelować wariancję. Alternatywnie, flavor CellRanger wykorzystuje nieco inne podejście do obliczania znormalizowanej dyspersji na podstawie counts. Flavor, który wybierzesz, po prostu dyktuje konkretny rozkład statystyczny używany do modelowania relacji między średnią a wariancją. Kiedy uruchamiasz tę funkcję, nie usuwa ona reszty twoich danych. Zamiast tego dodaje kilka nowych kolumn do twojej tablicy variable annotations. Najważniejszą z nich jest kolumna typu boolean o nazwie po prostu highly variable, ustawiająca wartość true dla dwóch tysięcy najlepszych genów i false dla reszty. Przyszłe kroki w twoim pipeline będą automatycznie szukać tej flagi i wykorzystywać tylko te wybrane geny do analizy downstream. Oto kluczowy wniosek. Feature selection to nie tylko sztuczka obliczeniowa, która ma przyspieszyć działanie twojego kodu; to celowy proces usuwania biologicznego białego szumu, aby prawdziwe tożsamości komórkowe miały szansę się ujawnić. Dzięki za wspólnie spędzony czas. Mam nadzieję, że udało ci się dowiedzieć czegoś nowego.
6

Ocenianie cyklu komórkowego i regresja

4m 07s

Omawiamy, jak radzić sobie z czynnikami zakłócającymi poprzez ocenianie i usuwanie faz cyklu komórkowego za pomocą regresji. Dyskutujemy, jak obliczać wyniki S i G2M oraz jak używać regresji do usunięcia ich wpływu. Dowiesz się, jak zapobiec zrujnowaniu topologii klastrowania przez aktywne podziały komórkowe.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 6 z 16. Twój algorytm clusteringu właśnie podzielił identyczne limfocyty T na dwie odrębne grupy. To dokładnie ten sam typ komórki, ale algorytm rozdzielił je tylko dlatego, że jedna grupa aktywnie się dzieli, a druga odpoczywa. Aby to naprawić, używamy Cell-Cycle Scoring i regresji. Heterogeniczność cyklu komórkowego to ogromne źródło wariancji w danych single-cell. Jeśli tego nie skontrolujesz, geny o wysokiej ekspresji napędzające mitozę zagłuszą subtelne sygnatury genowe, które definiują rzeczywiste typy komórek. W rezultacie otrzymujesz klastry zdefiniowane przez tymczasowy stan, a nie prawdziwą biologiczną tożsamość. Aby rozwiązać ten problem, Scanpy oferuje dedykowaną funkcję do scoringu genów na podstawie cyklu komórkowego. Przekazujesz do tej funkcji swój dataset single-cell wraz z dwiema konkretnymi listami znanych genów markerowych. Jedna lista zawiera geny aktywne w fazie S, czyli fazie syntezy cyklu komórkowego. Druga lista zawiera geny aktywne w fazie G2M, czyli fazie mitozy. Funkcja scoringowa ocenia każdą pojedynczą komórkę i oblicza dwie ciągłe metryki: S-score oraz G2M-score. Robi to, sprawdzając, jak silna jest ekspresja genów z danej fazy w porównaniu do backgroundowego poziomu ekspresji w komórce. Na podstawie tych dwóch score'ów, funkcja przypisuje również kategoryczną etykietę fazy do każdej komórki w twoich metadanych, oznaczając ją jako S, G2M lub G1, jeśli żaden ze score'ów nie jest szczególnie wysoki. Teraz, gdy już skwantyfikowałeś ten efekt, musisz usunąć jego wpływ z datasetu. W tym miejscu używasz funkcji regress out. Instruujesz regress out, aby spojrzała na kolumny S-score i G2M-score, które właśnie zostały dodane do twoich metadanych komórek. Następnie algorytm buduje model liniowy dla ekspresji każdego pojedynczego genu we wszystkich komórkach, używając tych dwóch score'ów cyklu komórkowego jako zmiennych predykcyjnych. Oblicza wartość resztkową, czyli dokładną wielkość ekspresji genu, której nie da się wyjaśnić pozycją komórki w cyklu komórkowym. Ta wartość resztkowa staje się nowym, skorygowanym poziomem ekspresji w twoim datasecie. Oto kluczowa sprawa. Ludzie często mylą regresję z batch correction. To powiązane koncepcje, ale fundamentalnie różne narzędzia. Metody batch correction służą do wyrównywania dyskretnych, kategorycznych grup, takich jak próbki pobrane w różnych dniach lub sekwencjonowane na różnych maszynach. Regress out jest zaprojektowane specjalnie dla ciągłych zmiennych zakłócających. Używasz go do ciągłych gradientów numerycznych, takich jak te score'y cyklu komórkowego, całkowita liczba zliczeń na komórkę, czy procent genów mitochondrialnych. Modeluje matematyczne nachylenie i je spłaszcza. Kiedy uruchomisz ten krok regresji, silny biologiczny bias podziału komórki zostaje matematycznie usunięty z macierzy ekspresji. Kiedy ponownie uruchomisz swój algorytm clusteringu na tych skorygowanych danych, te dzielące się i spoczynkowe limfocyty T złączą się z powrotem w jeden, spójny klaster. Algorytm nie jest już rozpraszany przez szum replikacji DNA. Zastosowanie regress out na score'ach cyklu komórkowego gwarantuje, że twoja analiza downstreamowa sklastruje komórki ściśle według tego, czym są, a nie tego, co akurat robiły w momencie sekwencjonowania. To wszystko w tym odcinku. Dzięki za wysłuchanie i buduj dalej!
7

Redukcja wymiarowości za pomocą PCA

3m 48s

Ten odcinek wyjaśnia analizę głównych składowych (PCA) w kontekście danych single-cell. Omawiamy, jak PCA odszumia zbiór danych i dlaczego wybór odpowiedniej liczby składowych ma znaczenie. Dowiesz się, jak zredukować tysiące genów do łatwiejszej w zarządzaniu podstawy dla zaawansowanych algorytmów.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 7 z 16. Ludzki umysł nie jest w stanie zwizualizować dwóch tysięcy wymiarów. Co gorsza, złożone algorytmy klastrowania stają się przez nie obliczeniowo sparaliżowane, grzęznąc w mieszance prawdziwego sygnału biologicznego i losowego szumu technicznego. Potrzebujesz sposobu na wyodrębnienie podstawowej struktury swoich danych przed ich analizą. Dimensionality reduction za pomocą Principal Component Analysis to sposób na rozwiązanie tego problemu. Zanim przejdziemy do mechaniki, musimy rozwiać powszechne nieporozumienie. Ludzie często myślą, że PCA to po prostu scatter plot pokazujący PC1 względem PC2, mający być ostateczną wizualizacją dla ludzkiego oka. Wcale tak nie jest. Choć możesz wyplotować dwa pierwsze komponenty, PCA to przede wszystkim matematyczny fundament. Kompresuje zaszumioną sparse matrix do gęstego formatu, by przekazać ją do narzędzi downstreamowych, takich jak neighbor graphs. Pomyśl o swoim punkcie wyjścia. Właśnie wyizolowałeś około dwóch tysięcy highly variable genes. Każdy gen reprezentuje niezależny wymiar w twoim datasecie. Uruchamiasz funkcję scanpy tools pca, żeby policzyć principal components. Ta funkcja analizuje cały twój dataset i kompresuje te dwa tysiące wymiarów genów do znacznie mniejszego zestawu syntetycznych wymiarów, zazwyczaj około pięćdziesięciu. Te syntetyczne wymiary są uporządkowane według tego, ile wariancji wyjaśniają. Pierwszy principal component reprezentuje absolutnie najsilniejszą oś zmienności w twoich komórkach. Drugi reprezentuje kolejną najsilniejszą oś i tak dalej. I tu jest kluczowa sprawa. Pierwsza garść komponentów przechwytuje rzeczywiste, ustrukturyzowane różnice biologiczne. Gdy schodzisz w dół listy komponentów, przechwytują one coraz mniej biologii, a coraz więcej losowego szumu technicznego. Odcinając końcówkę tych komponentów, w zasadzie odszumiasz swój data matrix. Aby ocenić tę redukcję, musisz zdecydować, ile komponentów zachować. Używasz funkcji scanpy plot pca variance ratio. To polecenie generuje line chart pokazujący ułamek całkowitej wariancji wyjaśnianej przez każdy pojedynczy komponent. Analizujesz tę linię, szukając tak zwanego elbow point, czyli miejsca, w którym stromy spadek nagle się spłaszcza, tworząc długi ogon. Jeśli krzywa spłaszcza się przy piętnastym komponencie, możesz założyć, że potrzebujesz tylko piętnastu komponentów. Jednak w workflowach single-cell celowo zawyżamy liczbę principal components. Możesz zobaczyć elbow przy piętnastu, ale i tak każesz swoim funkcjom downstreamowym użyć pięćdziesięciu. Downstreamowe algorytmy klastrowania są bardzo odporne. Z łatwością ignorują niewielki szum techniczny zawarty w komponentach od szesnastego do pięćdziesiątego. Nie potrafią jednak odzyskać biologicznego sygnału, który wyrzuciłeś zbyt wcześnie. Jeśli komponent dwudziesty drugi zawiera variance signature dla bardzo rzadkiego typu komórek, usunięcie go oznacza, że ten typ komórek całkowicie znika z twojej analizy. Obliczasz komponenty, sprawdzasz variance ratio, żeby potwierdzić strukturę danych, i przechodzisz dalej. Najważniejszy wniosek jest taki, że PCA to nie obrazek do oglądania, ale celowy filtr matematyczny, który poświęca surową głębię wymiarów, żeby usunąć szum i odsłonić prawdziwe biologiczne osie twoich danych. Mam nadzieję, że to było przydatne. Dzięki za wysłuchanie i życzę miłego dnia.
8

Graf najbliższych sąsiadów i UMAP

3m 52s

Rozkładamy na czynniki pierwsze absolutny rdzeń współczesnej topologii single-cell: graf najbliższych sąsiadów. Następnie wyjaśniamy, jak UMAP tłumaczy tę złożoną sieć na czytelny wykres 2D. Dowiesz się, dlaczego graf sąsiedztwa jest warunkiem wstępnym dla prawie każdego zaawansowanego narzędzia w Scanpy.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 8 z 16. Sekret nowoczesnej analizy single-cell nie polega tylko na plotowaniu punktów na siatce. Chodzi o dokładne zrozumienie, które komórki są sąsiadami w ogromnej, wielowymiarowej przestrzeni. Jeśli źle określisz tę podstawową strukturę, każda kolejna wizualizacja wprowadzi cię w błąd. Mechanizmem do uchwycenia tej struktury jest nearest neighbor graph, a dziś przyjrzymy się, jak go zbudować i zrzutować za pomocą UMAP. Na tym etapie typowego pipeline'u masz już za sobą Principal Component Analysis. Skondensowałeś tysiące genów do jakichś czterdziestu lub pięćdziesięciu principal components. Ale pięćdziesięciu wymiarów wciąż nie da się zwizualizować i nie mówi nam to wprost, które komórki należą do tej samej lokalnej społeczności. Musimy zbudować sieć połączeń. W Scanpy robisz to za pomocą funkcji sc dot pp dot neighbors. Ten krok oblicza neighborhood graph twoich komórek. Obliczanie dystansów między dziesiątkami tysięcy komórek na podstawie trzydziestu tysięcy surowych genów jest obliczeniowo brutalne i bardzo podatne na szum. Dzięki obliczaniu sąsiadów na principal components, matematyka jest szybka, a techniczny szum został już usunięty. Dla każdej pojedynczej komórki algorytm sprawdza jej współrzędne w tych principal components i znajduje jej najbliższych sąsiadów. Domyślnie łączy komórkę z jej piętnastoma nearest neighbors. Outputem jest matematyczna sieć, w której komórki to węzły, a krawędzie między nimi reprezentują wysokie podobieństwo. Ten neighborhood graph staje się fundamentalną strukturą danych dla zadań downstream. Kiedy już masz tę sieć, chcesz na nią faktycznie spojrzeć. Tutaj wkracza UMAP, wywoływany przez sc dot tl dot umap. Oto kluczowa sprawa. Bardzo powszechnym błędem jest myślenie, że UMAP oblicza dystanse bezpośrednio z twoich surowych danych o ekspresji genów. Wcale tak nie jest. UMAP jest całkowicie ślepy na twoje geny. To po prostu layout engine. Jego jedynym zadaniem jest wzięcie tego wcześniej obliczonego nearest neighbor graph i spłaszczenie go do dwuwymiarowej przestrzeni. UMAP działa poprzez optymalizację layoutu, aby dopasować go do grafu. Przyciąga do siebie połączonych sąsiadów, jednocześnie odpychając od siebie niepowiązane komórki. Ponieważ opiera się całkowicie na lokalnych połączeniach zdefiniowanych w poprzednim kroku, wyjątkowo dobrze zachowuje lokalną strukturę. Jeśli grupa komórek była ściśle połączona w wielowymiarowym grafie, utworzy wyraźną, zwartą wyspę na twoim plocie 2D UMAP. Ale pamiętaj, że pusta przestrzeń między oddzielnymi wyspami na plocie UMAP znaczy bardzo niewiele. UMAP poświęca globalną dokładność przestrzenną, aby upewnić się, że lokalni sąsiedzi pozostaną ze sobą sklejeni. Ten separation of concerns jest kluczowy. Kształt, który widzisz na UMAP, jest całkowicie podyktowany przez neighbor graph zbudowany tuż przed nim. Jeśli chcesz zmienić to, jak wrażliwy jest twój layout na rzadkie typy komórek, nie tunujesz UMAP. Wracasz i dostosowujesz liczbę sąsiadów w samej konstrukcji grafu. Jeśli uważasz te odcinki za pomocne i chcesz wesprzeć program, możesz wyszukać DevStoriesEU na Patreon. To wszystko w tym odcinku. Dzięki za słuchanie i buduj dalej!
9

Klastrowanie za pomocą algorytmu Leiden

4m 18s

Omawiamy, jak znaleźć dyskretne populacje komórek za pomocą algorytmu klastrowania Leiden. Optymalizując modularność na grafie sąsiedztwa, Leiden izoluje silnie połączone społeczności. Dowiesz się, jak dostosować parametr rozdzielczości, aby znaleźć stabilne, biologicznie znaczące grupy.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Analiza pojedynczych komórek w Scanpy, odcinek 9 z 16. Tradycyjne algorytmy klastrowania zakładają, że twoje dane istnieją w idealnie okrągłych skupiskach zorganizowanych wokół punktu centralnego. Ale prawdziwe dane biologiczne są chaotyczne, wzajemnie powiązane i tworzą złożone, ciągłe kształty. Kiedy próbujesz wcisnąć te złożone struktury w proste sfery, ostatecznie dzielisz pojedyncze typy komórek na sztuczne fragmenty. Klastrowanie algorytmem Leiden rozwiązuje ten problem, patrząc na to, jak komórki łączą się ze sobą, a nie tylko gdzie znajdują się w abstrakcyjnej przestrzeni. Często domyślnie myślimy o klastrowaniu jak o K-means, gdzie definiujesz punkt centralny i grupujesz wszystko w pobliżu, używając standardowych odległości fizycznych. Leiden tak nie działa. To algorytm klastrowania oparty na grafach. Całkowicie ignoruje odległości euklidesowe do centroidu. Zamiast tego opiera się wyłącznie na gęstości krawędzi w grafie sąsiedztwa, który zbudowałeś wcześniej w swojej analizie. Pomyśl o grafie sąsiedztwa jak o ogromnej sieci społecznościowej. Komórki to poszczególne osoby, a krawędzie między nimi to przyjaźnie. Leiden wykonuje tak zwane community detection. Szuka grup komórek, które mają bardzo dużą liczbę połączeń wewnątrz swojej grupy, ale bardzo mało połączeń z resztą sieci. Aby to osiągnąć, algorytm optymalizuje metrykę zwaną modularity. Modularity mierzy gęstość połączeń wewnątrz społeczności w porównaniu do połączeń, jakich mógłbyś się spodziewać, gdyby sieć była całkowicie losowa. Algorytm zaczyna od przypisania każdej pojedynczej komórki do jej własnej, indywidualnej społeczności. Następnie iteracyjnie łączy te społeczności, przenosząc węzły tam i z powrotem, i stale sprawdzając, czy nowe grupowanie zwiększa ogólny wynik modularity. Leiden jest specjalnie zaprojektowany, aby ostrożnie dopracowywać te partycje, gwarantując, że ostateczne społeczności są gęsto połączone wewnętrznie i nie cierpią na problem odłączonych fragmentów, co było znanym błędem w starszym algorytmie Louvain. W Scanpy uruchamiasz to używając funkcji Leiden. Przekazujesz jej swój główny obiekt danych, a ona operuje bezpośrednio na istniejącym grafie sąsiedztwa. Wynikiem jest nowa kolumna kategoryczna dodana do twoich danych, zawierająca numer klastra dla każdej pojedynczej komórki. Oto kluczowa sprawa. Najważniejszym elementem kontroli, jaki masz nad całym tym procesem, jest parametr resolution. Ten parametr działa jak pokrętło, które dyktuje, jak agresywnie algorytm dzieli grupy. Domyślnie Scanpy używa wartości resolution równej jeden. Jeśli zwiększysz wartość resolution, otrzymasz więcej klastrów. Algorytm staje się bardzo czuły, dzieląc graf na mniejsze, wysoce specyficzne subpopulacje. Jeśli zmniejszysz wartość resolution, otrzymasz mniej klastrów. Algorytm staje się bardziej tolerancyjny, grupując ze sobą większe fragmenty grafu. Załóżmy, że uruchamiasz Leiden i patrzysz na wynikową mapę. Możesz zauważyć, że pojedynczy, znany biologiczny typ komórki został podzielony na pięć malutkich, nadmiernie pofragmentowanych subpopulacji. Algorytm znalazł drobne różnice, ale biologicznie te pięć grup stanowi jedną całość jako jeden odrębny stan komórkowy. Aby to naprawić, po prostu uruchamiasz funkcję Leiden jeszcze raz, ale tym razem jawnie przekazujesz niższą liczbę do argumentu resolution. Obniżając wartość resolution, instruujesz algorytm, aby złagodził swoje kryteria. Te pięć malutkich fragmentów połączy się z powrotem w jeden solidny, biologicznie sensowny klaster. Dokładna wartość resolution, której potrzebujesz, nigdy nie jest stałą matematyczną prawdą; to regulowane pokrętło, którym kręcisz, aż statystyczne społeczności w grafie dokładnie odzwierciedlą biologiczną rzeczywistość twojej tkanki. Dzięki za wspólny czas. Mam nadzieję, że dowiedziałeś się czegoś nowego.
10

Odkrywanie genów markerowych

4m 13s

Zagłębiamy się w odkrywanie genów markerowych i testowanie zróżnicowanej ekspresji. Wyjaśniamy, jak testy statystyczne identyfikują unikalne sygnatury transkryptomiczne twoich klastrów. Dowiesz się, jak przejść od anonimowych, ponumerowanych klastrów do pewnie oznaczonych biologicznych typów komórek.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 10 z 16. Wyizolowałeś zwarty, wyraźny klaster komórek w swoim datasecie, ale skąd wiesz, czy to limfocyt T, limfocyt B, czy zupełnie nieznany stan? Matematyka je pogrupowała, ale to biologia musi ci powiedzieć, czym one są. Ten krok tłumaczenia opiera się całkowicie na odkrywaniu genów markerowych. Zanim przyjrzymy się narzędziom, musimy postawić grubą kreskę między clusteringiem a adnotacją. Algorytmy clusteringu po prostu grupują komórki na podstawie statystycznego podobieństwa w tysiącach wymiarów i przypisują im arbitralną etykietę, jak Cluster 0 czy Cluster 1. Ta liczba nie ma żadnego znaczenia biologicznego. Odkrywanie genów markerowych to proces znajdowania konkretnych genów, które napędzają to statystyczne grupowanie, co pozwala ci przypisać tym klastrom prawdziwe, biologiczne nazwy. W Scanpy znajdziesz te kluczowe geny używając funkcji o nazwie rank genes groups. Ta funkcja przeprowadza analizę differential expression. Przyjmuje kategoryczne grupowanie, zazwyczaj twoje wyliczone klastry, i porównuje ekspresję genów komórek wewnątrz jednego klastra z komórkami we wszystkich pozostałych klastrach razem wziętych. Celem jest znalezienie genów, które ulegają silnej ekspresji w twoim docelowym klastrze, ale są w większości wyciszone wszędzie indziej. Domyślnie porównuje każdy klaster z sumą reszty komórek, ale możesz też ją skonfigurować tak, aby porównywała klaster z jedną konkretną grupą referencyjną, jeśli szukasz subtelnych różnic między dwoma bardzo podobnymi typami komórek. Aby zdecydować, czy gen jest prawdziwym markerem, Scanpy odpala test statystyczny, żeby ocenić różnicę w ekspresji. Możesz wybrać standardowy t-test, ale test Wilcoxona jest wysoce zalecany i jest to standardowy wybór dla danych single-cell. Ekspresja genów single-cell nie układa się w normalną krzywą dzwonową; jest bardzo zmienna, mocno skośna i pełna zerowych wartości tam, gdzie gen po prostu nie został wykryty. Test Wilcoxona nie zakłada rozkładu normalnego. Zamiast patrzeć na surowe wartości średnie, rankuje wartości ekspresji we wszystkich komórkach i porównuje rangi między twoim docelowym klastrem a resztą datasetu. Dzięki temu jest znacznie bardziej odporny na skrajne outliery. Spójrzmy na konkretny scenariusz. Masz dataset z kilkoma klastrami i chcesz zbadać Cluster 3. Wywołujesz funkcję rank genes groups, mówisz jej, żeby użyła twoich istniejących etykiet klastrów i ustawiasz metodę na Wilcoxon. Scanpy przelicza liczby i rankuje każdy pojedynczy gen na podstawie tego, jak unikalnie definiuje on Cluster 3. Następnie sprawdzasz topowe wyniki. Widzisz, że najwyżej zrankowane geny to CD8A i GZMK. Jeśli znasz się na immunologii, od razu rozpoznajesz, że to klasyczne markery dla cytotoksycznych limfocytów T. Ponieważ te konkretne geny są tutaj unikalnie upregulowane w porównaniu do reszty datasetu, możesz śmiało przypisać Cluster 3 etykietę CD8-dodatniego limfocytu T. Output tej funkcji jest po cichu zapisywany w twoim obiekcie AnnData pod atrybutem uns. Scanpy zapisuje tablice nazw genów, wyników statystycznych, p-values i log-fold changes dla każdego klastra jednocześnie. Możesz wyciągnąć te tablice, żeby zbudować dataframe'y, zapisać je do pliku csv, albo przekazać bezpośrednio do narzędzi do adnotacji downstream. Oto kluczowy wniosek. Differential expression zamienia arbitralne matematyczne kształty w użyteczne biologiczne tożsamości. Bez genów markerowych masz po prostu mapę liczb; z nimi masz zmapowany system biologiczny. To wszystko w tym odcinku. Dzięki za wysłuchanie i koduj dalej!
11

Integracja danych za pomocą Ingest

3m 52s

Ten odcinek obejmuje integrację danych przy użyciu narzędzia Ingest. Wyjaśniamy, jak rzutować nowe zbiory danych na przestrzeń PCA i UMAP wstępnie zaadnotowanego atlasu referencyjnego. Poznasz szybką, niezmienniczą metodę mapowania etykiet pomiędzy różnymi eksperymentami.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 11 z 16. Masz idealnie zannotowany referencyjny dataset i zupełnie nową próbkę pacjenta, którą musisz przeanalizować. Zazwyczaj ich połączenie oznacza odpalenie batch correction, przeliczenie principal components i czekanie, aż ogromny, wspólny UMAP wyrenderuje się od zera. Integracja danych za pomocą Ingest oferuje szybszą, nieniszczącą alternatywę. Ludzie często mylą ingest ze standardowym batch correction. Tradycyjne narzędzia do batch correction biorą wiele datasetów i obliczają zupełnie nowy, wspólny model. Zmieniają one bazową reprezentację twoich danych referencyjnych, żeby wymusić dopasowanie. Ingest robi coś odwrotnego. To asymetryczna projekcja. Twój referencyjny dataset działa jak absolutne ground truth. Model przestrzenny jest zablokowany, a nowe dane są po prostu przez niego przepuszczane, bez jakiejkolwiek zmiany oryginalnego modelu. Weźmy pięknie zannotowany referencyjny atlas komórek jednojądrowych krwi obwodowej. Każdy cluster jest zweryfikowany i ma przypisany label. Właśnie dostałeś niezannotowaną, nieuporządkowaną próbkę pacjenta. Chcesz zaaplikować te labele z atlasu do swojej nowej próbki i chcesz wyplotować nowe komórki w dokładnie tej samej przestrzeni współrzędnych co referencja. Żeby to zadziałało, zmienne w obu datasetach muszą się zgadzać. To oznacza, że oba datasety muszą współdzielić dokładnie te same geny. W praktyce filtrujesz swój nowy query dataset tak, żeby jego geny pasowały do highly variable genes zidentyfikowanych już w twoim referencyjnym atlasie. Twój referencyjny dataset musi być w pełni sprocesowany zanim zaczniesz. Potrzebuje istniejącego Principal Component Analysis, policzonego neighborhood graph i reprezentacji UMAP. Przechowuje też kategoryczne labele, które chcesz przetransferować, zapisane w metadanych observation. Wykonanie to jedna komenda. Wywołujesz funkcję ingest, przekazując jej swój nowy query dataset, zannotowany referencyjny dataset i konkretną kolumnę observation, którą chcesz zmapować, na przykład label typu komórki. Oto kluczowa sprawa. Kiedy odpalasz tę funkcję, ingest bierze profile ekspresji twoich nowych komórek i projektuje je matematycznie na istniejącą przestrzeń principal components referencyjnego atlasu. Całkowicie pomija liczenie nowego, globalnego Principal Component Analysis. Kiedy komórki query wylądują w tym wspólnym układzie przestrzennym, algorytm szuka nearest neighbors. Mapuje komórki query bezpośrednio na istniejący neighbor graph referencyjnego datasetu. Ciężka robota obliczeniowa związana z budowaniem grafu została już wykonana przez model referencyjny. Ponieważ nowe komórki mają już ustalonych sąsiadów w danych referencyjnych, zachodzą dwa ostatnie transfery. Po pierwsze, współrzędne UMAP z referencyjnych sąsiadów są przypisywane do nowych komórek. Po drugie, labele metadanych, takie jak typy komórek, są kopiowane na podstawie majority voting od tych najbliższych referencyjnych sąsiadów. W rezultacie otrzymujesz query dataset, który ma dokładnie ten sam układ UMAP i adnotacje typów komórek co twój atlas. Możesz nałożyć wcześniej niezannotowaną próbkę pacjenta bezpośrednio na swoją referencyjną wizualizację, a pasujące populacje biologiczne wpadną gładko w ustalone wizualne clustery. Projektując nowe komórki na istniejący model, ingest zmienia twój workflow z ciągłego przebudowywania kruchych globalnych przestrzeni na zbudowanie jednego, solidnego referencyjnego atlasu i płynne przepuszczanie przez niego wszystkich przyszłych eksperymentów. To wszystko w tym odcinku. Dzięki za wysłuchanie i keep building!
12

Wizualizacja wzorców ekspresji

3m 35s

Omawiamy zaawansowane techniki wizualizacji do oceny ekspresji genów w klastrach. Skupiamy się na wykresach kropkowych (dot plots) i wykresach macierzowych (matrix plots), szczegółowo opisując, jak kodują one zarówno intensywność ekspresji, jak i jej rzadkość. Dowiesz się, jak na pierwszy rzut oka wizualnie zweryfikować adnotacje typów komórek.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Analiza single-cell w Scanpy, odcinek 12 z 16. Standardowy feature plot świetnie pokazuje, gdzie aktywny jest jeden konkretny gen, ale całkowicie wymięka, gdy musisz jednocześnie porównać dwadzieścia różnych genów w dziesięciu odrębnych klastrach. Aby rozwiązać ten problem, przyjrzymy się wizualizacji wzorców ekspresji. Podczas sprawdzania genów markerowych, domyślnym odruchem jest często sięgnięcie po heatmapę. Ustawiasz w rzędzie wszystkie swoje komórki, ustawiasz geny i szukasz bloków kolorów. Jednak dane z sekwencjonowania single-cell RNA są notorycznie rzadkie. Większość komórek ma zero counts dla większości genów. Na standardowej heatmapie single-cell, ta rzadkość tworzy wizualny szum. Kończysz wpatrując się w morze koloru tła, próbując zgadnąć, czy gen jest faktycznie specyficznym markerem dla klastra, czy to po prostu losowy dropout wszędzie indziej. I tutaj wkracza dot plot. Zamiast rysować pojedyncze komórki, dot plot je agreguje. Umieszczasz swoje grupy komórek, na przykład klastry Leiden, na jednej osi, a interesujące cię geny na drugiej. Na każdym przecięciu dostajesz kółko. I tu jest kluczowa sprawa. Dot plot koduje dwie zupełnie różne informacje w tym jednym kółku. Po pierwsze, kolor kropki reprezentuje średni poziom ekspresji genu w tych komórkach. Ciemniejsze lub bardziej intensywne kolory oznaczają wyższą ekspresję. Po drugie, rozmiar kropki reprezentuje odsetek komórek w tym klastrze, które w ogóle wykazują ekspresję tego genu. Duża kropka oznacza, że prawie każda komórka w klastrze ma przynajmniej trochę RNA dla tego genu. Malutka kropka oznacza, że tylko kilka komórek wykazuje jego ekspresję. To podwójne kodowanie jest niesamowicie potężne w przypadku rzadkich danych. Oddziela to, jak dużo genu jest obecne, od tego, jak szeroko jest on rozłożony. Powiedzmy, że analizujesz piętnaście kandydujących genów markerowych w pięciu klastrach Leiden. Przekazujesz swoje dane, listę genów i etykiety klastrów do funkcji dot plot. Możesz natychmiast zobaczyć, czy twoje oczekiwane markery monocytów wykazują zarówno wysoką, jak i szeroką ekspresję w klastrze pierwszym, podczas gdy w pozostałych czterech klastrach są całkowicie nieobecne. Nie musisz mrużyć oczu, patrząc na poszczególne wiersze komórek. Duże, ciemne kropki w wierszu klastra pierwszego dają ci natychmiastową walidację. Czasami nie potrzebujesz informacji o częstotliwości, którą daje rozmiar kropki. Chcesz po prostu czystej siatki pokazującej średnią ekspresję. Do tego Scanpy oferuje funkcję matrix plot. Pomyśl o matrix plot jak o pogrupowanej heatmapie. Nadal agreguje twoje komórki według klastra, ale wypełnia cały kwadrat siatki kolorem reprezentującym średnią wartość ekspresji. Nie ma tu zmieniających się rozmiarów kropek. To szybszy, gęstszy sposób na weryfikację szerokich wzorców ekspresji, gdy masz ogromną listę genów, a odsetek komórek wykazujących ekspresję ma dla ciebie mniejsze znaczenie. Oba narzędzia przyjmują twój data object, listę genów docelowych i kategorię metadanych, po której chcesz grupować. Wykonują się szybko i pięknie skalują się do dziesiątek genów. Kiedy masz do czynienia z rzadkością danych single-cell, oddzielenie intensywności ekspresji od częstotliwości ekspresji to najpewniejszy sposób, by potwierdzić, że gen markerowy faktycznie definiuje klaster. To wszystko w tym odcinku. Dzięki za wysłuchanie i kodujcie dalej!
13

Eksploracja rozmaitości za pomocą Diffusion Maps

3m 58s

Wprowadzamy Diffusion Maps, potężną technikę osadzania (embedding) dla ciągłych danych biologicznych. Zestawiamy ją z UMAP, wyjaśniając, dlaczego dyfuzja lepiej nadaje się do analizy różnicowania komórkowego. Dowiesz się, jak wizualizować ciągłe przejścia i procesy rozwojowe.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Analiza Single-Cell w Scanpy, odcinek 13 z 16. UMAP jest fantastyczny do oddzielania odrębnych typów komórek, ale potrafi brutalnie rozerwać ciągłe procesy biologiczne. Kiedy badasz rozwój komórkowy, nie chcesz widzieć rozłącznych wysp komórek; musisz zobaczyć płynne kontinuum zmian stanu. Eksploracja manifoldów za pomocą Diffusion Maps rozwiązuje dokładnie ten problem. W Scanpy obliczasz to za pomocą narzędzia diffmap. Użytkownicy często domyślnie wybierają UMAP do każdej redukcji wymiarowości. Musisz zrozumieć, że UMAP to technika embeddingu zoptymalizowana pod kątem znajdowania odrębnych klastrów i zachowywania lokalnych sąsiedztw. Diffusion Maps są zupełnie inne. Zachowują ciągłe, matematyczne prawdopodobieństwo przejścia między stanami. To czyni je idealnym wyborem do analizy ciągłych procesów, takich jak różnicowanie komórkowe. Algorytm diffmap traktuje manifold twoich danych jako ciągłą sieć. Opiera się całkowicie na nearest neighbor graph twoich komórek. Kiedy ten graf jest już gotowy, algorytm symuluje random walk po połączeniach. Pomyśl o tym jak o modelowaniu procesu dyfuzji, podobnie jak ciepło rozprzestrzenia się w fizycznym materiale. Algorytm ocenia, jak łatwo sygnał może przemieszczać się przez gęste obszary twoich danych. Oblicza prawdopodobieństwo przejścia z jednego stanu komórki do drugiego w określonej liczbie kroków. Komórki, które mają wysokie prawdopodobieństwo przejścia, są umieszczane bliżej siebie w końcowej przestrzeni o niższej wymiarowości. Wyobraź sobie śledzenie krwiotwórczej komórki macierzystej różnicującej się w erytrocyt. Jeśli zrobisz projekcję tych danych używając embeddingu, który faworyzuje dyskretną separację, pośrednie komórki progenitorowe często zostaną wciśnięte w sztuczne, oddzielne klastry. Leżąca u podstaw matematyka rozbija biologiczną oś czasu. Jeśli zamiast tego uruchomisz diffmap, algorytm obliczy prawdopodobieństwa przejścia wzdłuż całej ścieżki rozwoju. Rezultatem jest płynna, ciągła trajektoria. Komórka macierzysta znajduje się na jednym końcu, a dojrzały erytrocyt na drugim. Każdy stan pośredni jest naniesiony na połączoną ścieżkę, bazując ściśle na prawdopodobieństwie zmiany stanu. Nie patrzysz na izolowane migawki odrębnych typów komórek. Patrzysz na płynne zdarzenie biologiczne. Zastosowanie tego w Scanpy wymaga trzymania się sztywnej sekwencji. Najpierw musisz obliczyć neighborhood graph w swoim obiekcie. Diffusion map nie zadziała bez tych wstępnie obliczonych połączeń sąsiadów. Następnie wywołujesz narzędzie diffmap i przekazujesz mu swój obiekt AnnData. Opcjonalnie możesz określić liczbę components, które chcesz obliczyć, co ustawia wymiary wyniku. Scanpy oblicza diffusion map i zapisuje nowe współrzędne w wielowymiarowym atrybucie obserwacji twojego obiektu, pod kluczem X diffmap. Narzędzie zapisuje również eigenvalues w atrybucie danych nieustrukturyzowanych. Te wartości mówią ci, ile wariancji przechwytuje każdy diffusion component. Gwałtowny spadek tych eigenvalues wskazuje, że uchwyciłeś najważniejsze przejścia biologiczne, a kolejne components to prawdopodobnie szum. W typowym zbiorze danych z różnicowania, pierwszy nietrywialny diffusion component pokrywa się bezpośrednio z główną osią czasu rozwoju. Oto kluczowy wniosek. W diffusion map, fizyczna odległość między dwiema komórkami na wykresie nie jest jedynie ogólną miarą podobieństwa transkryptomicznego. Ta odległość wprost reprezentuje matematyczne prawdopodobieństwo wystąpienia biologicznego przejścia między tymi dwoma konkretnymi stanami. To wszystko na dzisiaj. Do usłyszenia następnym razem!
14

Abstrakcyjne grafy za pomocą PAGA

3m 42s

Ten odcinek dotyczy abstrakcji grafów opartej na partycjach, czyli PAGA. Omawiamy, jak mierzyć rzeczywistą łączność między klastrami, aby zachować globalną topologię. Dowiesz się, jak używać PAGA do odkrywania prawdziwych relacji pokrewieństwa ukrytych w twoich danych.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 14 z 16. To, że dwa klastry komórek leżą obok siebie na plocie UMAP, nie oznacza, że są biologicznie powiązane. Wizualna bliskość w dwóch wymiarach to często matematyczna iluzja. Jeśli polegasz na niej przy wyznaczaniu trajektorii rozwojowych, możesz połączyć punkty, które wcale się nie stykają w przestrzeni wielowymiarowej. Aby zmapować rzeczywiste, poparte statystyką powiązania, potrzebujesz Abstracted Graphs z PAGA. PAGA to skrót od Partition-based Graph Abstraction. Od razu musimy rozwiać pewne powszechne nieporozumienie. PAGA to nie jest embedding do redukcji wymiarowości, jak t-SNE czy UMAP. Nie oblicza współrzędnych dla pojedynczych komórek, żeby narysować scatter plot. Zamiast tego, PAGA tworzy uproszczony, gruboziarnisty graf. Węzły w tym grafie to całe klastry, czyli partycje komórek. Krawędzie łączące te węzły reprezentują statystyczną pewność, że te klastry współdzielą ciągłą granicę. Kiedy wywołujesz funkcję PAGA na swoich zannotowanych danych, wskazujesz jej konkretny zestaw etykiet grup, zazwyczaj twoje klastry Leiden lub Louvain. Algorytm następnie ocenia granice między tymi grupami, zagłębiając się w bazowy single-cell neighborhood graph. Sprawdza pojedyncze komórki w klastrze A i zlicza, ilu z ich bezpośrednich sąsiadów należy do klastra B. Zliczając wszystkie te połączenia między klastrami i porównując je z modelem losowym, PAGA generuje mierzalną macierz connectivity. Wysoka wartość oznacza, że klastry są ze sobą mocno splecione, co sugeruje biologiczne przejście. Niska wartość oznacza, że to oddzielne wyspy. Weźmy pod uwagę konkretny scenariusz. Śledzisz rozwój komórek odpornościowych i musisz udowodnić, że konkretny klaster progenitorowy bezpośrednio daje początek klastrowi efektorowych limfocytów T. Na standardowym plocie, algorytm layoutu może wrzucić zupełnie niepowiązany klaster dokładnie między nie, przez co ich relacja będzie wyglądać na pośrednią. Analizując macierz connectivity PAGA, omijasz to wizualne zniekształcenie. Patrzysz bezpośrednio na matematyczną wagę krawędzi między twoimi grupami progenitorowymi i efektorowymi. PAGA pozwala ci ustawić minimalny próg connectivity. Kiedy zastosujesz ten próg, odfiltrujesz fałszywe połączenia o niskiej pewności. Jeśli silna krawędź między twoimi dwoma docelowymi klastrami przetrwa to cięcie, masz ustalone statystycznie solidne powiązanie. I to jest ta najważniejsza część. PAGA nie tylko istnieje obok twoich embeddingów; potrafi je naprawić. Ponieważ PAGA tak niezawodnie zachowuje globalną topologię, możesz użyć tego wyabstrahowanego grafu do zainicjowania embeddingu UMAP. Zamiast pozwalać algorytmowi UMAP startować z losowego layoutu przestrzennego, mówisz mu, żeby pozycjonował pojedyncze komórki na podstawie gruboziarnistego grafu PAGA. To zakotwicza twoją końcową, dwuwymiarową wizualizację w prawdziwej, wielowymiarowej rzeczywistości, dając pewność, że odległe stany biologiczne nie zostaną sztucznie ściśnięte ze sobą. Wizualizacje zawsze będą zniekształcać złożone dane, żeby zmieścić je na płaskim ekranie, ale abstrakcja w postaci neighborhood graph opiera się wyłącznie na matematycznej bliskości. Zaufaj grafowi, a nie obrazkowi. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
15

Wnioskowanie o trajektoriach za pomocą DPT

3m 34s

Omawiamy wnioskowanie o trajektoriach przy użyciu Diffusion Pseudotime (DPT). Wyjaśniamy, jak wyznaczyć komórkę źródłową (root cell) i obliczyć odległości geodezyjne w grafie komórkowym. Dowiesz się, jak ułożyć komórki wzdłuż ciągłej osi czasu rozwoju.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Scanpy Single-Cell Analysis, odcinek 15 z 16. Sekwencjonowanie single-cell niszczy dokładnie tę komórkę, którą próbujesz zbadać. Dostajesz statyczny snapshot ekspresji jej genów, co oznacza, że nie możesz nagrać wideo, jak komórka macierzysta różnicuje się do dojrzałego stanu. Żeby zobaczyć tę ścieżkę rozwoju, musisz matematycznie wywnioskować oś czasu, obliczając dystanse transkryptomowe. Właśnie to robimy, używając Trajectory Inference z DPT. DPT to skrót od Diffusion Pseudotime. Zanim przyjrzymy się, jak działa ten algorytm, musimy wyjaśnić, co ta nazwa tak naprawdę oznacza. Pseudotime to nie jest prawdziwy czas chronologiczny. Nie mierzy godzin, dni ani biologicznego wieku komórki. To po prostu metryka dystansu transkryptomowego. Mierzy, ile inkrementalnych zmian ekspresji przeszła komórka względem określonego punktu początkowego. Żeby uruchomić to w Scanpy, używasz funkcji sc dot tl dot dpt. Ta funkcja operuje na istniejącym neighborhood graph twojego datasetu, który łączy komórki na podstawie ich podobieństwa. Jednak sam graf nie ma z góry określonego kierunku. Żeby nadać mu kierunek, musisz zdefiniować punkt początkowy. Robisz to, ustawiając root cell. Wyobraź sobie scenariusz, w którym badasz rozwój krwi. Analizujesz swoje klastry i identyfikujesz naiwne krwiotwórcze komórki macierzyste. Wybierasz konkretny index komórki z tej grupy i przypisujesz go jako root w strukturze twojego datasetu. Działa to jako punkt początkowy, czyli czas zero, dla całych obliczeń. Kiedy root jest już ustalony, odpalasz funkcję DPT. I tu jest kluczowa sprawa. Algorytm nie mierzy prostej, liniowej odległości między rootem a inną komórką. Rozwój biologiczny to nie jest prosta linia; podąża złożonymi, rozgałęziającymi się ścieżkami. Żeby to uchwycić, DPT oblicza dystanse geodezyjne wzdłuż twojego neighborhood graph. Ocenia strukturę danych, symulując random walks od roota. Przechodzi od komórki do komórki po gęstych krawędziach grafu, znajdując najbardziej prawdopodobne ścieżki zmian transkryptomowych. Wynikiem tych obliczeń jest nowy array wartości dodany do twoich adnotacji komórek. Każda pojedyncza komórka w twoim datasecie otrzymuje pseudotime score. Root cell znajduje się na poziomie zera. Wraz ze wzrostem dystansu geodezyjnego od roota, score rośnie. W naszym scenariuszu rozwoju krwi, pośrednia komórka progenitorowa może dostać score zero przecinek cztery, podczas gdy w pełni dojrzała komórka na samym końcu gałęzi dostaje score bliski jeden. W ten sposób skutecznie zmapowałeś statyczny klaster kropek na ciągłe uporządkowanie rozwojowe, sortując je od najmniej do najbardziej zróżnicowanych. Możesz teraz użyć tej osi liczbowej do śledzenia dynamiki poszczególnych genów, plotując dokładnie, kiedy konkretny czynnik transkrypcyjny aktywuje się na ścieżce rozwojowej. Niezawodność twojego Trajectory Inference zależy całkowicie od punktu początkowego, co oznacza, że nieprawidłowo wybrany root da idealnie obliczoną, ale biologicznie bezsensowną oś czasu. Jeśli uważasz te odcinki za pomocne i chcesz wesprzeć podcast, możesz wyszukać DevStoriesEU na Patreonie. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
16

Eksperymentalne skalowanie za pomocą Dask

3m 51s

W naszym ostatnim odcinku przyglądamy się eksperymentalnej granicy Scanpy: skalowaniu za pomocą Dask. Wyjaśniamy, jak radzić sobie ze zbiorami danych, które przekraczają pamięć RAM twojego komputera, wykorzystując leniwe wartościowanie (lazy evaluation) i przetwarzanie out-of-core. Dziękujemy, że dołączyłeś do nas w tym dogłębnym kursie Scanpy!

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Analiza Single-Cell w Scanpy, odcinek 16 z 16. Co się stanie, gdy twój dataset single-cell osiągnie pięć milionów komórek i całkowicie wyczerpie pamięć komputera? Nie możesz go przefiltrować, nie możesz go znormalizować, a twój kernel po prostu crashuje. Rozwiązaniem tego twardego limitu pamięci jest eksperymentalny scale-up z użyciem Dask. Ludzie często słyszą Dask i od razu myślą o przetwarzaniu równoległym na rozproszonym klastrze, żeby przyspieszyć kod. Choć Dask to potrafi, jego główną supermocą w Scanpy jest teraz zarządzanie pamięcią out-of-core poprzez lazy evaluation. Nie chodzi tylko o to, żeby robić rzeczy szybciej. Chodzi o robienie rzeczy, które wcześniej były niemożliwe na pojedynczej maszynie. Standardowe workflowy w Scanpy opierają się na tablicach in-memory. Wymaga to, aby cały dataset znajdował się w twoim aktywnym RAM-ie. Kiedy używasz backendu Dask, Scanpy zastępuje te standardowe tablice w twoim obiekcie AnnData tablicami Dask. Tablica Dask to w zasadzie zbiór wielu mniejszych tablic, nazywanych chunkami. Zamiast ładować całą macierz do pamięci na raz, Dask zostawia większość danych bezpiecznie na dysku. Kiedy odpalasz funkcję do preprocessingu w Scanpy wspieraną przez Dask, wynik nie jest obliczany od razu. I tu właśnie wkracza lazy evaluation. Zamiast przeliczać liczby, Dask tworzy przepis. Tworzy task graph, który dokładnie opisuje, jakie operacje matematyczne muszą być wykonane na każdym pojedynczym chunku danych. Wyobraź sobie scenariusz, w którym masz na dysku ogromny dataset z dwoma milionami komórek i musisz policzyć metryki quality control. Jeśli spróbujesz tego ze standardową tablicą, twój system się zawiesi, próbując wciągnąć wszystko do RAM-u. Ale jeśli twój obiekt AnnData zawiera tablicę Dask, po prostu wywołujesz standardową funkcję quality control ze Scanpy. Funkcja zwraca wynik niemal natychmiast. Zużycie pamięci nie skacze, ponieważ żadne liczby nie zostały jeszcze tak naprawdę przetworzone. Scanpy po prostu odnotował twoją intencję. Kiedy w końcu jesteś gotowy, żeby wyplotować te metryki albo zapisać statystyki podsumowujące, jawnie mówisz Daskowi, żeby obliczył wynik. To jest ta najważniejsza część. Dokładnie w tym momencie Dask pobiera pierwszy chunk danych z twojego dysku twardego, oblicza metryki tylko dla tego chunka, zapisuje ten mały wynik, a następnie natychmiast wyrzuca surowy chunk danych z pamięci. Potem przechodzi do kolejnego chunka. Twój aktywny memory footprint pozostaje malutki. Zależy on wyłącznie od rozmiaru pojedynczego chunka, a nie od milionów komórek w całym datassecie. Obecnie ten backend Dask w Scanpy ma status eksperymentalnego. Nie każda funkcja w ekosystemie już go wspiera. Jednak kluczowe kroki preprocessingu, takie jak normalizacja, skalowanie i selekcja highly variable genes, są w pełni przystosowane do obsługi masowych operacji out-of-core. Kiedy przechodzisz z eager processing w pamięci na lazy processing na dysku, rozmiar twojego datasetu nie jest już ograniczony przez twój sprzętowy RAM, a jedynie przez twoją cierpliwość. I tak dotarliśmy do końca naszej serii o single-cell. Gorąco zachęcam cię do przejrzenia oficjalnej dokumentacji Scanpy i spróbowania samodzielnego budowania tych grafów danych w praktyce. Jeśli masz pomysły na to, jakie technologie powinniśmy omówić w naszej następnej serii, wejdź na devstories dot eu i daj nam znać. Dzięki za wysłuchanie, happy coding wszystkim!