Source code for scphylo.tl.solver._onconem
import time
import numpy as np
import pandas as pd
import scphylo as scp
[docs]def onconem(df_input, alpha, beta):
"""Solving using OncoNEM.
Inferring tumor evolution from single-cell sequencing data :cite:`OncoNEM`.
Parameters
----------
df_input : :class:`pandas.DataFrame`
Input genotype matrix where 0 is absent, 1 is present and 3 is missing.
alpha : :obj:`float`
False positive rate.
beta : :obj:`float`
False negative rate.
Returns
-------
:class:`pandas.DataFrame`
Conflict-free genotype matrix where 0 is absent, 1 is present.
"""
onconem, onconem_is_not_imported = scp.ul.import_rpy2(
"oncoNEM",
"BiocManager::install('graph')\n"
+ "devtools::install_bitbucket('edith_ross/oncoNEM')\n",
)
if onconem_is_not_imported:
scp.logg.error("Unable to import a package!")
import rpy2.robjects as ro
from rpy2.robjects import numpy2ri
from rpy2.robjects.packages import importr
igraph = importr("igraph")
scp.logg.info(f"running OncoNEM with alpha={alpha}, beta={beta}")
with ro.conversion.localconverter(ro.default_converter + numpy2ri.converter):
data = ro.conversion.py2rpy(df_input.replace(3, 2).T.values)
s_time = time.time()
onem = onconem.oncoNEM(Data=data, FPR=alpha, FNR=beta)
ro.globalenv["onem"] = onem
ro.r("onem$search(delta=200)")
onem_expanded = onconem.expandOncoNEM(
onem, epsilon=10, delta=200, checkMax=10000, app=True
)
onco_tree = onconem.clusterOncoNEM(oNEM=onem_expanded, epsilon=10)
igraph.get_edgelist(onco_tree.rx2["g"])
post = onconem.oncoNEMposteriors(
tree=onco_tree.rx2["g"],
clones=onco_tree.rx2["clones"],
Data=data,
FPR=alpha,
FNR=beta,
)
sol_Y = np.rint(post.rx2["p_mut"])
e_time = time.time()
running_time = e_time - s_time
df_output = pd.DataFrame(sol_Y)
df_output = df_output.T
df_output.columns = df_input.columns
df_output.index = df_input.index
df_output.index.name = "cellIDxmutID"
df_output = df_output.astype(int)
scp.ul.stat(df_input, df_output, alpha, beta, running_time)
return df_output