Knowledge transfer¶
Reference construction¶
Generating training data for MIDAS¶
Generating reference dataset for evaluating knowledge transfer, where the dogma datasets are excluded:
Rscript preprocess/combine_subsets.R --task atlas_no_dogma && py preprocess/split_mat.py --task atlas_no_dogma &
Training MIDAS¶
CUDA_VISIBLE_DEVICES=5 py run.py --exp e0 --task atlas_no_dogma
Inferring latent variables, and generating imputed and batch corrected counts¶
CUDA_VISIBLE_DEVICES=1 py run.py --task atlas_no_dogma --act predict_all_latent_bc --init_model sp_latest &
Mosaic integration with fewer modalities¶
The goal of this experiment is to generate the baseline for transfer learning comparison.
Generating training data for MIDAS¶
Rscript preprocess/combine_subsets.R --task dogma_single_atac && py preprocess/split_mat.py --task dogma_single_atac &
Rscript preprocess/combine_subsets.R --task dogma_single_rna && py preprocess/split_mat.py --task dogma_single_rna &
Rscript preprocess/combine_subsets.R --task dogma_single_adt && py preprocess/split_mat.py --task dogma_single_adt &
Rscript preprocess/combine_subsets.R --task dogma_paired_a && py preprocess/split_mat.py --task dogma_paired_a &
Rscript preprocess/combine_subsets.R --task dogma_paired_b && py preprocess/split_mat.py --task dogma_paired_b &
Rscript preprocess/combine_subsets.R --task dogma_paired_c && py preprocess/split_mat.py --task dogma_paired_c &
Training MIDAS¶
De novo training on the additional dogma mosaic datasets (for comparison):
CUDA_VISIBLE_DEVICES=0 py run.py --exp e0 --task dogma_single_atac &
CUDA_VISIBLE_DEVICES=1 py run.py --exp e0 --task dogma_single_rna &
CUDA_VISIBLE_DEVICES=2 py run.py --exp e0 --task dogma_single_adt &
CUDA_VISIBLE_DEVICES=3 py run.py --exp e0 --task dogma_paired_a &
CUDA_VISIBLE_DEVICES=4 py run.py --exp e0 --task dogma_paired_b &
CUDA_VISIBLE_DEVICES=5 py run.py --exp e0 --task dogma_paired_c &
Inferring latent variables, and generating imputed and batch corrected counts¶
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_single_atac --act predict_all_latent_bc --init_model sp_00001899 --exp e0 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_single_rna --act predict_all_latent_bc --init_model sp_00001899 --exp e0 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_single_adt --act predict_all_latent_bc --init_model sp_00001899 --exp e0 &
CUDA_VISIBLE_DEVICES=3 py run.py --task dogma_paired_a --act predict_all_latent_bc --init_model sp_00001899 --exp e0 &
CUDA_VISIBLE_DEVICES=4 py run.py --task dogma_paired_b --act predict_all_latent_bc --init_model sp_00001899 --exp e0 &
CUDA_VISIBLE_DEVICES=5 py run.py --task dogma_paired_c --act predict_all_latent_bc --init_model sp_00001899 --exp e0 &
Model transfer¶
Generating training data for MIDAS¶
Generating 14 different dogma mosaic datasets for querying:
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_full_transfer && py preprocess/split_mat.py --task dogma_full_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_full_transfer && py preprocess/split_mat.py --task dogma_paired_full_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_single_full_transfer && py preprocess/split_mat.py --task dogma_single_full_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_abc_transfer && py preprocess/split_mat.py --task dogma_paired_abc_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_ab_transfer && py preprocess/split_mat.py --task dogma_paired_ab_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_ac_transfer && py preprocess/split_mat.py --task dogma_paired_ac_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_bc_transfer && py preprocess/split_mat.py --task dogma_paired_bc_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_single_transfer && py preprocess/split_mat.py --task dogma_single_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_single_atac_transfer && py preprocess/split_mat.py --task dogma_single_atac_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_single_rna_transfer && py preprocess/split_mat.py --task dogma_single_rna_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_single_adt_transfer && py preprocess/split_mat.py --task dogma_single_adt_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_a_transfer && py preprocess/split_mat.py --task dogma_paired_a_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_b_transfer && py preprocess/split_mat.py --task dogma_paired_b_transfer &
Rscript preprocess/combine_unseen.R --reference atlas_no_dogma --task dogma_paired_c_transfer && py preprocess/split_mat.py --task dogma_paired_c_transfer &
Training MIDAS¶
Transfer learning on query dogma mosaic datasets:
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_full_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_paired_full_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_paired_abc_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=3 py run.py --task dogma_paired_ab_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=4 py run.py --task dogma_paired_ac_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=5 py run.py --task dogma_paired_bc_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=6 py run.py --task dogma_single_full_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=7 py run.py --task dogma_single_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_single_atac_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_single_rna_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_single_adt_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_paired_a_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_paired_b_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_paired_c_transfer --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
Inferring latent variables, and generating imputed and batch corrected counts¶
tasks=(full paired_full paired_abc paired_ab paired_ac paired_bc single_full single single_atac single_rna single_adt paired_a paired_b paired_c)
for i in "${!tasks[@]}"; do
CUDA_VISIBLE_DEVICES=$((i % 8)) py run.py --task "dogma_"${tasks[$i]}"_transfer" --ref atlas_no_dogma --act predict_all_latent_bc --init_model sp_00003699 &
done
Evaluation¶
UMAP visualization of the joint embeddings generated by MIDAS in mosaic integration:
data=dogma
tasks=(full paired_full single_full paired_abc paired_ab paired_ac paired_bc single paired_a paired_b paired_c single_atac single_rna single_adt)
for task in "${tasks[@]}"; do
Rscript comparison/midas_embed.r --exp e0 --init_model sp_00003699 --task $data"_"$task"_transfer" &
done
UMAP visualization of the modality embeddings and joint embeddings generated by MIDAS in mosaic integration:
data=dogma
tasks=(full paired_full paired_abc paired_ab paired_ac paired_bc single_full single paired_a paired_b paired_c single_atac single_rna single_adt)
for task in "${tasks[@]}"; do
Rscript comparison/vis_z_mosaic_split.r --init_model sp_00003699 --task $data"_"$task"_transfer" &
done
Computing batch correction and biological conservation metrics of MIDAS on feature space (required by scMIB):
# generate wnn graph for evaluation
data=dogma
tasks=(full paired_full paired_abc paired_ab paired_ac paired_bc single_full single)
inits=(sp_00003699)
for init in "${inits[@]}"; do
for i in "${!tasks[@]}"; do
Rscript comparison/midas_feat+wnn.r --exp e0 --task $data"_"${tasks[$i]}"_transfer" --init_model $init &
done
done
# evaluate using wnn graph
for init in "${inits[@]}"; do
for i in "${!tasks[@]}"; do
py eval/benchmark_batch_bio.py --method midas_feat+wnn --exp e0 --task $data"_"${tasks[$i]}"_transfer" --init_model $init &
done
done
Computing batch correction and biological conservation metrics of MIDAS on embedding space (required by scIB and scMIB):
data=dogma
tasks=(full paired_full paired_abc paired_ab paired_ac paired_bc single_full single single_atac single_rna single_adt paired_a paired_b paired_c)
inits=(sp_00003699)
for init in "${inits[@]}"; do
for i in "${!tasks[@]}"; do
py eval/benchmark_batch_bio.py --method midas_embed --exp e0 --task $data"_"${tasks[$i]}"_transfer" --init_model $init &
done
done
Computing modality alignment metrics of MIDAS (required by scMIB):
# enerate ground-truth dogma_full datasets for scMIB modality alignment evaluation, which use the features of mosaic datasets
Rscript preprocess/combine_unseen.R --reference dogma_full_transfer --task dogma_full_ref_full_transfer && py preprocess/split_mat.py --task dogma_full_ref_full_transfer &
Rscript preprocess/combine_unseen.R --reference dogma_paired_full_transfer --task dogma_full_ref_paired_full_transfer && py preprocess/split_mat.py --task dogma_full_ref_paired_full_transfer &
Rscript preprocess/combine_unseen.R --reference dogma_single_full_transfer --task dogma_full_ref_single_full_transfer && py preprocess/split_mat.py --task dogma_full_ref_single_full_transfer &
Rscript preprocess/combine_unseen.R --reference dogma_paired_abc_transfer --task dogma_full_ref_paired_abc_transfer && py preprocess/split_mat.py --task dogma_full_ref_paired_abc_transfer &
Rscript preprocess/combine_unseen.R --reference dogma_paired_ab_transfer --task dogma_full_ref_paired_ab_transfer && py preprocess/split_mat.py --task dogma_full_ref_paired_ab_transfer &
Rscript preprocess/combine_unseen.R --reference dogma_paired_ac_transfer --task dogma_full_ref_paired_ac_transfer && py preprocess/split_mat.py --task dogma_full_ref_paired_ac_transfer &
Rscript preprocess/combine_unseen.R --reference dogma_paired_bc_transfer --task dogma_full_ref_paired_bc_transfer && py preprocess/split_mat.py --task dogma_full_ref_paired_bc_transfer &
Rscript preprocess/combine_unseen.R --reference dogma_single_transfer --task dogma_full_ref_single_transfer && py preprocess/split_mat.py --task dogma_full_ref_single_transfer &
# perform modality translation
data=dogma
tasks=(full paired_full paired_abc paired_ab paired_ac paired_bc single_full single)
inits=(sp_00003699)
act=translate
for init in "${inits[@]}"; do
for i in "${!tasks[@]}"; do
CUDA_VISIBLE_DEVICES=$i py run.py --task $data"_full_ref_"${tasks[$i]}"_transfer" --ref $data"_"${tasks[$i]}"_transfer" --act $act --init_model $init --init_from_ref 1 --exp e0 &
done
done
# compute metrics
for init in "${inits[@]}"; do
for i in "${!tasks[@]}"; do
py eval/benchmark_mod.py --method midas_embed --exp e0 --task ${data}_${tasks[$i]}_transfer --init_model $init
done
done
scMIB comparison of MIDAS mosaic integration results:
tasks="dogma_full_transfer dogma_paired_full_transfer dogma_paired_abc_transfer dogma_paired_ab_transfer dogma_paired_ac_transfer dogma_paired_bc_transfer dogma_single_full_transfer dogma_single_transfer"
py eval/combine_metrics_scmib.py --tasks $tasks --init_model sp_00003699
scIB comparison of MIDAS mosaic integration results and SOTA rectangular integration results:
tasks="dogma_full_transfer dogma_paired_full_transfer dogma_paired_abc_transfer dogma_paired_ab_transfer dogma_paired_ac_transfer dogma_paired_bc_transfer dogma_single_full_transfer dogma_single_transfer
dogma_single_atac_transfer dogma_single_rna_transfer dogma_single_adt_transfer dogma_paired_a_transfer dogma_paired_b_transfer dogma_paired_c_transfer"
py eval/combine_metrics_scib.py --tasks $tasks --init_model sp_00003699 --mosaic 1 --sota 1
Label transfer¶
Reciprocal reference mapping for query dogma mosaic datasets¶
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_full_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_paired_full_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_paired_abc_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_paired_ab_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_paired_ac_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_paired_bc_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_single_full_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_single_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_single_atac_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_single_rna_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_single_adt_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=0 py run.py --task dogma_paired_a_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=1 py run.py --task dogma_paired_b_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
CUDA_VISIBLE_DEVICES=2 py run.py --task dogma_paired_c_continual --ref atlas_no_dogma --init_model sp_latest --init_from_ref 1 --epoch 4000 &
Inferring latent variables, and generating imputed and batch corrected counts¶
tasks=(full paired_full paired_abc paired_ab paired_ac paired_bc single_full single single_atac single_rna single_adt paired_a paired_b paired_c)
for i in "${!tasks[@]}"; do
CUDA_VISIBLE_DEVICES=$((i % 8)) py run.py --task "dogma_"${tasks[$i]}"_continual" --ref atlas_no_dogma --act predict_joint --init_model sp_00003799 &
done
Evaluation¶
Performing query-to-reference mapping for comparison:
tasks=(full paired_full paired_abc paired_ab paired_ac paired_bc single_full single single_atac single_rna single_adt paired_a paired_b paired_c)
for i in "${!tasks[@]}"; do
CUDA_VISIBLE_DEVICES=$i py run.py --task "dogma_"${tasks[$i]}"_transfer" --ref atlas_no_dogma --init_from_ref 1 --act predict_joint --init_model sp_00001999 --drop_s 1 &
done
Computing the micro F1-scores of different mapping strategies:
# query-to-reference mapping
for i in "${!tasks[@]}"; do
py eval/benchmark_transfer.py --task "dogma_"${tasks[$i]}"_transfer" --init_model sp_00001999 &
done
# reference-to-query mapping
for i in "${!tasks[@]}"; do
py eval/benchmark_transfer.py --task "dogma_"${tasks[$i]}"_transfer" --init_model sp_00003699 &
done
# reciprocal reference mapping
for i in "${!tasks[@]}"; do
py eval/benchmark_continual.py --task "dogma_"${tasks[$i]}"_continual" --ref atlas_no_dogma --init_model sp_00003799 &
done