Skip to main content

A fast and covariate-adaptive method for multiple hypothesis testing

Project description

AdaFDR

GitHub version PyPI version

A fast and covariate-adaptive method for multiple hypothesis testing.

Software accompanying the paper "AdaFDR: a Fast, Powerful and Covariate-Adaptive Approach to Multiple Hypothesis Testing", 2018.

Requirement

  • AdaFDR runs on python 3.6

Installation

pip install adafdr

Usage

Import package

adafdr.method contains all methods while adafdr.data_loader contains the data. They can be imported as

import adafdr.method as md
import adafdr.data_loader as dl

Other ways of importing are usually compatible. For example, one can import the package with import adafdr and call method xxx in the method module via adafdr.method.xxx()

Input format

For a set of N hypotheses, the input data includes the p-values p and the d-dimensional covariate x, with the following format:

  • p: (N,) numpy.ndarray.
  • x: (N,d) numpy.ndarray.

When d=1, x is allowed to be either (N,) numpy.ndarray or (N,1) numpy.ndarray.

Covariate visualization

The covariate visualization method adafdr_explore can be used as

adafdr.method.adafdr_explore(p, x, output_folder=None, covariate_type=None)
  • If the output_folder is not None, the covariate visualization figures will be saved in output_folder. Otherwise, they will show up in the console.
  • covariate_type specifies the type of each covariate: 0 means numerical/ordinal while 1 means categorical. For example, covariate_type=[0,1] means there are 2 covariates, the first is numerical/ordinal and the second is categorical. If not specified, a covariate with more than 75 distinct values is regarded as numerical/ordinal and otherwise categorical.
  • See also doc for more details.

Multiple testing

The multiple hypothesis testing method adafdr_test can be used as

  • fast version (default): res = adafdr.method.adafdr_test(p, x, alpha=0.1, covariate_type=None)
  • regular version: res = adafdr.method.adafdr_test(p, x, alpha=0.1, fast_mode=False, covariate_type=None)
  • regular version with multi-core: res = adafdr.method.adafdr_test(p, x, alpha=0.1, fast_mode=False, single_core=False, covariate_type=None)

res is a dictionary containing the results, including:

  • res['decision']: a (N,) boolean vector, decision for each hypothesis with value 1 meaning rejection.
  • res['threshold']: a (N,) float vector, threshold for each hypothesis.

If output_folder is a folder path, log files will be saved in the folder.

covariate_type specifies the type of each covariate: 0 means numerical/ordinal while 1 means categorical. For example, covariate_type=[0,1] means there are 2 covariates, the first is numerical/ordinal and the second is categorical. If not specified, a covariate with more than 75 distinct values is regarded as numerical/ordinal and otherwise categorical.

See also doc for more details.

Example on airway RNA-seq data

The following is an example on the airway RNA-seq data used in the paper.

Import package and load data

Here we load the airway data used in the paper. See vignettes for other data accompanied with the package.

import adafdr.method as md
import adafdr.data_loader as dl
p,x = dl.data_airway()

Covariate visualization using adafdr_explore

md.adafdr_explore(p, x, output_folder=None)

p_scatter ratio

Here, the left is a scatter plot of each hypothesis with p-values (y-axis) plotted against the covariate (x-axis). The right panel shows the estimated null hypothesis distribution (blue) and the estimated alternative hypothesis distribution (orange) with respect to the covariate. Here we can conclude that a hypothesis is more likely to be significant if the covariate (gene expression) value is higher.

Multiple hypothesis testing using adafdr_test

res = md.adafdr_test(p, x, fast_mode=True, output_folder=None)

Here, the learned threshold res['threshold'] looks as follows.

p_scatter

Each orange dot corresponds to the threhsold to one hypothesis. The discrepancy at the right is due to the difference between the thresholds learned by the two folds.

Quick Test

Here is a quick test. First check if the package can be successfully imported:

import adafdr.method as md
import adafdr.data_loader as dl

Next, run a small example which should take a few seconds:

import numpy as np
p,x,h,_,_ = dl.load_1d_bump_slope()
res = md.adafdr_test(p, x, alpha=0.1)
t = res['threshold']
D = np.sum(p<=t)
FD = np.sum((p<=t)&(~h))
print('# AdaFDR successfully finished!')
print('# D=%d, FD=%d, FDP=%0.3f'%(D, FD, FD/D))

It runs AdaFDR-fast on a 1d simulated data. If the package is successfully imported, the result should look like:

# AdaFDR successfully finished! 
# D=840, FD=80, FDP=0.095

Citation information

Zhang, Martin J., Fei Xia, and James Zou. "AdaFDR: a Fast, Powerful and Covariate-Adaptive Approach to Multiple Hypothesis Testing." bioRxiv (2018): 496372.

Xia, Fei, et al. "Neuralfdr: Learning discovery thresholds from hypothesis features." Advances in Neural Information Processing Systems. 2017.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

adafdr-0.1.6.tar.gz (12.0 MB view details)

Uploaded Source

Built Distribution

adafdr-0.1.6-py3-none-any.whl (12.1 MB view details)

Uploaded Python 3

File details

Details for the file adafdr-0.1.6.tar.gz.

File metadata

  • Download URL: adafdr-0.1.6.tar.gz
  • Upload date:
  • Size: 12.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.19.5 CPython/3.6.3

File hashes

Hashes for adafdr-0.1.6.tar.gz
Algorithm Hash digest
SHA256 ebdf7ae16b3288eb83d9b7142e458207d6d35c89a3976bf1a52598631cc4bb01
MD5 1c26cf9790eb2084fa98485c46ebd51e
BLAKE2b-256 facc6d94b43e4f1875d04d3205d85448b1caf23880d900cb8b456e0f25976b3e

See more details on using hashes here.

File details

Details for the file adafdr-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: adafdr-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 12.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.19.5 CPython/3.6.3

File hashes

Hashes for adafdr-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 beb2168a1423b917a93cd3d1c6a4d74ba67f76677aa9661728503c78bc44516f
MD5 293bd695d31860a7c97237f3d5283d6a
BLAKE2b-256 3298caf9a524594113f18788bbd684901e7efbf9ce5284b16cdef385853d30f5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page