Subset policy#

This example shows how to use different policies.

A policy is the rule which sets of transport maps are computed given different distributions of cells. Some problem classes require a certain policy, e.g., the MappingProblem only works with the ExternalStarPolicy meaning that all spatial batches from the AnnData object are mapped to the same single cell reference cell distribution.

Each problem class has a set of valid policies. For the LineageProblem and the TemporalProblem, we can choose among different policies as demonstrated below.

See also

  • TODO: link to other relevant examples

Imports and data loading#

from moscot import datasets
from moscot.problems.time import TemporalProblem

Simulate data using simulate_data().

adata = datasets.simulate_data(n_distributions=4, key="day")
adata
AnnData object with n_obs × n_vars = 80 × 60
    obs: 'day', 'celltype'

This simulated dataset contains single cell data across 4 time points (0–3). The policy allows us to determine which transport maps we want to compute.

TemporalProblem policies#

SequentialPolicy#

We start with the default policy, which is the SequentialPolicy. The following code shows which optimal transport (OT) problems are prepared to be solved.

We see that all consecutive pairs of values in the time_key column are used to create an OT problem.

tp_sequential = TemporalProblem(adata)
tp_sequential = tp_sequential.prepare(time_key="day", policy="sequential")
tp_sequential.problems
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
{(0, 1): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (1, 2): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (2, 3): BirthDeathProblem[stage='prepared', shape=(20, 20)]}

TriangularPolicy#

tp_triu = TemporalProblem(adata)
tp_triu = tp_triu.prepare(time_key="day", policy="triu")
tp_triu.problems
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
{(0, 1): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (1, 2): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (0, 3): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (2, 3): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (0, 2): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (1, 3): BirthDeathProblem[stage='prepared', shape=(20, 20)]}

ExplicitPolicy#

tp_expl = TemporalProblem(adata)
tp_expl = tp_expl.prepare(
    time_key="day", policy="explicit", subset=[(0, 1), (0, 3), (1, 3)]
)
tp_expl.problems
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
INFO     Computing pca with `n_comps=30` for `xy` using `adata.X`                                                  
{(0, 1): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (0, 3): BirthDeathProblem[stage='prepared', shape=(20, 20)],
 (1, 3): BirthDeathProblem[stage='prepared', shape=(20, 20)]}