From 7457c87aaf0ac3fe32f9ff54e6886dbd3831a3fd Mon Sep 17 00:00:00 2001 From: Jamie Morton Date: Thu, 17 Oct 2019 17:46:18 -0400 Subject: [PATCH] FIX: transposing ranks for final output. (#99) * FIX: transposing ranks for final output. Updating documentation in readme accordingly * Adding in transformers for metadata * fixing import * fixing index name for ranks * Add transformer * fixed ordering of rank calculations in q2 * TST: made transposes consistent Found that standalone cli wasn't consistent with q2. Biases weren't factored into standalone ranks. Now fixed. * TST:minor refactor * flake8 * Adding check for soils * TST: adding additional check in cystic fibrosis study. Also adding in cool figure, because, why not * Adding in changelog update * Update CHANGELOG.md --- CHANGELOG.md | 7 + README.md | 33 +++-- examples/cf/check_rhamnolipids.ipynb | 212 +++++++++++++++++++++++++++ examples/cf/q2_run.sh | 6 +- examples/soils/check_soils.ipynb | 160 ++++++++++++++++---- examples/soils/metabolites.biom | Bin 0 -> 53681 bytes examples/soils/microbes.biom | Bin 0 -> 81409 bytes examples/soils/run.sh | 12 ++ img/mmvec.png | Bin 0 -> 97546 bytes mmvec/__init__.py | 2 +- mmvec/multimodal.py | 12 +- mmvec/q2/_method.py | 23 +-- mmvec/q2/_transformer.py | 6 + mmvec/q2/tests/test_method.py | 7 +- mmvec/tests/test_multimodal.py | 17 +-- scripts/mmvec | 9 +- 16 files changed, 425 insertions(+), 81 deletions(-) create mode 100644 examples/cf/check_rhamnolipids.ipynb create mode 100644 examples/soils/metabolites.biom create mode 100644 examples/soils/microbes.biom create mode 100644 img/mmvec.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 564805a..ba2b892 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # mmvec changelog +## Version 1.0.1 (2019-10-17) +# Enhancements + - Ranks are transposed and viewable in qiime metadata tabulate [#99](https://github.com/biocore/mmvec/pull/99) + +# Bug fixes + - Ranks are now calculated consistently between q2 and standalone cli [#99](https://github.com/biocore/mmvec/pull/99) + ## Version 1.0.0 (2019-09-30) # Enhancements - Paired heatmaps are available [#89](https://github.com/biocore/mmvec/pull/89) diff --git a/README.md b/README.md index ffb2ae3..9643775 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ # mmvec Neural networks for estimating microbe-metabolite interactions through their co-occurence probabilities. +![](https://github.com/biocore/mmvec/raw/master/img/mmvec.png "mmvec") + # Installation MMvec can be installed via pypi as follows @@ -45,7 +47,7 @@ More information can found under `mmvec --help` # Qiime2 plugin -If you want to make this qiime2 compatible, install this in your +If you want to run this in a qiime environment, install this in your qiime2 conda environment (see qiime2 installation instructions [here](https://qiime2.org/)) and run the following ``` @@ -76,26 +78,22 @@ qiime mmvec paired-omics \ --o-conditionals ranks.qza \ --o-conditional-biplot biplot.qza ``` + In the results, there are two files, namely `results/conditional_biplot.qza` and `results/conditionals.qza`. The conditional biplot is a biplot representation the conditional probability matrix so that you can visualize these microbe-metabolite interactions in an exploratory manner. This can be directly visualized in Emperor as shown below. We also have the estimated conditional probability matrix given in `results/conditionals.qza`, which an be unzip to yield a tab-delimited table via `unzip results/conditionals`. Each row can be ranked, so the top most occurring metabolites for a given microbe can be obtained by identifying the highest co-occurrence probabilities for each microbe. -It is worth your time to investigate the logs (labeled under `logdir**`) that are deposited using Tensorboard. -The actual logfiles within this directory are labeled `events.out.tfevents.*` : more discussion on this later. - +These log conditional probabilities can also be viewed directly with `qiime metadata tabulate`. This can be +created as follows -Tensorboard can be run via ``` -tensorboard --logdir . +qiime metadata tabulate \ + --m-input-file results/conditionals.qza \ + --o-visualization conditionals-viz.qzv ``` -You may need to tinker with the parameters to get readable tensorflow results, namely `--p-summary-interval`, -`--epochs` and `--batch-size`. - -A description of these two graphs is outlined in the FAQs below. - Then you can run the following to generate a emperor biplot. @@ -197,6 +195,14 @@ More information behind the actions and parameters can found under `qiime mmvec 3. More model parameters : The standalone script will return the bias parameters learned for each dataset (i.e. microbe and metabolite abundances). These are stored under the summary directory (specified by `--summary`) under the names `embeddings.csv`. This file will hold the coordinates for the microbes and metabolites, along with biases. There are 4 columns in this file, namely `feature_id`, `axis`, `embed_type` and `values`. `feature_id` is the name of the feature, whether it be a microbe name or a metabolite feature id. `axis` corresponds to the name of the axis, which either corresponds to a PC axis or bias. `embed_type` denotes if the coordinate corresponds to a microbe or metabolite. `values` is the coordinate value for the given `axis`, `embed_type` and `feature_id`. This can be useful for accessing the raw parameters and building custom biplots / ranks visualizations - this also has the advantage of requiring much less memory to manipulate. +It is also important to note that you don't have to explicitly chose - it is very doable to run the standalone version first, then import those output files into qiime2. Importing can be done as follows + +``` +qiime tools import --input-path --output-path conditionals.qza --type FeatureData[Conditional] + +qiime tools import --input-path --output-path ordination.qza --type 'PCoAResults % ("biplot")' +``` + **Q** : You mentioned that you can use GPUs. How can you do that?? **A** : This can be done by running `pip install tensorflow-gpu` in your environment. See details [here](https://www.tensorflow.org/install/gpu). @@ -209,7 +215,7 @@ At the moment, these capabilities are only available for the standalone CLI due **Q** : I'm confused, what is Tensorboard? -**A** : Tensorboard is a diagnostic tool that runs in a web browser. To open tensorboard, make sure you’re in the mmvec environment and cd into the folder you are running the script above from. Then run: +**A** : Tensorboard is a diagnostic tool that runs in a web browser - note that this is only explicitly supported in the standalone version of mmvec. To open tensorboard, make sure you’re in the mmvec environment and cd into the folder you are running the script above from. Then run: ``` tensorboard --logdir . @@ -237,7 +243,8 @@ The x-axis is the number of iterations (meaning times the model is training acro The y-axis is the average number of counts off for each feature. The model is predicting the sequence counts for each feature in the samples that were set aside for testing. So in the graph above it means that, on average, the model is off by ~0.75 intensity units, which is low. However, this is ABSOLUTE error not relative error (unfortunately we don't know how to compute relative errors because of the sparsity in these datasets). -You can also compare multiple runs with different parameters to see which run performed the best. If you are doing this, be sure to look at the `training-column` example make the testing samples consistent across runs. +You can also compare multiple runs with different parameters to see which run performed the best. Useful parameters to note are `--epochs` and `--batch-size`. If you are committed to fine-tuning parameters, be sure to look at the `training-column` example make the testing samples consistent across runs. + **Q** : What's up with the `--training-column` argument? diff --git a/examples/cf/check_rhamnolipids.ipynb b/examples/cf/check_rhamnolipids.ipynb new file mode 100644 index 0000000..3c763d1 --- /dev/null +++ b/examples/cf/check_rhamnolipids.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "!ls" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[34mlatent_dim_3_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95\u001b[m\u001b[m\r\n", + "latent_dim_3_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_embedding.txt\r\n", + "latent_dim_3_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_ordination.txt\r\n", + "latent_dim_3_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_ranks.txt\r\n" + ] + } + ], + "source": [ + "!ls testing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Standalone check" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "fname = 'latent_dim_3_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_ranks.txt'\n", + "ranks = pd.read_csv(f'testing/{fname}', sep='\\t', index_col=0)\n", + "microbe_metadata = pd.read_csv('microbe-metadata.txt', sep='\\t', index_col=0)\n", + "metabolite_metadata = pd.read_csv('metabolite-metadata.txt', sep='\\t', index_col=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "microbe_metadata = microbe_metadata.loc[ranks.columns]\n", + "i = microbe_metadata.Taxon.apply(lambda x: 'Pseudomonas' in x)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "pseudomonas = microbe_metadata.loc[i].index" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "metabolite_metadata = metabolite_metadata.dropna(subset=['expert_annotation'])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "19" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.sum(ranks.loc[metabolite_metadata.index, pseudomonas[0]] > 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# qiime2 check" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n" + ] + } + ], + "source": [ + "import qiime2\n", + "ranks = qiime2.Artifact.load('ranks.qza').view(pd.DataFrame)\n", + "microbe_metadata = pd.read_csv('microbe-metadata.txt', sep='\\t', index_col=0)\n", + "metabolite_metadata = pd.read_csv('metabolite-metadata.txt', sep='\\t', index_col=0)\n", + "microbe_metadata = microbe_metadata.loc[ranks.columns]\n", + "i = microbe_metadata.Taxon.apply(lambda x: 'Pseudomonas' in x)\n", + "pseudomonas = microbe_metadata.loc[i].index" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "metabolite_metadata = metabolite_metadata.dropna(subset=['expert_annotation'])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "19" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.sum(ranks.loc[metabolite_metadata.index, pseudomonas[0]] > 0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.6.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/cf/q2_run.sh b/examples/cf/q2_run.sh index 42dc15f..fad670f 100644 --- a/examples/cf/q2_run.sh +++ b/examples/cf/q2_run.sh @@ -8,6 +8,7 @@ qiime mmvec paired-omics \ --p-learning-rate 1e-3 \ --o-conditionals ranks.qza \ --o-conditional-biplot biplot.qza \ + --p-summary-interval 1 \ --verbose qiime emperor biplot \ @@ -27,6 +28,5 @@ mmvec paired-omics \ --metabolite-file lcms_nt.biom \ --epochs 100 \ --learning-rate 1e-3 \ - --summary-dir testing - -qiime tools import --input-path testing/latent_dim_3_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_ranks.txt --output-path ranks.qza --type FeatureData[Conditional] + --summary-interval 1 \ + --summary-dir summary diff --git a/examples/soils/check_soils.ipynb b/examples/soils/check_soils.ipynb index e2d904d..c407914 100644 --- a/examples/soils/check_soils.ipynb +++ b/examples/soils/check_soils.ipynb @@ -11,6 +11,13 @@ "%matplotlib inline" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# standalone check" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -21,9 +28,9 @@ "output_type": "stream", "text": [ "\u001b[34mlatent_dim_1_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95\u001b[m\u001b[m\r\n", - "latent_dim_1_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_embedding.csv\r\n", + "latent_dim_1_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_embedding.txt\r\n", "latent_dim_1_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_ordination.txt\r\n", - "latent_dim_1_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_ranks.csv\r\n" + "latent_dim_1_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95_ranks.txt\r\n" ] } ], @@ -38,7 +45,7 @@ "outputs": [], "source": [ "datadir = 'summarydir/latent_dim_1_input_prior_1.00_output_prior_1.00_beta1_0.90_beta2_0.95'\n", - "ranks = pd.read_csv(datadir + '_ranks.csv', index_col=0)" + "ranks = pd.read_csv(datadir + '_ranks.txt', index_col=0, sep='\\t')" ] }, { @@ -49,11 +56,12 @@ { "data": { "text/plain": [ - "(2,3-dihydroxy-3-methylbutanoate) 0.000000\n", - "(2,5-diaminohexanoate) 0.030698\n", - "(3-hydroxypyridine) 0.030141\n", - "(3-methyladenine) 0.032587\n", - "(4-oxoproline) 0.036312\n", + "featureid\n", + "(2,3-dihydroxy-3-methylbutanoate) -5.243021\n", + "(2,5-diaminohexanoate) -1.290612\n", + "(3-hydroxypyridine) 0.002373\n", + "(3-methyladenine) 0.971289\n", + "(4-oxoproline) 2.978444\n", "Name: rplo 1 (Cyanobacteria), dtype: float64" ] }, @@ -63,7 +71,7 @@ } ], "source": [ - "ranks.loc['rplo 1 (Cyanobacteria)'].head()" + "ranks['rplo 1 (Cyanobacteria)'].head()" ] }, { @@ -84,8 +92,8 @@ "metadata": {}, "outputs": [], "source": [ - "idx = ranks.loc['rplo 1 (Cyanobacteria)'] > 0 \n", - "detected_molecules = set(ranks.columns[idx])" + "idx = ranks['rplo 1 (Cyanobacteria)'] > 0 \n", + "detected_molecules = set(ranks.index[idx])" ] }, { @@ -168,19 +176,20 @@ { "data": { "text/plain": [ - "xanthine 0.030167\n", - "guanine 0.033443\n", - "(N6-acetyl-lysine) 0.031525\n", - "cytosine 0.033451\n", - "adenosine 0.038334\n", - "(3-methyladenine) 0.032587\n", - "4-guanidinobutanoate 0.031690\n", - "uracil 0.032330\n", - "hypoxanthine 0.032204\n", - "7-methyladenine 0.029252\n", - "N-acetylornithine 0.033029\n", - "succinate 0.033501\n", - "adenine 0.032958\n", + "featureid\n", + "cytosine 3.238725\n", + "xanthine 0.687712\n", + "N-acetylornithine 1.247421\n", + "uracil 1.778591\n", + "adenine 4.983674\n", + "(N6-acetyl-lysine) 4.423469\n", + "4-guanidinobutanoate 4.031901\n", + "guanine 3.107524\n", + "hypoxanthine 0.666798\n", + "7-methyladenine 0.302561\n", + "succinate 0.893106\n", + "(3-methyladenine) 0.971289\n", + "adenosine 4.995941\n", "Name: rplo 1 (Cyanobacteria), dtype: float64" ] }, @@ -190,7 +199,7 @@ } ], "source": [ - "ranks.loc['rplo 1 (Cyanobacteria)'].loc[microcoleus_metabolites]" + "ranks['rplo 1 (Cyanobacteria)'].loc[microcoleus_metabolites]" ] }, { @@ -202,6 +211,107 @@ "assert len(detected_molecules & microcoleus_metabolites) == 13" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# qiime2 check" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import qiime2\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", + "/Users/jmorton/miniconda3/envs/qiime2-2019.7/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", + " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n" + ] + } + ], + "source": [ + "ranks = qiime2.Artifact.load('ranks.qza').view(pd.DataFrame)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "idx = ranks['rplo 1 (Cyanobacteria)'] > 0 \n", + "detected_molecules = set(ranks.index[idx])\n", + "assert len(detected_molecules & microcoleus_metabolites) == 13" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "featureid\n", + "cytosine 3.147861\n", + "xanthine 0.842640\n", + "N-acetylornithine 1.281711\n", + "uracil 1.990830\n", + "adenine 5.086781\n", + "(N6-acetyl-lysine) 4.530147\n", + "4-guanidinobutanoate 4.027770\n", + "guanine 3.129724\n", + "hypoxanthine 0.713017\n", + "7-methyladenine 0.492983\n", + "succinate 0.805413\n", + "(3-methyladenine) 1.006567\n", + "adenosine 4.987744\n", + "Name: rplo 1 (Cyanobacteria), dtype: float64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ranks['rplo 1 (Cyanobacteria)'].loc[microcoleus_metabolites]" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/examples/soils/metabolites.biom b/examples/soils/metabolites.biom new file mode 100644 index 0000000000000000000000000000000000000000..4bd76fbb2142e9e518a6109cd5d6ac3741b1c0f2 GIT binary patch literal 53681 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 Y_u=c_wZOH&wZOH&wZOH&zk$Gi03A_f#Q*>R literal 0 HcmV?d00001 diff --git a/examples/soils/microbes.biom b/examples/soils/microbes.biom new file mode 100644 index 0000000000000000000000000000000000000000..0791df714fe0f8b6c108f88ca965ab59e6f6cd3a GIT binary patch literal 81409 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

h_%rBuk1B)+3k#FAO{=!qMPnA{y-mTv{rej^ zQ#RZUFR~y|}R}NiS=t)q5yJ zQfBG}`-1|KETkAXMLA$SJC(0tw^%Jnxt6X|N&ouwL~x#>X07V+oQCo8Wey2%^{ft{NG~2!STV;= zV7)*qB3)TwT7!%?BRrd9g@lMme}3a3`N3eUu6xPE#FQ)Hgc^7Jk&)Arg;Nf{Q4W^b zTG*sKZQlDEL7CIi(OJGQhuvJXbE3<}!vgo4uk)M9lp*6x7`&s9K4C#+?J!!fdM++c zCC)jcFwiSFmxnF36@)wJiglM_Xr^3PxZ-#`L&cjno8`l%^YvWhHN~zI%cs6GMSu}h zwx3ClFtd0g&L%6~7j$-$g3+p!U!43Il5yaNht!39tuUG{({OwJIY@R&sN#SnO_Ak; zqlJG#wtPYs3ePHH*Qk>3f15Foz_c2dab>Hd?K!4Sb;A!3UN2U zD@U6ZpIT`ZZ2nJ5MhZn=KT=}*?cm_A?uD9t?qJzggK{&jQUIBpYTR;Dw5m5|D5C9x0dM z^UiaH=%$2eTmDG;cpahlzM&N;_7>>+FHb{diVgo@jn{zTU1Va=yy%2m$PEE_Sl(6O}p62Fbp)QYM?2opHE@vj*l^56eAx*}+G1bQF& xx^mW)|Mn?fIHsLU+kgAj*&qCW@+C$l{mvi%X~?M3I}iU++@rEPS>c%1{|7QcK?eW; literal 0 HcmV?d00001 diff --git a/mmvec/__init__.py b/mmvec/__init__.py index 236cf4f..4f22ff9 100644 --- a/mmvec/__init__.py +++ b/mmvec/__init__.py @@ -1,5 +1,5 @@ from .heatmap import _heatmap_choices, _cmaps -__version__ = "1.0.0" +__version__ = "1.0.1" __all__ = ['_heatmap_choices', '_cmaps'] diff --git a/mmvec/multimodal.py b/mmvec/multimodal.py index ebb94e6..058986c 100644 --- a/mmvec/multimodal.py +++ b/mmvec/multimodal.py @@ -11,7 +11,7 @@ class MMvec(object): def __init__(self, u_mean=0, u_scale=1, v_mean=0, v_scale=1, batch_size=50, latent_dim=3, - learning_rate=0.1, beta_1=0.9, beta_2=0.95, + learning_rate=0.1, beta_1=0.8, beta_2=0.9, clipnorm=10., device_name='/cpu:0', save_path=None): """ Build a tensorflow model for microbe-metabolite vectors @@ -205,6 +205,16 @@ def __call__(self, session, trainX, trainY, testX, testY): tf.global_variables_initializer().run() + def ranks(self): + modelU = np.hstack( + (np.ones((self.U.shape[0], 1)), self.Ubias, self.U)) + modelV = np.vstack( + (self.Vbias, np.ones((1, self.V.shape[1])), self.V)) + + res = np.hstack((np.zeros((self.U.shape[0], 1)), modelU @ modelV)) + res = res - res.mean(axis=1).reshape(-1, 1) + return res + def fit(self, epoch=10, summary_interval=1000, checkpoint_interval=3600, testX=None, testY=None): """ Fits the model. diff --git a/mmvec/q2/_method.py b/mmvec/q2/_method.py index 515f4ca..0db3393 100644 --- a/mmvec/q2/_method.py +++ b/mmvec/q2/_method.py @@ -56,25 +56,12 @@ def paired_omics(microbes: biom.Table, loss, cv = model.fit(epoch=epochs, summary_interval=summary_interval) - U, V = model.U, model.V + ranks = pd.DataFrame(model.ranks(), index=train_microbes_df.columns, + columns=train_metabolites_df.columns) - U_ = np.hstack( - (np.ones((model.U.shape[0], 1)), - model.Ubias.reshape(-1, 1), U) - ) - V_ = np.vstack( - (model.Vbias.reshape(1, -1), - np.ones((1, model.V.shape[1])), V) - ) - - ranks = pd.DataFrame( - np.hstack((np.zeros((model.U.shape[0], 1)), U_ @ V_)), - index=train_microbes_df.columns, - columns=train_metabolites_df.columns) - - ranks = ranks - ranks.mean(axis=1).values.reshape(-1, 1) - ranks = ranks - ranks.mean(axis=0) - u, s, v = svds(ranks, k=latent_dim) + u, s, v = svds(ranks - ranks.mean(axis=0), k=latent_dim) + ranks = ranks.T + ranks.index.name = 'featureid' s = s[::-1] u = u[:, ::-1] v = v[::-1, :] diff --git a/mmvec/q2/_transformer.py b/mmvec/q2/_transformer.py index 846500e..b25a8d6 100644 --- a/mmvec/q2/_transformer.py +++ b/mmvec/q2/_transformer.py @@ -1,3 +1,4 @@ +import qiime2 import pandas as pd from mmvec.q2 import ConditionalFormat @@ -16,3 +17,8 @@ def _2(df: pd.DataFrame) -> ConditionalFormat: ff = ConditionalFormat() df.to_csv(str(ff), sep='\t', header=True, index=True) return ff + + +@plugin.register_transformer +def _3(ff: ConditionalFormat) -> qiime2.Metadata: + return qiime2.Metadata.load(str(ff)) diff --git a/mmvec/q2/tests/test_method.py b/mmvec/q2/tests/test_method.py index 0ce833b..68dc4fd 100644 --- a/mmvec/q2/tests/test_method.py +++ b/mmvec/q2/tests/test_method.py @@ -12,6 +12,7 @@ class TestMMvec(unittest.TestCase): def setUp(self): + np.random.seed(1) res = random_multimodal( num_microbes=8, num_metabolites=8, num_samples=150, latent_dim=2, sigmaQ=2, @@ -40,12 +41,14 @@ def setUp(self): def test_fit(self): np.random.seed(1) tf.reset_default_graph() - latent_dim = 2 tf.set_random_seed(0) + latent_dim = 2 res_ranks, res_biplot = paired_omics( self.microbes, self.metabolites, - epochs=1000, latent_dim=latent_dim + epochs=1000, latent_dim=latent_dim, + min_feature_count=1, learning_rate=0.1 ) + res_ranks = clr_inv(res_ranks.T) s_r, s_p = spearmanr(np.ravel(res_ranks), np.ravel(self.exp_ranks)) self.assertGreater(s_r, 0.5) diff --git a/mmvec/tests/test_multimodal.py b/mmvec/tests/test_multimodal.py index 464ff03..96eb8a8 100644 --- a/mmvec/tests/test_multimodal.py +++ b/mmvec/tests/test_multimodal.py @@ -18,6 +18,7 @@ class TestMMvec(unittest.TestCase): def setUp(self): # build small simulation + np.random.seed(1) res = random_multimodal( num_microbes=8, num_metabolites=8, num_samples=150, latent_dim=2, sigmaQ=2, @@ -49,11 +50,6 @@ def test_fit(self): coo_matrix(self.testX.values), self.testY.values) model.fit(epoch=1000) - modelU = np.hstack( - (np.ones((model.U.shape[0], 1)), model.Ubias, model.U)) - modelV = np.vstack( - (model.Vbias, np.ones((1, model.V.shape[1])), model.V)) - U_ = np.hstack( (np.ones((self.U.shape[0], 1)), self.Ubias, self.U)) V_ = np.vstack( @@ -62,7 +58,7 @@ def test_fit(self): u_r, u_p = spearmanr(pdist(model.U), pdist(self.U)) v_r, v_p = spearmanr(pdist(model.V.T), pdist(self.V.T)) - res = softmax(np.hstack((np.zeros((d1, 1)), modelU @ modelV))) + res = softmax(model.ranks()) exp = softmax(np.hstack((np.zeros((d1, 1)), U_ @ V_))) s_r, s_p = spearmanr(np.ravel(res), np.ravel(exp)) @@ -108,16 +104,11 @@ def test_soils(self): coo_matrix(self.testX.values), self.testY.values) model.fit(epoch=1000) - modelU = np.hstack( - (np.ones((model.U.shape[0], 1)), model.Ubias, model.U)) - modelV = np.vstack( - (model.Vbias, np.ones((1, model.V.shape[1])), model.V)) - ranks = pd.DataFrame( - np.hstack((np.zeros((d1, 1)), modelU @ modelV)), + model.ranks(), index=self.microbes.ids(axis='observation'), columns=self.metabolites.ids(axis='observation')) - ranks = ranks - ranks.mean(axis=1).values.reshape(-1, 1) + microcoleus_metabolites = [ '(3-methyladenine)', '7-methyladenine', '4-guanidinobutanoate', 'uracil', 'xanthine', 'hypoxanthine', '(N6-acetyl-lysine)', diff --git a/scripts/mmvec b/scripts/mmvec index 1164c6d..92a66dd 100644 --- a/scripts/mmvec +++ b/scripts/mmvec @@ -189,15 +189,14 @@ def paired_omics(microbe_file, metabolite_file, df.to_csv(embeddings_file, sep='\t') # Save to a ranks file - ranks = pd.DataFrame(model.U @ V.T, index=train_microbes_df.columns, + ranks = pd.DataFrame(model.ranks(), index=train_microbes_df.columns, columns=train_metabolites_df.columns) - ranks = ranks - ranks.mean(axis=1).values.reshape(-1, 1) + + u, s, v = svds(ranks - ranks.mean(axis=0), k=latent_dim) + ranks = ranks.T ranks.index.name = 'featureid' ranks.to_csv(ranks_file, sep='\t') - # Save to an ordination file - ranks = ranks - ranks.mean(axis=0) - u, s, v = svds(ranks, k=latent_dim) s = s[::-1] u = u[:, ::-1] v = v[::-1, :]