Skip to content

Commit

Permalink
add layer to pca params output
Browse files Browse the repository at this point in the history
  • Loading branch information
ivirshup committed Aug 4, 2023
1 parent e041f3e commit c0077fa
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 15 deletions.
20 changes: 13 additions & 7 deletions scanpy/preprocessing/_pca.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,18 +234,24 @@ def pca(

if data_is_AnnData:
adata.obsm['X_pca'] = X_pca
adata.uns['pca'] = {}
adata.uns['pca']['params'] = {
'zero_center': zero_center,
'use_highly_variable': use_highly_variable,
}
if use_highly_variable:
adata.varm['PCs'] = np.zeros(shape=(adata.n_vars, n_comps))
adata.varm['PCs'][adata.var['highly_variable']] = pca_.components_.T
else:
adata.varm['PCs'] = pca_.components_.T
adata.uns['pca']['variance'] = pca_.explained_variance_
adata.uns['pca']['variance_ratio'] = pca_.explained_variance_ratio_

uns_entry = {
'params': {
'zero_center': zero_center,
'use_highly_variable': use_highly_variable,
},
'variance': pca_.explained_variance_,
'variance_ratio': pca_.explained_variance_ratio_,
}
if layer is not None:
uns_entry['params']['layer'] = layer
adata.uns['pca'] = uns_entry

logg.info(' finished', time=logg_start)
logg.debug(
'and added\n'
Expand Down
21 changes: 13 additions & 8 deletions scanpy/tests/test_pca.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,18 +160,23 @@ def test_pca_layer():
"""
Tests that layers works the same way as .X
"""
pbmc = pbmc3k_normalized()
X_adata = pbmc3k_normalized()

layer_adata = X_adata.copy()
layer_adata.layers["counts"] = X_adata.X.copy()
del layer_adata.X

pbmc.layers["counts"] = pbmc.X.copy()
sc.pp.pca(X_adata, dtype=np.float64)
sc.pp.pca(layer_adata, layer="counts", dtype=np.float64)

X_pca = sc.pp.pca(pbmc, dtype=np.float64, copy=True)
layer_pca = sc.pp.pca(pbmc, layer="counts", dtype=np.float64, copy=True)
assert layer_adata.uns["pca"]["params"]["layer"] == "counts"
assert "layer" not in X_adata.uns["pca"]["params"]

np.testing.assert_equal(
X_pca.uns["pca"]["variance"], layer_pca.uns["pca"]["variance"]
X_adata.uns["pca"]["variance"], layer_adata.uns["pca"]["variance"]
)
np.testing.assert_equal(
X_pca.uns["pca"]["variance_ratio"], layer_pca.uns["pca"]["variance_ratio"]
X_adata.uns["pca"]["variance_ratio"], layer_adata.uns["pca"]["variance_ratio"]
)
np.testing.assert_equal(X_pca.obsm['X_pca'], layer_pca.obsm['X_pca'])
np.testing.assert_equal(X_pca.varm['PCs'], layer_pca.varm['PCs'])
np.testing.assert_equal(X_adata.obsm['X_pca'], layer_adata.obsm['X_pca'])
np.testing.assert_equal(X_adata.varm['PCs'], layer_adata.varm['PCs'])

0 comments on commit c0077fa

Please sign in to comment.