sc.pp.neighbors throws KeyError: diffmap_evals due to obsm concatenation
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 2.6k
- Forks
- 779
- Avg merge
- 1d 4h
- Merged PRs (30d)
- 27
Description
Duplicating from https://github.com/theislab/anndata/pull/284:
@Koncopd @falexwolf
There is an issue with the obsm concatenation. When we run sc.tl.diffmap with different anndata objects, concatenate them and run sc.pp.neighbors on the concatenated new anndata, we get the following exception. The reason is that X_diffmap' is available in obsm but .uns['diffmap_evals'] is not.
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<timed exec> in <module>
/opt/conda/lib/python3.7/site-packages/scanpy/neighbors/__init__.py in neighbors(adata, n_neighbors, n_pcs, use_rep, knn, random_state, method, metric, metric_kwds, copy)
104 if adata.isview: # we shouldn't need this here...
105 adata._init_as_actual(adata.copy())
--> 106 neighbors = Neighbors(adata)
107 neighbors.compute_neighbors(
108 n_neighbors=n_neighbors, knn=knn, n_pcs=n_pcs, use_rep=use_rep,
/opt/conda/lib/python3.7/site-packages/scanpy/neighbors/__init__.py in __init__(self, adata, n_dcs)
527 self._number_connected_components = self._connected_components[0]
528 if 'X_diffmap' in adata.obsm_keys():
--> 529 self._eigen_values = _backwards_compat_get_full_eval(adata)
530 self._eigen_basis = _backwards_compat_get_full_X_diffmap(adata)
531 if n_dcs is not None:
/opt/conda/lib/python3.7/site-packages/scanpy/neighbors/__init__.py in _backwards_compat_get_full_eval(adata)
395 return np.r_[1, adata.uns['diffmap_evals']]
396 else:
--> 397 return adata.uns['diffmap_evals']
398
399
KeyError: 'diffmap_evals'
Doesn't it make more sense to make obsm concatenation False by default, by the way? Should concatenating obsm be the default behaviour?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The traceback points to scanpy/neighbors/init.py, especially Neighbors and _backwards_compat_get_full_eval; start there and inspect how obsm and uns are produced by concatenation after sc.tl.diffmap. Reproduce the reported case, then establish and test the intended behavior for missing diffmap_evals and the default obsm-concatenation choice; done means sc.pp.neighbors handles the concatenated data consistently.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- bioinformatics, data
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100