def test_scvi_library_size_update(save_path): n_latent = 5 adata1 = synthetic_iid() model = SCVI(adata1, n_latent=n_latent, use_observed_lib_size=False) assert (getattr(model.module, "library_log_means", None) is not None and model.module.library_log_means.shape == (1, 2) and model.module.library_log_means.count_nonzero().item() == 2) assert getattr( model.module, "library_log_vars", None) is not None and model.module.library_log_vars.shape == (1, 2) model.train(1, check_val_every_n_epoch=1) dir_path = os.path.join(save_path, "saved_model/") model.save(dir_path, overwrite=True) # also test subset var option adata2 = synthetic_iid(run_setup_anndata=False, n_genes=110) adata2.obs["batch"] = adata2.obs.batch.cat.rename_categories( ["batch_2", "batch_3"]) model2 = SCVI.load_query_data(adata2, dir_path, inplace_subset_query_vars=True) assert (getattr(model2.module, "library_log_means", None) is not None and model2.module.library_log_means.shape == (1, 4) and model2.module.library_log_means[:, :2].equal( model.module.library_log_means) and model2.module.library_log_means.count_nonzero().item() == 4) assert (getattr(model2.module, "library_log_vars", None) is not None and model2.module.library_log_vars.shape == (1, 4) and model2.module.library_log_vars[:, :2].equal( model.module.library_log_vars))
def test_save_best_state_callback(save_path): n_latent = 5 adata = synthetic_iid() SCVI.setup_anndata(adata, batch_key="batch", labels_key="labels") model = SCVI(adata, n_latent=n_latent) callbacks = [SaveBestState(verbose=True)] model.train(3, check_val_every_n_epoch=1, train_size=0.5, callbacks=callbacks)
def test_save_best_state_callback(save_path): n_latent = 5 adata = synthetic_iid() model = SCVI(adata, n_latent=n_latent) callbacks = [SaveBestState(verbose=True)] model.train(3, check_val_every_n_epoch=1, train_size=0.5, callbacks=callbacks)
def unsupervised_training_one_epoch( adata: AnnData, run_setup_anndata: bool = True, batch_key: Optional[str] = None, labels_key: Optional[str] = None, ): if run_setup_anndata: SCVI.setup_anndata(adata, batch_key=batch_key, labels_key=labels_key) m = SCVI(adata) m.train(1, train_size=0.4, use_gpu=use_gpu)
def test_solo(save_path): n_latent = 5 adata = synthetic_iid(run_setup_anndata=False) setup_anndata(adata) model = SCVI(adata, n_latent=n_latent) model.train(1, check_val_every_n_epoch=1, train_size=0.5) solo = SOLO.from_scvi_model(model) solo.train(1, check_val_every_n_epoch=1, train_size=0.9) assert "validation_loss" in solo.history.keys() solo.predict()
def test_solo_multiple_batch(save_path): n_latent = 5 adata = synthetic_iid() setup_anndata(adata, batch_key="batch") model = SCVI(adata, n_latent=n_latent) model.train(1, check_val_every_n_epoch=1, train_size=0.5) solo = SOLO.from_scvi_model(model, restrict_to_batch="batch_0") solo.train(1, check_val_every_n_epoch=1, train_size=0.9) assert "validation_loss" in solo.history.keys() solo.predict()
def test_early_stopping(): n_epochs = 100 adata = synthetic_iid(run_setup_anndata=False, ) SCVI.setup_anndata( adata, batch_key="batch", labels_key="labels", ) model = SCVI(adata) model.train(n_epochs, early_stopping=True, plan_kwargs=dict(lr=0)) assert len(model.history["elbo_train"]) < n_epochs
def test_backed_anndata_scvi(save_path): adata = scvi.data.synthetic_iid() path = os.path.join(save_path, "test_data.h5ad") adata.write_h5ad(path) adata = anndata.read_h5ad(path, backed="r+") setup_anndata(adata, batch_key="batch") model = SCVI(adata, n_latent=5) model.train(1, train_size=0.5) assert model.is_trained is True z = model.get_latent_representation() assert z.shape == (adata.shape[0], 5) model.get_elbo()
def test_set_seed(save_path): scvi.settings.seed = 1 n_latent = 5 adata = synthetic_iid() model1 = SCVI(adata, n_latent=n_latent) model1.train(1) scvi.settings.seed = 1 model2 = SCVI(adata, n_latent=n_latent) model2.train(1) assert torch.equal( model1.module.z_encoder.encoder.fc_layers[0][0].weight, model2.module.z_encoder.encoder.fc_layers[0][0].weight, )
def test_set_seed(save_path): scvi.settings.seed = 1 n_latent = 5 adata = synthetic_iid() SCVI.setup_anndata(adata, batch_key="batch", labels_key="labels") model1 = SCVI(adata, n_latent=n_latent) model1.train(1) scvi.settings.seed = 1 model2 = SCVI(adata, n_latent=n_latent) model2.train(1) assert torch.equal( model1.module.z_encoder.encoder.fc_layers[0][0].weight, model2.module.z_encoder.encoder.fc_layers[0][0].weight, )
def test_scvi_sparse(save_path): n_latent = 5 adata = synthetic_iid(run_setup_anndata=False) adata.X = csr_matrix(adata.X) setup_anndata(adata) model = SCVI(adata, n_latent=n_latent) model.train(1, train_size=0.5) assert model.is_trained is True z = model.get_latent_representation() assert z.shape == (adata.shape[0], n_latent) model.get_elbo() model.get_marginal_ll(n_mc_samples=3) model.get_reconstruction_error() model.get_normalized_expression() model.differential_expression(groupby="labels", group1="label_1")
def test_differential_computation(save_path): n_latent = 5 adata = synthetic_iid() model = SCVI(adata, n_latent=n_latent) model.train(1) model_fn = partial(model.get_normalized_expression, return_numpy=True) dc = DifferentialComputation(model_fn, adata) cell_idx1 = np.asarray(adata.obs.labels == "undefined_1") cell_idx2 = ~cell_idx1 dc.get_bayes_factors(cell_idx1, cell_idx2, mode="vanilla", use_permutation=True) dc.get_bayes_factors(cell_idx1, cell_idx2, mode="change", use_permutation=False) dc.get_bayes_factors(cell_idx1, cell_idx2, mode="change", cred_interval_lvls=[0.75]) delta = 0.5 def change_fn_test(x, y): return x - y def m1_domain_fn_test(samples): return np.abs(samples) >= delta dc.get_bayes_factors( cell_idx1, cell_idx2, mode="change", m1_domain_fn=m1_domain_fn_test, change_fn=change_fn_test, )
def test_differential_computation(save_path): n_latent = 5 adata = synthetic_iid() model = SCVI(adata, n_latent=n_latent) model.train(1) model_fn = partial(model.get_normalized_expression, return_numpy=True) dc = DifferentialComputation(model_fn, adata) cell_idx1 = np.asarray(adata.obs.labels == "label_1") cell_idx2 = ~cell_idx1 dc.get_bayes_factors(cell_idx1, cell_idx2, mode="vanilla", use_permutation=True) dc.get_bayes_factors(cell_idx1, cell_idx2, mode="change", use_permutation=False) dc.get_bayes_factors(cell_idx1, cell_idx2, mode="change", cred_interval_lvls=[0.75]) delta = 0.5 def change_fn_test(x, y): return x - y def m1_domain_fn_test(samples): return np.abs(samples) >= delta dc.get_bayes_factors( cell_idx1, cell_idx2, mode="change", m1_domain_fn=m1_domain_fn_test, change_fn=change_fn_test, ) # should fail if just one batch with pytest.raises(ValueError): model.differential_expression(adata[:20], groupby="batch") # test view model.differential_expression( adata[adata.obs["labels"] == "label_1"], groupby="batch" )
def test_multiple_covariates_scvi(save_path): adata = synthetic_iid() adata.obs["cont1"] = np.random.normal(size=(adata.shape[0], )) adata.obs["cont2"] = np.random.normal(size=(adata.shape[0], )) adata.obs["cat1"] = np.random.randint(0, 5, size=(adata.shape[0], )) adata.obs["cat2"] = np.random.randint(0, 5, size=(adata.shape[0], )) SCVI.setup_anndata( adata, batch_key="batch", labels_key="labels", continuous_covariate_keys=["cont1", "cont2"], categorical_covariate_keys=["cat1", "cat2"], ) m = SCVI(adata) m.train(1) m = SCANVI(adata, unlabeled_category="Unknown") m.train(1) TOTALVI.setup_anndata( adata, batch_key="batch", protein_expression_obsm_key="protein_expression", protein_names_uns_key="protein_names", continuous_covariate_keys=["cont1", "cont2"], categorical_covariate_keys=["cat1", "cat2"], ) m = TOTALVI(adata) m.train(1)
def test_scvi(save_path): n_latent = 5 adata = synthetic_iid() model = SCVI(adata, n_latent=n_latent) model.train(1, check_val_every_n_epoch=1, train_size=0.5) model = SCVI(adata, n_latent=n_latent, var_activation=Softplus()) model.train(1, check_val_every_n_epoch=1, train_size=0.5) # tests __repr__ print(model) assert model.is_trained is True z = model.get_latent_representation() assert z.shape == (adata.shape[0], n_latent) assert len(model.history["elbo_train"]) == 1 model.get_elbo() model.get_marginal_ll(n_mc_samples=3) model.get_reconstruction_error() model.get_normalized_expression(transform_batch="batch_1") adata2 = synthetic_iid() model.get_elbo(adata2) model.get_marginal_ll(adata2, n_mc_samples=3) model.get_reconstruction_error(adata2) latent = model.get_latent_representation(adata2, indices=[1, 2, 3]) assert latent.shape == (3, n_latent) denoised = model.get_normalized_expression(adata2) assert denoised.shape == adata.shape denoised = model.get_normalized_expression( adata2, indices=[1, 2, 3], transform_batch="batch_1" ) denoised = model.get_normalized_expression( adata2, indices=[1, 2, 3], transform_batch=["batch_0", "batch_1"] ) assert denoised.shape == (3, adata2.n_vars) sample = model.posterior_predictive_sample(adata2) assert sample.shape == adata2.shape sample = model.posterior_predictive_sample( adata2, indices=[1, 2, 3], gene_list=["1", "2"] ) assert sample.shape == (3, 2) sample = model.posterior_predictive_sample( adata2, indices=[1, 2, 3], gene_list=["1", "2"], n_samples=3 ) assert sample.shape == (3, 2, 3) model.get_feature_correlation_matrix(correlation_type="pearson") model.get_feature_correlation_matrix( adata2, indices=[1, 2, 3], correlation_type="spearman", rna_size_factor=500, n_samples=5, ) model.get_feature_correlation_matrix( adata2, indices=[1, 2, 3], correlation_type="spearman", rna_size_factor=500, n_samples=5, transform_batch=["batch_0", "batch_1"], ) params = model.get_likelihood_parameters() assert params["mean"].shape == adata.shape assert ( params["mean"].shape == params["dispersions"].shape == params["dropout"].shape ) params = model.get_likelihood_parameters(adata2, indices=[1, 2, 3]) assert params["mean"].shape == (3, adata.n_vars) params = model.get_likelihood_parameters( adata2, indices=[1, 2, 3], n_samples=3, give_mean=True ) assert params["mean"].shape == (3, adata.n_vars) model.get_latent_library_size() model.get_latent_library_size(adata2, indices=[1, 2, 3]) # test transfer_anndata_setup adata2 = synthetic_iid(run_setup_anndata=False) transfer_anndata_setup(adata, adata2) model.get_elbo(adata2) # test automatic transfer_anndata_setup + on a view adata = synthetic_iid() model = SCVI(adata) adata2 = synthetic_iid(run_setup_anndata=False) model.get_elbo(adata2[:10]) # test that we catch incorrect mappings adata = synthetic_iid() adata2 = synthetic_iid(run_setup_anndata=False) transfer_anndata_setup(adata, adata2) adata2.uns["_scvi"]["categorical_mappings"]["_scvi_labels"]["mapping"] = np.array( ["label_4", "label_0", "label_2"] ) with pytest.raises(ValueError): model.get_elbo(adata2) # test that same mapping different order doesn't raise error adata = synthetic_iid() adata2 = synthetic_iid(run_setup_anndata=False) transfer_anndata_setup(adata, adata2) adata2.uns["_scvi"]["categorical_mappings"]["_scvi_labels"]["mapping"] = np.array( ["label_1", "label_0", "label_2"] ) model.get_elbo(adata2) # should automatically transfer setup # test mismatched categories raises ValueError adata2 = synthetic_iid(run_setup_anndata=False) adata2.obs.labels.cat.rename_categories(["a", "b", "c"], inplace=True) with pytest.raises(ValueError): model.get_elbo(adata2) # test differential expression model.differential_expression(groupby="labels", group1="label_1") model.differential_expression( groupby="labels", group1="label_1", group2="label_2", mode="change" ) model.differential_expression(groupby="labels") model.differential_expression(idx1=[0, 1, 2], idx2=[3, 4, 5]) model.differential_expression(idx1=[0, 1, 2]) # transform batch works with all different types a = synthetic_iid(run_setup_anndata=False) batch = np.zeros(a.n_obs) batch[:64] += 1 a.obs["batch"] = batch setup_anndata(a, batch_key="batch") m = SCVI(a) m.train(1, train_size=0.5) m.get_normalized_expression(transform_batch=1) m.get_normalized_expression(transform_batch=[0, 1]) # test get_likelihood_parameters() when dispersion=='gene-cell' model = SCVI(adata, dispersion="gene-cell") model.get_likelihood_parameters() # test train callbacks work a = synthetic_iid() m = scvi.model.SCVI(a) lr_monitor = LearningRateMonitor() m.train( callbacks=[lr_monitor], max_epochs=10, log_every_n_steps=1, plan_kwargs={"reduce_lr_on_plateau": True}, ) assert "lr-Adam" in m.history.keys()
def test_scvi(): n_latent = 5 adata = synthetic_iid() model = SCVI(adata, n_latent=n_latent) model.train(1, frequency=1, train_size=0.5) assert model.is_trained is True z = model.get_latent_representation() assert z.shape == (adata.shape[0], n_latent) # len of history should be 2 since metrics is also run once at the very end after training assert len(model.history["elbo_train_set"]) == 2 model.get_elbo() model.get_marginal_ll() model.get_reconstruction_error() model.get_normalized_expression(transform_batch="batch_1") adata2 = synthetic_iid() model.get_elbo(adata2) model.get_marginal_ll(adata2) model.get_reconstruction_error(adata2) latent = model.get_latent_representation(adata2, indices=[1, 2, 3]) assert latent.shape == (3, n_latent) denoised = model.get_normalized_expression(adata2) assert denoised.shape == adata.shape denoised = model.get_normalized_expression(adata2, indices=[1, 2, 3], transform_batch="batch_1") denoised = model.get_normalized_expression( adata2, indices=[1, 2, 3], transform_batch=["batch_0", "batch_1"]) assert denoised.shape == (3, adata2.n_vars) sample = model.posterior_predictive_sample(adata2) assert sample.shape == adata2.shape sample = model.posterior_predictive_sample(adata2, indices=[1, 2, 3], gene_list=["1", "2"]) assert sample.shape == (3, 2) sample = model.posterior_predictive_sample(adata2, indices=[1, 2, 3], gene_list=["1", "2"], n_samples=3) assert sample.shape == (3, 2, 3) model.get_feature_correlation_matrix(correlation_type="pearson") model.get_feature_correlation_matrix( adata2, indices=[1, 2, 3], correlation_type="spearman", rna_size_factor=500, n_samples=5, ) model.get_feature_correlation_matrix( adata2, indices=[1, 2, 3], correlation_type="spearman", rna_size_factor=500, n_samples=5, transform_batch=["batch_0", "batch_1"], ) params = model.get_likelihood_parameters() assert params["mean"].shape == adata.shape assert (params["mean"].shape == params["dispersions"].shape == params["dropout"].shape) params = model.get_likelihood_parameters(adata2, indices=[1, 2, 3]) assert params["mean"].shape == (3, adata.n_vars) params = model.get_likelihood_parameters(adata2, indices=[1, 2, 3], n_samples=3, give_mean=True) assert params["mean"].shape == (3, adata.n_vars) model.get_latent_library_size() model.get_latent_library_size(adata2, indices=[1, 2, 3]) # test transfer_anndata_setup adata2 = synthetic_iid(run_setup_anndata=False) transfer_anndata_setup(adata, adata2) model.get_elbo(adata2) # test automatic transfer_anndata_setup + on a view adata = synthetic_iid() model = SCVI(adata) adata2 = synthetic_iid(run_setup_anndata=False) model.get_elbo(adata2[:10]) # test that we catch incorrect mappings adata = synthetic_iid() adata2 = synthetic_iid(run_setup_anndata=False) transfer_anndata_setup(adata, adata2) adata2.uns["_scvi"]["categorical_mappings"]["_scvi_labels"][ "mapping"] = np.array(["label_1", "label_0", "label_2"]) with pytest.raises(ValueError): model.get_elbo(adata2) # test mismatched categories raises ValueError adata2 = synthetic_iid(run_setup_anndata=False) adata2.obs.labels.cat.rename_categories(["a", "b", "c"], inplace=True) with pytest.raises(ValueError): model.get_elbo(adata2) # test differential expression model.differential_expression(groupby="labels", group1="label_1") model.differential_expression(groupby="labels", group1="label_1", group2="label_2", mode="change") model.differential_expression(groupby="labels") model.differential_expression(idx1=[0, 1, 2], idx2=[3, 4, 5]) model.differential_expression(idx1=[0, 1, 2]) # transform batch works with all different types a = synthetic_iid(run_setup_anndata=False) batch = np.zeros(a.n_obs) batch[:64] += 1 a.obs["batch"] = batch setup_anndata(a, batch_key="batch") m = SCVI(a) m.train(1, train_size=0.5) m.get_normalized_expression(transform_batch=1) m.get_normalized_expression(transform_batch=[0, 1])
def test_scvi_online_update(save_path): n_latent = 5 adata1 = synthetic_iid() model = SCVI(adata1, n_latent=n_latent) model.train(1, check_val_every_n_epoch=1) dir_path = os.path.join(save_path, "saved_model/") model.save(dir_path, overwrite=True) # also test subset var option adata2 = synthetic_iid(run_setup_anndata=False, n_genes=110) adata2.obs["batch"] = adata2.obs.batch.cat.rename_categories(["batch_2", "batch_3"]) model2 = SCVI.load_query_data(adata2, dir_path, inplace_subset_query_vars=True) model2.train(max_epochs=1, plan_kwargs=dict(weight_decay=0.0)) model2.get_latent_representation() # encoder linear layer equal one = ( model.module.z_encoder.encoder.fc_layers[0][0] .weight.detach() .cpu() .numpy()[:, : adata1.shape[1]] ) two = ( model2.module.z_encoder.encoder.fc_layers[0][0] .weight.detach() .cpu() .numpy()[:, : adata1.shape[1]] ) np.testing.assert_equal(one, two) assert ( np.sum( model2.module.z_encoder.encoder.fc_layers[0][0] .weight.grad.cpu() .numpy()[:, : adata1.shape[1]] ) == 0 ) # dispersion assert model2.module.px_r.requires_grad is False # library encoder linear layer assert model2.module.l_encoder.encoder.fc_layers[0][0].weight.requires_grad is True # 5 for n_latent, 4 for batches assert model2.module.decoder.px_decoder.fc_layers[0][0].weight.shape[1] == 9 # test options adata1 = synthetic_iid() model = SCVI( adata1, n_latent=n_latent, n_layers=2, encode_covariates=True, use_batch_norm="encoder", use_layer_norm="none", ) model.train(1, check_val_every_n_epoch=1) dir_path = os.path.join(save_path, "saved_model/") model.save(dir_path, overwrite=True) adata2 = synthetic_iid(run_setup_anndata=False) adata2.obs["batch"] = adata2.obs.batch.cat.rename_categories(["batch_2", "batch_3"]) model2 = SCVI.load_query_data(adata2, dir_path, freeze_expression=True) model2.train(max_epochs=1, plan_kwargs=dict(weight_decay=0.0)) # deactivate no grad decorator model2.get_latent_representation() # pytorch lightning zeros the grad, so this will get a grad to inspect single_pass_for_online_update(model2) grad = model2.module.z_encoder.encoder.fc_layers[0][0].weight.grad.cpu().numpy() # expression part has zero grad assert np.sum(grad[:, :-4]) == 0 # categorical part has non-zero grad assert np.sum(grad[:, -4:]) != 0 grad = model2.module.decoder.px_decoder.fc_layers[0][0].weight.grad.cpu().numpy() # linear layer weight in decoder layer has non-zero grad assert np.sum(grad[:, :-4]) == 0 # do not freeze expression model3 = SCVI.load_query_data( adata2, dir_path, freeze_expression=False, freeze_batchnorm_encoder=True, freeze_decoder_first_layer=False, ) model3.train(max_epochs=1) model3.get_latent_representation() assert model3.module.z_encoder.encoder.fc_layers[0][1].momentum == 0 # batch norm weight in encoder layer assert model3.module.z_encoder.encoder.fc_layers[0][1].weight.requires_grad is False single_pass_for_online_update(model3) grad = model3.module.z_encoder.encoder.fc_layers[0][0].weight.grad.cpu().numpy() # linear layer weight in encoder layer has non-zero grad assert np.sum(grad[:, :-4]) != 0 grad = model3.module.decoder.px_decoder.fc_layers[0][0].weight.grad.cpu().numpy() # linear layer weight in decoder layer has non-zero grad assert np.sum(grad[:, :-4]) != 0 # do not freeze batchnorm model3 = SCVI.load_query_data(adata2, dir_path, freeze_batchnorm_encoder=False) model3.train(max_epochs=1) model3.get_latent_representation()
def test_differential_computation(save_path): n_latent = 5 adata = synthetic_iid() model = SCVI(adata, n_latent=n_latent) model.train(1) model_fn = partial(model.get_normalized_expression, return_numpy=True) dc = DifferentialComputation(model_fn, adata) cell_idx1 = np.asarray(adata.obs.labels == "label_1") cell_idx2 = ~cell_idx1 dc.get_bayes_factors(cell_idx1, cell_idx2, mode="vanilla", use_permutation=True) res = dc.get_bayes_factors( cell_idx1, cell_idx2, mode="change", use_permutation=False ) assert (res["delta"] == 0.5) and (res["pseudocounts"] == 0.0) res = dc.get_bayes_factors( cell_idx1, cell_idx2, mode="change", use_permutation=False, delta=None ) dc.get_bayes_factors( cell_idx1, cell_idx2, mode="change", use_permutation=False, delta=None, pseudocounts=None, ) dc.get_bayes_factors(cell_idx1, cell_idx2, mode="change", cred_interval_lvls=[0.75]) delta = 0.5 def change_fn_test(x, y): return x - y def m1_domain_fn_test(samples): return np.abs(samples) >= delta dc.get_bayes_factors( cell_idx1, cell_idx2, mode="change", m1_domain_fn=m1_domain_fn_test, change_fn=change_fn_test, ) # should fail if just one batch with pytest.raises(ValueError): model.differential_expression(adata[:20], groupby="batch") # test view model.differential_expression( adata[adata.obs["labels"] == "label_1"], groupby="batch" ) # Test query features obs_col, group1, _, = _prepare_obs( idx1="(labels == 'label_1') & (batch == 'batch_1')", idx2=None, adata=adata ) assert (obs_col == group1).sum() == adata.obs.loc[ lambda x: (x.labels == "label_1") & (x.batch == "batch_1") ].shape[0] model.differential_expression( idx1="labels == 'label_1'", ) model.differential_expression( idx1="labels == 'label_1'", idx2="(labels == 'label_2') & (batch == 'batch_1')" ) # test that ints as group work a = synthetic_iid() a.obs["test"] = [0] * 200 + [1] * 200 model = SCVI(a) model.differential_expression(groupby="test", group1=0) # test that string but not as categorical work a = synthetic_iid() a.obs["test"] = ["0"] * 200 + ["1"] * 200 model = SCVI(a) model.differential_expression(groupby="test", group1="0")
def test_scvi(): n_latent = 5 adata = synthetic_iid() model = SCVI(adata, n_latent=n_latent) model.train(1) assert model.is_trained is True z = model.get_latent_representation() assert z.shape == (adata.shape[0], n_latent) model.get_elbo() model.get_marginal_ll() model.get_reconstruction_error() model.get_normalized_expression() adata2 = synthetic_iid() model.get_elbo(adata2) model.get_marginal_ll(adata2) model.get_reconstruction_error(adata2) latent = model.get_latent_representation(adata2, indices=[1, 2, 3]) assert latent.shape == (3, n_latent) denoised = model.get_normalized_expression(adata2) assert denoised.shape == adata.shape denoised = model.get_normalized_expression(adata2, indices=[1, 2, 3], transform_batch=1) assert denoised.shape == (3, adata2.n_vars) sample = model.posterior_predictive_sample(adata2) assert sample.shape == adata2.shape sample = model.posterior_predictive_sample(adata2, indices=[1, 2, 3], gene_list=["1", "2"]) assert sample.shape == (3, 2) sample = model.posterior_predictive_sample(adata2, indices=[1, 2, 3], gene_list=["1", "2"], n_samples=3) assert sample.shape == (3, 2, 3) model.get_feature_correlation_matrix(correlation_type="pearson") model.get_feature_correlation_matrix( adata2, indices=[1, 2, 3], correlation_type="spearman", rna_size_factor=500, n_samples=5, ) params = model.get_likelihood_parameters() assert params["mean"].shape == adata.shape assert (params["mean"].shape == params["dispersions"].shape == params["dropout"].shape) params = model.get_likelihood_parameters(adata2, indices=[1, 2, 3]) assert params["mean"].shape == (3, adata.n_vars) params = model.get_likelihood_parameters(adata2, indices=[1, 2, 3], n_samples=3, give_mean=True) assert params["mean"].shape == (3, adata.n_vars) model.get_latent_library_size() model.get_latent_library_size(adata2, indices=[1, 2, 3]) # test transfer_anndata_setup adata2 = synthetic_iid(run_setup_anndata=False) transfer_anndata_setup(adata, adata2) model.get_elbo(adata2) # test automatic transfer_anndata_setup + on a view adata = synthetic_iid() model = SCVI(adata) adata2 = synthetic_iid(run_setup_anndata=False) model.get_elbo(adata2[:10]) # test that we catch incorrect mappings adata = synthetic_iid() adata2 = synthetic_iid(run_setup_anndata=False) transfer_anndata_setup(adata, adata2) adata2.uns["_scvi"]["categorical_mappings"]["_scvi_labels"][ "mapping"] = pd.Index( data=["undefined_1", "undefined_0", "undefined_2"]) with pytest.raises(ValueError): model.get_elbo(adata2) # test mismatched categories raises ValueError adata2 = synthetic_iid(run_setup_anndata=False) adata2.obs.labels.cat.rename_categories(["a", "b", "c"], inplace=True) with pytest.raises(ValueError): model.get_elbo(adata2) # test differential expression model.differential_expression(groupby="labels", group1="undefined_1") model.differential_expression(groupby="labels", group1="undefined_1", group2="undefined_2", mode="change") model.differential_expression(groupby="labels") model.differential_expression(idx1=[0, 1, 2], idx2=[3, 4, 5]) model.differential_expression(idx1=[0, 1, 2])
use_cuda = False n_hidden = int(args[5]) n_latent = int(args[6]) n_layers = int(args[7]) #vae = VAE(loom_dataset.nb_genes, n_batch=loom_dataset.n_batches, dropout_rate = 0.5, n_hidden = n_hidden, n_latent = n_latent, n_layers = n_layers, dispersion='gene-batch') #vae = VAE(loom_dataset.nb_genes, n_batch=loom_dataset.n_batches, n_latent = n_latent, dropout_rate = 0.1, dispersion='gene-batch') vae = SCVI(adata, n_hidden=n_hidden, n_latent=n_latent, n_layers=n_layers, dispersion='gene-batch', use_cuda=True) vae vae.train(n_epochs=n_epochs, n_epochs_kl_warmup=1) # extract latent = vae.get_latent_representation() normalized_values = vae.get_normalized_expression() with open(args[1] + ".csv", 'wb') as f: np.savetxt(f, latent, delimiter=",") if args[8] == 'IMPUTE': out = pd.DataFrame(imputed_values) out.columns = loom_dataset.gene_names out.index = loom_dataset.CellID out.to_hdf(args[1] + '.impute.hdf', key='index') if args[8] == 'NORM': out = pd.DataFrame(normalized_values) out.columns = loom_dataset.gene_names