{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import scanpy as sc\n", "import os\n", "from sklearn.cluster import KMeans\n", "from sklearn.cluster import AgglomerativeClustering\n", "from sklearn.metrics.cluster import adjusted_rand_score\n", "from sklearn.metrics.cluster import adjusted_mutual_info_score\n", "from sklearn.metrics.cluster import homogeneity_score\n", "import rpy2.robjects as robjects\n", "from rpy2.robjects import pandas2ri" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df_metrics = pd.DataFrame(columns=['ARI_Louvain','ARI_kmeans','ARI_HC',\n", " 'AMI_Louvain','AMI_kmeans','AMI_HC',\n", " 'Homogeneity_Louvain','Homogeneity_kmeans','Homogeneity_HC'])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "workdir = './output/'\n", "path_fm = os.path.join(workdir,'feature_matrices/')\n", "path_clusters = os.path.join(workdir,'clusters/')\n", "path_metrics = os.path.join(workdir,'metrics/')\n", "os.system('mkdir -p '+path_clusters)\n", "os.system('mkdir -p '+path_metrics)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "metadata = pd.read_csv('./input/metadata.tsv',sep='\\t',index_col=0)\n", "num_clusters = len(np.unique(metadata['label']))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "17" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "files = [x for x in os.listdir(path_fm) if x.startswith('FM')]\n", "len(files)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['FM_Control_BMnoisyp4.rds',\n", " 'FM_BROCKMAN_BMnoisyp4.rds',\n", " 'FM_Cusanovich2018_BMnoisyp4.rds',\n", " 'FM_cisTopic_BMnoisyp4.rds',\n", " 'FM_chromVAR_BMnoisyp4_kmers.rds',\n", " 'FM_chromVAR_BMnoisyp4_motifs.rds',\n", " 'FM_chromVAR_BMnoisyp4_kmers_pca.rds',\n", " 'FM_chromVAR_BMnoisyp4_motifs_pca.rds',\n", " 'FM_GeneScoring_BMnoisyp4.rds',\n", " 'FM_GeneScoring_BMnoisyp4_pca.rds',\n", " 'FM_Cicero_BMnoisyp4.rds',\n", " 'FM_Cicero_BMnoisyp4_pca.rds',\n", " 'FM_SnapATAC_BMnoisyp4.rds',\n", " 'FM_Scasat_BMnoisyp4.rds',\n", " 'FM_scABC_BMnoisyp4.rds',\n", " 'FM_SCRAT_BMnoisyp4.rds',\n", " 'FM_SCRAT_BMnoisyp4_pca.rds']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "files" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def getNClusters(adata,n_cluster,range_min=0,range_max=3,max_steps=20):\n", " this_step = 0\n", " this_min = float(range_min)\n", " this_max = float(range_max)\n", " while this_step < max_steps:\n", " print('step ' + str(this_step))\n", " this_resolution = this_min + ((this_max-this_min)/2)\n", " sc.tl.louvain(adata,resolution=this_resolution)\n", " this_clusters = adata.obs['louvain'].nunique()\n", " \n", " print('got ' + str(this_clusters) + ' at resolution ' + str(this_resolution))\n", " \n", " if this_clusters > n_cluster:\n", " this_max = this_resolution\n", " elif this_clusters < n_cluster:\n", " this_min = this_resolution\n", " else:\n", " return(this_resolution, adata)\n", " this_step += 1\n", " \n", " print('Cannot find the number of clusters')\n", " print('Clustering solution from last iteration is used:' + str(this_clusters) + ' at resolution ' + str(this_resolution))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Control\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 8 at resolution 1.5\n", "step 1\n", "got 5 at resolution 0.75\n", "step 2\n", "got 6 at resolution 1.125\n", "BROCKMAN\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 11 at resolution 1.5\n", "step 1\n", "got 5 at resolution 0.75\n", "step 2\n", "got 8 at resolution 1.125\n", "step 3\n", "got 7 at resolution 0.9375\n", "step 4\n", "got 6 at resolution 0.84375\n", "Cusanovich2018\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 6 at resolution 1.5\n", "cisTopic\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 6 at resolution 1.5\n", "chromVAR_kmers\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 6 at resolution 1.5\n", "chromVAR_motifs\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 7 at resolution 1.5\n", "step 1\n", "got 3 at resolution 0.75\n", "step 2\n", "got 4 at resolution 1.125\n", "step 3\n", "got 5 at resolution 1.3125\n", "step 4\n", "got 6 at resolution 1.40625\n", "chromVAR_kmers_pca\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 6 at resolution 1.5\n", "chromVAR_motifs_pca\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 6 at resolution 1.5\n", "GeneScoring\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 35 at resolution 1.5\n", "step 1\n", "got 2 at resolution 0.75\n", "step 2\n", "got 15 at resolution 1.125\n", "step 3\n", "got 6 at resolution 0.9375\n", "GeneScoring_pca\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 12 at resolution 1.5\n", "step 1\n", "got 9 at resolution 0.75\n", "step 2\n", "got 6 at resolution 0.375\n", "Cicero\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 34 at resolution 1.5\n", "step 1\n", "got 2 at resolution 0.75\n", "step 2\n", "got 17 at resolution 1.125\n", "step 3\n", "got 5 at resolution 0.9375\n", "step 4\n", "got 12 at resolution 1.03125\n", "step 5\n", "got 8 at resolution 0.984375\n", "step 6\n", "got 5 at resolution 0.9609375\n", "step 7\n", "got 8 at resolution 0.97265625\n", "step 8\n", "got 7 at resolution 0.966796875\n", "step 9\n", "got 7 at resolution 0.9638671875\n", "step 10\n", "got 7 at resolution 0.96240234375\n", "step 11\n", "got 6 at resolution 0.961669921875\n", "Cicero_pca\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 11 at resolution 1.5\n", "step 1\n", "got 7 at resolution 0.75\n", "step 2\n", "got 3 at resolution 0.375\n", "step 3\n", "got 5 at resolution 0.5625\n", "step 4\n", "got 5 at resolution 0.65625\n", "step 5\n", "got 6 at resolution 0.703125\n", "SnapATAC\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 6 at resolution 1.5\n", "Scasat\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 7 at resolution 1.5\n", "step 1\n", "got 5 at resolution 0.75\n", "step 2\n", "got 5 at resolution 1.125\n", "step 3\n", "got 6 at resolution 1.3125\n", "scABC\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 21 at resolution 1.5\n", "step 1\n", "got 3 at resolution 0.75\n", "step 2\n", "got 8 at resolution 1.125\n", "step 3\n", "got 4 at resolution 0.9375\n", "step 4\n", "got 4 at resolution 1.03125\n", "step 5\n", "got 6 at resolution 1.078125\n", "SCRAT\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 8 at resolution 1.5\n", "step 1\n", "got 5 at resolution 0.75\n", "step 2\n", "got 6 at resolution 1.125\n", "SCRAT_pca\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/data/pinello/SHARED_SOFTWARE/anaconda3/envs/ATACseq_clustering/lib/python3.7/site-packages/rpy2/robjects/pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "step 0\n", "got 10 at resolution 1.5\n", "step 1\n", "got 5 at resolution 0.75\n", "step 2\n", "got 8 at resolution 1.125\n", "step 3\n", "got 6 at resolution 0.9375\n" ] } ], "source": [ "for file in files:\n", " file_split = file.split('_')\n", " method = file_split[1]\n", " dataset = file_split[2].split('.')[0]\n", " if(len(file_split)>3):\n", " method = method + '_' + '_'.join(file_split[3:]).split('.')[0]\n", " print(method)\n", "\n", " pandas2ri.activate()\n", " readRDS = robjects.r['readRDS']\n", " df_rds = readRDS(os.path.join(path_fm,file))\n", " fm_mat = pandas2ri.ri2py(robjects.r['data.frame'](robjects.r['as.matrix'](df_rds)))\n", " fm_mat.columns = metadata.index\n", " \n", " adata = sc.AnnData(fm_mat.T)\n", " adata.var_names_make_unique()\n", " adata.obs = metadata.loc[adata.obs.index,]\n", " df_metrics.loc[method,] = \"\"\n", " #Louvain\n", " sc.pp.neighbors(adata, n_neighbors=15,use_rep='X')\n", "# sc.tl.louvain(adata)\n", " getNClusters(adata,n_cluster=num_clusters)\n", " #kmeans\n", " kmeans = KMeans(n_clusters=num_clusters, random_state=2019).fit(adata.X)\n", " adata.obs['kmeans'] = pd.Series(kmeans.labels_,index=adata.obs.index).astype('category')\n", " #hierachical clustering\n", " hc = AgglomerativeClustering(n_clusters=num_clusters).fit(adata.X)\n", " adata.obs['hc'] = pd.Series(hc.labels_,index=adata.obs.index).astype('category')\n", " #clustering metrics\n", " \n", " #adjusted rank index\n", " ari_louvain = adjusted_rand_score(adata.obs['label'], adata.obs['louvain'])\n", " ari_kmeans = adjusted_rand_score(adata.obs['label'], adata.obs['kmeans'])\n", " ari_hc = adjusted_rand_score(adata.obs['label'], adata.obs['hc'])\n", " #adjusted mutual information\n", " ami_louvain = adjusted_mutual_info_score(adata.obs['label'], adata.obs['louvain'],average_method='arithmetic')\n", " ami_kmeans = adjusted_mutual_info_score(adata.obs['label'], adata.obs['kmeans'],average_method='arithmetic') \n", " ami_hc = adjusted_mutual_info_score(adata.obs['label'], adata.obs['hc'],average_method='arithmetic')\n", " #homogeneity\n", " homo_louvain = homogeneity_score(adata.obs['label'], adata.obs['louvain'])\n", " homo_kmeans = homogeneity_score(adata.obs['label'], adata.obs['kmeans'])\n", " homo_hc = homogeneity_score(adata.obs['label'], adata.obs['hc'])\n", "\n", " df_metrics.loc[method,['ARI_Louvain','ARI_kmeans','ARI_HC']] = [ari_louvain,ari_kmeans,ari_hc]\n", " df_metrics.loc[method,['AMI_Louvain','AMI_kmeans','AMI_HC']] = [ami_louvain,ami_kmeans,ami_hc]\n", " df_metrics.loc[method,['Homogeneity_Louvain','Homogeneity_kmeans','Homogeneity_HC']] = [homo_louvain,homo_kmeans,homo_hc] \n", " adata.obs[['louvain','kmeans','hc']].to_csv(os.path.join(path_clusters ,method + '_clusters.tsv'),sep='\\t')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "df_metrics.to_csv(path_metrics+'clustering_scores.csv')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | ARI_Louvain | \n", "ARI_kmeans | \n", "ARI_HC | \n", "AMI_Louvain | \n", "AMI_kmeans | \n", "AMI_HC | \n", "Homogeneity_Louvain | \n", "Homogeneity_kmeans | \n", "Homogeneity_HC | \n", "
---|---|---|---|---|---|---|---|---|---|
Control | \n", "0.779759 | \n", "0.780828 | \n", "0.790929 | \n", "0.848678 | \n", "0.845885 | \n", "0.846218 | \n", "0.84847 | \n", "0.846676 | \n", "0.846452 | \n", "
BROCKMAN | \n", "0.561328 | \n", "0.555279 | \n", "0.602035 | \n", "0.685324 | \n", "0.680493 | \n", "0.717159 | \n", "0.682041 | \n", "0.681051 | \n", "0.709716 | \n", "
Cusanovich2018 | \n", "0.992017 | \n", "0.768445 | \n", "0.978179 | \n", "0.988867 | \n", "0.891575 | \n", "0.971112 | \n", "0.98893 | \n", "0.863883 | \n", "0.971277 | \n", "
cisTopic | \n", "0.953195 | \n", "0.947545 | \n", "0.917894 | \n", "0.948382 | \n", "0.94389 | \n", "0.918501 | \n", "0.94868 | \n", "0.944194 | \n", "0.918896 | \n", "
chromVAR_kmers | \n", "0.495589 | \n", "0.497999 | \n", "0.531637 | \n", "0.604726 | \n", "0.636153 | \n", "0.651479 | \n", "0.587439 | \n", "0.626889 | \n", "0.641111 | \n", "
chromVAR_motifs | \n", "0.398901 | \n", "0.410407 | \n", "0.316593 | \n", "0.553781 | \n", "0.567098 | \n", "0.513624 | \n", "0.555722 | \n", "0.569391 | \n", "0.503448 | \n", "
chromVAR_kmers_pca | \n", "0.601049 | \n", "0.596801 | \n", "0.558717 | \n", "0.720589 | \n", "0.700458 | \n", "0.668644 | \n", "0.712038 | \n", "0.701502 | \n", "0.666186 | \n", "
chromVAR_motifs_pca | \n", "0.400536 | \n", "0.345739 | \n", "0.393151 | \n", "0.553189 | \n", "0.574613 | \n", "0.532386 | \n", "0.555077 | \n", "0.561501 | \n", "0.532387 | \n", "
GeneScoring | \n", "0.00806609 | \n", "0.35607 | \n", "0.246211 | \n", "0.00920484 | \n", "0.436762 | \n", "0.324887 | \n", "0.0148086 | \n", "0.409791 | \n", "0.291086 | \n", "
GeneScoring_pca | \n", "0.323092 | \n", "0.357345 | \n", "0.362712 | \n", "0.417752 | \n", "0.438917 | \n", "0.439756 | \n", "0.40738 | \n", "0.428261 | \n", "0.427891 | \n", "
Cicero | \n", "0.0878461 | \n", "0.473173 | \n", "0.420783 | \n", "0.0992193 | \n", "0.680707 | \n", "0.619445 | \n", "0.100287 | \n", "0.559189 | \n", "0.530166 | \n", "
Cicero_pca | \n", "0.530382 | \n", "0.514069 | \n", "0.448058 | \n", "0.676972 | \n", "0.628329 | \n", "0.583012 | \n", "0.642584 | \n", "0.62543 | \n", "0.574815 | \n", "
SnapATAC | \n", "0.996003 | \n", "0.997997 | \n", "0.986067 | \n", "0.994755 | \n", "0.997053 | \n", "0.981576 | \n", "0.994782 | \n", "0.99707 | \n", "0.981671 | \n", "
Scasat | \n", "0.859124 | \n", "0.79491 | \n", "0.801662 | \n", "0.886804 | \n", "0.851331 | \n", "0.853164 | \n", "0.887068 | \n", "0.851743 | \n", "0.853761 | \n", "
scABC | \n", "0.338829 | \n", "0.421418 | \n", "0.605121 | \n", "0.441173 | \n", "0.620527 | \n", "0.687807 | \n", "0.3912 | \n", "0.600356 | \n", "0.687662 | \n", "
SCRAT | \n", "0.494443 | \n", "0.500276 | \n", "0.516734 | \n", "0.647751 | \n", "0.626947 | \n", "0.636607 | \n", "0.639919 | \n", "0.62832 | \n", "0.634003 | \n", "
SCRAT_pca | \n", "0.494298 | \n", "0.494937 | \n", "0.496254 | \n", "0.6513 | \n", "0.62783 | \n", "0.643916 | \n", "0.639984 | \n", "0.628537 | \n", "0.641292 | \n", "