theislab / scib

Benchmarking analysis of data integration tools
MIT License
311 stars 63 forks source link

kBET metrics does not work with scipy==1.14.0 #412

Open kollo97 opened 4 months ago

kollo97 commented 4 months ago

Hi,

first of all I want to say that this is a great tool!

I ran into an error related to the recently released scipy version 1.14.0. When trying to calculate the kBET score of an integration, I currently get the following error:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[49], line 17
      1 selected_metrics = {
      2     'ari_' : True,
      3     'nmi_' : True,
   (...)
     15     'n_cores' : 20
     16 }
---> 17 metrics_seurat_all = scib.metrics.metrics(adata, adata_seurat, batch_key, label_key, embed = 'X_pca', **selected_metrics)
     18 metrics_harmony_all = scib.metrics.metrics(adata, adata_harmony, batch_key, label_key, embed = 'X_harmony', **selected_metrics)
     19 metrics_hvg_all = scib.metrics.metrics(adata, adata_hvg, batch_key, label_key, embed = 'X_pca', **selected_metrics)

File ~/miniforge3/envs/angl_BM/lib/python3.12/site-packages/scib/metrics/metrics.py:407, in metrics(adata, adata_int, batch_key, label_key, embed, cluster_key, cluster_nmi, ari_, nmi_, nmi_method, nmi_dir, silhouette_, si_metric, pcr_, cell_cycle_, organism, hvg_score_, isolated_labels_, isolated_labels_f1_, isolated_labels_asw_, n_isolated, graph_conn_, trajectory_, kBET_, lisi_graph_, ilisi_, clisi_, subsample, n_cores, type_, verbose)
    405 if kBET_:
    406     print("kBET...")
--> 407     kbet_score = kBET(
    408         adata_int,
    409         batch_key=batch_key,
    410         label_key=label_key,
    411         type_=type_,
    412         embed=embed,
    413         scaled=True,
    414         verbose=verbose,
    415     )
    416 else:
    417     kbet_score = np.nan

File ~/miniforge3/envs/angl_BM/lib/python3.12/site-packages/scib/metrics/kbet.py:173, in kBET(adata, batch_key, label_key, type_, embed, scaled, return_df, verbose)
    170 nn_index_tmp[:] = np.nan
    172 try:
--> 173     nn_index_tmp[idx_nonan] = diffusion_nn(
    174         adata_sub_sub, k=k0
    175     ).astype("float")
    176     # call kBET
    177     score = kBET_single(
    178         matrix=matrix,
    179         batch=adata_sub.obs[batch_key],
   (...)
    183         k0=k0,
    184     )

File ~/miniforge3/envs/angl_BM/lib/python3.12/site-packages/scib/metrics/utils.py:141, in diffusion_nn(adata, k, max_iterations)
    134     raise NeighborsError(
    135         f"could not find {k} nearest neighbors in {max_iterations}"
    136         "diffusion steps.\n Please increase max_iterations or reduce"
    137         " k.\n"
    138     )
    140 M.setdiag(0)
--> 141 k_indices = np.argpartition(M.A, -k, axis=1)[:, -k:]
    143 return k_indices

AttributeError: 'csr_matrix' object has no attribute 'A'

After a quick search, I found that this was most likely related to my currently installed scipy version 1.14.0. As described in the following issue and release notes of scipy v1.14.0, the .A attribute of a csr_matrix has been deprecated in this release. https://github.com/scipy/scipy/issues/21049 https://github.com/scipy/scipy/releases/tag/v1.14.0

Downgrading the scipy version to v1.13.0 solved the issue for me.

Best regards!

rcannood commented 2 months ago

Just encountered this issue in OpenProblems as well!

Thanks for posting a workaround, @kollo97 !