{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Toy dataset\n", "\n", "We used here an artificial toy dataset composed of 3 sets of points with 2D random coordinates around an arbitrary center.\n", "\n", "To go through this example, you need to install AutoClassWrapper:\n", "```bash\n", "$ python3 -m pip install autoclasswrapper\n", "```\n", "\n", "[AutoClass C](https://ti.arc.nasa.gov/tech/rse/synthesis-projects-applications/autoclass/autoclass-c/) also needs to be installed locally and available in path.\n", "\n", "Here is a quick solution for a Linux Bash shell:\n", "```bash\n", "wget https://ti.arc.nasa.gov/m/project/autoclass/autoclass-c-3-3-6.tar.gz\n", "tar zxvf autoclass-c-3-3-6.tar.gz\n", "rm -f autoclass-c-3-3-6.tar.gz\n", "export PATH=$PATH:$(pwd)/autoclass-c\n", "\n", "# if you use a 64-bit operating system,\n", "# you also need to install the standard 32-bit C libraries:\n", "# sudo apt-get install -y libc6-i386\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python: 3.7.1 | packaged by conda-forge | (default, Feb 26 2019, 04:48:14) \n", "[GCC 7.3.0]\n", "matplotlib: 3.0.3\n", "numpy: 1.16.2\n", "pandas: 0.24.1\n", "AutoClassWrapper: 1.4.1\n" ] } ], "source": [ "from pathlib import Path\n", "import sys\n", "import time\n", "\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "from matplotlib.lines import Line2D\n", "import numpy as np\n", "import pandas as pd\n", "\n", "%matplotlib inline\n", "\n", "print(\"Python:\", sys.version)\n", "print(\"matplotlib:\", matplotlib.__version__)\n", "print(\"numpy:\", np.__version__)\n", "print(\"pandas:\", pd.__version__)\n", "\n", "import autoclasswrapper as wrapper\n", "print(\"AutoClassWrapper:\", wrapper.__version__)\n", "\n", "version = sys.version_info \n", "if not ((version.major >= 3) and (version.minor >= 6)):\n", " sys.exit(\"Need Python>=3.6\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataset generation" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xycolor
name
id0004.2682074.857065blue
id0013.0790473.985566blue
id0023.7046714.374195blue
id0032.6818003.745056blue
id0043.0127383.704896blue
\n", "
" ], "text/plain": [ " x y color\n", "name \n", "id000 4.268207 4.857065 blue\n", "id001 3.079047 3.985566 blue\n", "id002 3.704671 4.374195 blue\n", "id003 2.681800 3.745056 blue\n", "id004 3.012738 3.704896 blue" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "size = 100\n", "sigma = 0.6\n", "x = np.concatenate((np.random.normal(3, sigma, size), np.random.normal(4, sigma, size), np.random.normal(6, sigma, size)))\n", "y = np.concatenate((np.random.normal(4, sigma, size), np.random.normal(0, sigma, size), np.random.normal(5, sigma, size)))\n", "color = [\"blue\"]*size+[\"orange\"]*size+[\"purple\"]*size\n", "name = [\"id{:03d}\".format(id) for id in range(size*3)]\n", "df = pd.DataFrame.from_dict({\"x\":x, \"y\":y, \"color\":color})\n", "df.index = name\n", "df.index.name = \"name\"\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(df[\"x\"], df[\"y\"], color=df[\"color\"], s=10)\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"y\")\n", "plt.xlim(0, 10)\n", "plt.ylim(-5, 10);" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# verify all x are > 0\n", "assert min(df[\"x\"]) > 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Save `x` and `y` in 2 different files (that will be later merged)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "df[\"x\"].to_csv(\"demo_real_scalar.tsv\", sep=\"\\t\", header=True)\n", "df[\"y\"].to_csv(\"demo_real_location.tsv\", sep=\"\\t\", header=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 1 - prepare input files\n", "\n", "[AutoClass C](https://ti.arc.nasa.gov/tech/rse/synthesis-projects-applications/autoclass/autoclass-c/) can handle different types of data:\n", "\n", "- *real scalar*: numerical values bounded by 0. Examples: length, weight, age...\n", "- *real location*: numerical values, positive and negative. Examples: position, microarray log ratio, elevation...\n", "- *discrete*: qualitative data. Examples: color, phenotype, name...\n", "\n", "Each data type must be entered in separate input file.\n", "\n", "AutoClass C handles very well missing data. Missing data must be represented by nothing (no `NA`, `?`, `None`...)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2019-07-07 19:07:11 INFO Reading data file 'demo_real_scalar.tsv' as 'real scalar' with error 0.01\n", "2019-07-07 19:07:11 INFO Detected encoding: ascii\n", "2019-07-07 19:07:11 INFO Found 300 rows and 2 columns\n", "2019-07-07 19:07:11 DEBUG Checking column names\n", "2019-07-07 19:07:11 DEBUG Index name 'name'\n", "2019-07-07 19:07:11 DEBUG Column name 'x'\n", "2019-07-07 19:07:11 INFO Checking data format\n", "2019-07-07 19:07:11 INFO Column 'x'\n", "2019-07-07 19:07:11 INFO count 300.000000\n", "2019-07-07 19:07:11 INFO mean 4.331423\n", "2019-07-07 19:07:11 INFO std 1.316879\n", "2019-07-07 19:07:11 INFO min 1.616267\n", "2019-07-07 19:07:11 INFO 50% 4.038210\n", "2019-07-07 19:07:11 INFO max 7.776609\n", "2019-07-07 19:07:11 INFO ---\n", "2019-07-07 19:07:11 INFO Reading data file 'demo_real_location.tsv' as 'real location' with error 0.01\n", "2019-07-07 19:07:11 INFO Detected encoding: ascii\n", "2019-07-07 19:07:11 INFO Found 300 rows and 2 columns\n", "2019-07-07 19:07:11 DEBUG Checking column names\n", "2019-07-07 19:07:11 DEBUG Index name 'name'\n", "2019-07-07 19:07:11 DEBUG Column name 'y'\n", "2019-07-07 19:07:11 INFO Checking data format\n", "2019-07-07 19:07:11 INFO Column 'y'\n", "2019-07-07 19:07:11 INFO count 300.000000\n", "2019-07-07 19:07:11 INFO mean 3.018801\n", "2019-07-07 19:07:11 INFO std 2.263316\n", "2019-07-07 19:07:11 INFO min -1.607160\n", "2019-07-07 19:07:11 INFO 50% 3.882919\n", "2019-07-07 19:07:11 INFO max 6.949139\n", "2019-07-07 19:07:11 INFO ---\n", "2019-07-07 19:07:11 INFO Preparing input data\n", "2019-07-07 19:07:11 INFO Final dataframe has 300 lines and 3 columns\n", "2019-07-07 19:07:11 INFO Searching for missing values\n", "2019-07-07 19:07:11 INFO No missing values found\n", "2019-07-07 19:07:11 INFO Writing autoclass.db2 file\n", "2019-07-07 19:07:11 INFO If any, missing values will be encoded as '?'\n", "2019-07-07 19:07:11 DEBUG Writing autoclass.tsv file [for later use]\n", "2019-07-07 19:07:11 INFO Writing .hd2 file\n", "2019-07-07 19:07:11 INFO Writing .model file\n", "2019-07-07 19:07:11 INFO Writing .s-params file\n", "2019-07-07 19:07:11 INFO Writing .r-params file\n" ] } ], "source": [ "# Create object to prepare dataset.\n", "clust = wrapper.Input()\n", "\n", "# Load datasets from tsv files.\n", "clust.add_input_data(\"demo_real_scalar.tsv\", \"real scalar\")\n", "clust.add_input_data(\"demo_real_location.tsv\", \"real location\")\n", "\n", "# Prepare input data:\n", "# - create a final dataframe\n", "# - merge datasets if multiple inputs\n", "clust.prepare_input_data()\n", "\n", "# Create files needed by AutoClass.\n", "clust.create_db2_file()\n", "clust.create_hd2_file()\n", "clust.create_model_file()\n", "clust.create_sparams_file()\n", "clust.create_rparams_file()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 2 - prepare run script & run autoclass\n", "\n", "The file `autoclass-run-success` is created if AutoClass C has run without any issue. \n", "Otherwise, the file `autoclass-run-failure` is created." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2019-07-07 19:07:14 INFO AutoClass C executable found in /home/pierre/.soft/bin/autoclass\n", "2019-07-07 19:07:14 INFO Writing run file\n", "2019-07-07 19:07:14 INFO AutoClass C executable found in /home/pierre/.soft/bin/autoclass\n", "2019-07-07 19:07:14 INFO AutoClass C version: AUTOCLASS C (version 3.3.6unx)\n", "2019-07-07 19:07:14 INFO Running clustering...\n" ] } ], "source": [ "# Clean previous status file and results if a classification has already been performed.\n", "!rm -f autoclass-run-* *.results-bin\n", "\n", "# Search autoclass in path.\n", "wrapper.search_autoclass_in_path()\n", "\n", "# Create object to run AutoClass.\n", "run = wrapper.Run()\n", "\n", "# Prepare run script.\n", "run.create_run_file()\n", "\n", "# Run AutoClass.\n", "run.run()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 3 - parse and format results\n", "\n", "AutoClass C results are parsed and formated for an easier use :\n", "\n", "- `.cdt`: cluster data (CDT) files can be open with [Java Treeview](http://jtreeview.sourceforge.net/)\n", "- `.tsv`: Tab-separated values (TSV) file can be easily open and process with Microsoft Excel, R, Python...\n", "- `_stats.tsv`: basic statistics for all classes\n", "- `_dendrogram.png`: figure with a dendrogram showing relationship between classes\n", "\n", "Note that the $n$ classes are numbered from 1 to $n$.\n", "\n", "\n", "Results are analyzed only when classification is completed.\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time: 2 sec." ] }, { "name": "stderr", "output_type": "stream", "text": [ "2019-07-07 19:07:18 INFO Extracting autoclass results\n", "2019-07-07 19:07:18 INFO Found 300 cases classified in 3 classes\n", "2019-07-07 19:07:18 INFO Aggregating input data\n", "2019-07-07 19:07:18 INFO Writing classes + probabilities .tsv file\n", "2019-07-07 19:07:18 INFO Writing .cdt file\n", "2019-07-07 19:07:18 INFO Writing .cdt file (with probabilities)\n", "2019-07-07 19:07:18 INFO Writing class statistics\n", "2019-07-07 19:07:18 INFO Writing dendrogram\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "timer = 0\n", "step = 2\n", "while not Path(\"autoclass-run-success\").exists():\n", " timer += step\n", " sys.stdout.write(\"\\r\")\n", " sys.stdout.write(f\"Time: {timer} sec.\")\n", " sys.stdout.flush()\n", " time.sleep(step)\n", "\n", "results = wrapper.Output()\n", "results.extract_results()\n", "results.aggregate_input_data()\n", "results.write_cdt()\n", "results.write_cdt(with_proba=True)\n", "results.write_class_stats()\n", "results.write_dendrogram()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dendrogram exhibits relationship between classes.\n", "\n", "Numbers in brakets are the number of cases (genes, proteins) in a class.\n", "\n", "In the above plot, classes 1 and 3 are closer to each other than to class 2. Class 1 has 101 cases, class 3 has 99 and class 2 has 100.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Results exploration\n", "\n", "All results are combined in `*_out.tsv` file.\n", "\n", "In addition to the original data (columns `name`, `x` and `y`), the class assigned to a particular case (gene, protein) is given (`main-class`) along with its probability (`main-class-proba`). Probability to belong to all classes (`class-x-proba`) are also provided." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namexymain-classmain-class-probaclass-1-probaclass-2-probaclass-3-proba
0id0004.2682074.85706510.9640.9640.00.036
1id0013.0790473.98556611.0001.0000.00.000
2id0023.7046714.37419511.0001.0000.00.000
3id0032.6818003.74505611.0001.0000.00.000
4id0043.0127383.70489611.0001.0000.00.000
\n", "
" ], "text/plain": [ " name x y main-class main-class-proba class-1-proba \\\n", "0 id000 4.268207 4.857065 1 0.964 0.964 \n", "1 id001 3.079047 3.985566 1 1.000 1.000 \n", "2 id002 3.704671 4.374195 1 1.000 1.000 \n", "3 id003 2.681800 3.745056 1 1.000 1.000 \n", "4 id004 3.012738 3.704896 1 1.000 1.000 \n", "\n", " class-2-proba class-3-proba \n", "0 0.0 0.036 \n", "1 0.0 0.000 \n", "2 0.0 0.000 \n", "3 0.0 0.000 \n", "4 0.0 0.000 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_res = pd.read_csv(\"autoclass_out.tsv\", sep=\"\\t\")\n", "df_res.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "class_to_color = {1: \"green\",\n", " 2: \"purple\",\n", " 3: \"gray\",\n", " 4: \"blue\",\n", " 5: \"orange\",\n", " 6: \"red\"}\n", "df_res[\"main-class\"] = df_res[\"main-class\"].replace(class_to_color)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Display classes" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(df_res[\"x\"], df_res[\"y\"], color=df_res[\"main-class\"], s=10)\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"y\")\n", "plt.xlim(0, 10)\n", "legend_elements = [Line2D([0], [0], marker='o', color=value, label=str(key), markersize=8) \n", " for key, value in class_to_color.items()]\n", "plt.legend(handles=legend_elements)\n", "plt.ylim(-5, 10);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compare to original distribution" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(df[\"x\"], df[\"y\"], color=df[\"color\"], s=10)\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"y\")\n", "plt.xlim(0, 10)\n", "plt.ylim(-5, 10);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Slight differences could appear at the margin between groups of points but the overall groups are found." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }