Skip to main content

PheTK - Phenotype Toolkit

Project description

PheTK - The Phenotype Toolkit

The official repository of PheTK.

Current version: 0.1.36

1. INSTALLATION

PheTK can be installed using pip install command in a terminal (Python 3.7 or newer):

pip install PheTK

or Jupyter Notebook (restart kernel after installation and prior to importing):

!pip install PheTK

If and older version of PheTK was installed previously, it is best to uninstall it before new installation

pip uninstall PheTK -y && pip install PheTK

To check current installed version:

pip show PheTK | grep Version

2. SYSTEM REQUIREMENTS

As PheTK utilizes multithreading to speed up computational processes, the more CPUs/cores the system has, the faster it would run. Memory requirement would vary based on computing platform, user actual workflow and how efficient it is.

In our test, a PheWAS for a cohort of 400,000+ participants and 12 covariates successfully completed on a MacBook Pro M2 Pro 12 CPU cores 32GB RAM in ~81 minutes; PheWAS for the same cohort took ~12 minutes with a cloud instance of 96 CPUs 370GB RAM (memory choice here is mainly for redundancy and for comparison with other tests that we did).

In short, the more CPUs the better and RAM should be adequate for user workflow.

3. 1-MINUTE PHEWAS DEMO

User can run the quick 1-minute PheWAS demo with the following command in a terminal:

python3 -m PheTK.Demo

Or in Jupyter Notebook:

from PheTK import Demo

Demo.run()

4. DESCRIPTIONS

PheTK is a fast python library for Phenome Wide Association Studies (PheWAS) utilizing both phecode 1.2 and phecodeX 1.0.

4.1. PheWAS workflow and PheTK modules

PheWAS workflow and PheTK modules Standard PheWAS workflow. Green texts are PheTK module names. Black components are supported while gray ones are not supported by PheTK currently.

4.2. PheTK module descriptions

This table will be updated as we update PheTK.

Module Class Method(s) Platform Requirements/Notes
Cohort Cohort by_genotype All of Us None
Other Variant data stored in Hail matrix table
add_covariate All of Us None
Other Google BigQuery OMOP database
Required tables: person, condition_occurrence, observation, death, & concept
Phecode Phecode count_phecode All of Us None
Other User provided cohort ICD code data
User can use custom ICD-to-phecode mapping table.
PheWAS PheWAS all methods Any None
Plot Plot all methods Any None
Demo all methods Any None

All of Us: the All of Us Research Program (https://allofus.nih.gov/)

5. USAGE

5.1. Cohort module

Cohort module can be used for generating genetic cohort and add certain covariates to a cohort.

5.1.1. by_genotype

This function takes genetic variant information as input, and generates cohort with matching genotypes as an output csv file.

For example, we generate cohort for CFTR variant chr7-117559590-ATCT-A with heterozygous (0/1 genotype) participants as cases and homozygous reference (0/0 genotype) participants as controls.

Jupyter Notebook example for All of Us Researcher Workbench:

For All of Us data version 7, the default Hail matrix table is the ACAF (common variant) table. User can use a different table by providing table location in the mt_path parameter.

from PheTK.Cohort import Cohort

# instantiate class Cohort object for _All of Us_ database version 7
cohort = Cohort(platform="aou", aou_db_version=7)

# generate cohort by genotype
cohort.by_genotype(
    chromosome_number=7,
    genomic_position=117559590,
    ref_allele="ATCT",
    alt_allele="A",
    case_gt="0/1",
    control_gt="0/0",
    reference_genome="GRCh38",
    mt_path=None,
    output_file_name="cftr_cohort.csv"
)

Jupyter Notebook example for other platforms:

For other platforms, user need to provide the location of Hail matrix table file for mt_path parameter.

from PheTK.Cohort import Cohort

# instantiate class Cohort object for _All of Us_ database version 7
cohort = Cohort(platform="custom")

# generate cohort by genotype
cohort.by_genotype(
    chromosome_number=7,
    genomic_position=117559590,
    ref_allele="ATCT",
    alt_allele="A",
    case_gt="0/1",
    control_gt="0/0",
    reference_genome="GRCh38",
    mt_path="/path/to/hail_matrix_table.mt",
    output_file_name="cftr_cohort.csv"
)

5.1.2. add_covariates

This function is currently customized for the All of Us Research Platform. It takes a cohort csv file and covariate selection as input, and generate a new cohort csv file with covariate data added as output. Input cohort data must have "person_id" column.

For non-All of Us platforms, a Google BigQuery dataset ID must be provided.

In this example, we are adding age at last diagnosis event, sex at birth and 10 genetic PCs (provided by All of Us). These options were set to True (or 10 in case of first_n_pcs).

The covariates shown in this example are currently supported by PheTK. Users should only change parameter value to True for covariates to be used in subsequent PheWAS. All parameters are set to False by default, i.e., user only need to specify parameters of interest as shown in the "short version".

Users should decide which covariates to use for the study based on their data, and to add or use their own covariate data if necessary.

Jupyter Notebook example for All of Us Researcher Workbench:

# user can skip the import and instantiation steps if running continuously 
# from previous by_genotype example, i.e., skip directly to add covariates step.
from PheTK.Cohort import Cohort

# instantiate class Cohort object for _All of Us_ database version 7
cohort = Cohort(platform="aou", aou_db_version=7)

# RUN EITHER LONG OR SHORT VERSION BELOW
# add covariates - long version, including all currently supported covariate options
cohort.add_covariates(
    cohort_csv_path="cftr_cohort.csv",
    natural_age=False,
    age_at_last_event=True,
    sex_at_birth=True,
    ehr_length=False,
    dx_code_occurrence_count=False,
    dx_condition_count=False,
    genetic_ancestry=False,
    first_n_pcs=10,
    drop_nulls=True,
    output_file_name="cohort_with_covariates.csv"
)

# add covariates - short version, i.e., users do not need to list unused covariates
cohort.add_covariates(
    cohort_csv_path="cftr_cohort.csv",
    age_at_last_event=True,
    sex_at_birth=True,
    first_n_pcs=10,
    drop_nulls=True,
    output_file_name="cohort_with_covariates.csv"
)

Covariate descriptions:

  • natural_age: current age or age at death
  • age_at_last_event: age at last diagnosis event (ICD or SNOMED) in EHR.
  • sex_at_birth: sex at birth
  • ehr_length: EHR duration, in year, from first to last diagnosis code
  • dx_code_occurrence_count: counts the occurrences of diagnosis codes throughout EHR of each participant. For example: person 1 having R50 (fever) code on 5 different dates, R05 (cough) code on 3 different dates, and R05.1 (acute cough) code on 2 different dates, will have a dx_code_occurrence_count = 10.
  • dx_condition_count: counts the number of unique conditions occurred throughout EHR of each participant. For example, for the same person 1 above, the dx_condition_count = 3 (R05 - cough, R05.1 - acute cough, R50 - fever).
  • genetic_ancestry: returns string values of predicted ancestries, e.g., "eur", "afr", etc. These are only useful if user would like to filter data by genetic ancestries.
  • first_n_pcs: retrieves first n genetic PC components from genetic PCA data generated by All of Us.
  • drop_nulls: remove rows containing null values in any column.

Jupyter Notebook example for other platforms with OMOP data stored in Google BigQuery:

The only difference in this case is that user need to provide dataset ID for gbq_dataset_id parameter. The rest should be the same as above example. Please make sure the custom database meet the requirements in section 4.2.

from PheTK.Cohort import Cohort

cohort = Cohort(platform="custom", gbq_dataset_id="Google_BigQuery_dataset_id")

5.2. Phecode module

Phecode module is used to retrieve ICD code data of participants, map ICD codes to phecode 1.2 or phecodeX 1.0, and aggregate the counts for each phecode of each participant.

The ICD code retrieval is done automatically for All of Us platform when users instantiate class Phecode. For other platforms, users must provide your own ICD code data.

Example of ICD code data:

  • Each row must be unique, i.e., there should not be 2 instances of 1 ICD code in the same day.
  • Data must have these exact column names.
  • "vocabulary_id" column can be replaced with "flag" column with values of 9 and 10.

Example with "vocabulary_id" column:

person_id date vocabulary_id ICD
13579 1-11-2010 ICD9CM 786.2
13579 1-31-2010 ICD9CM 786.2
13579 12-4-2017 ICD10CM R05.1
24680 3-12-2012 ICD9CM 659.2
24680 4-18-2018 ICD10CM R50

Example with "flag" column:

person_id date flag ICD
13579 1-11-2010 9 786.2
13579 1-31-2010 9 786.2
13579 12-4-2017 10 R05.1
24680 3-12-2012 9 659.2
24680 4-18-2018 10 R50

In these examples, we will map US ICD codes (ICD-9-CM & ICD-10-CM) to phecodeX for All of Us and custom platforms.

Jupyter Notebook example for All of Us:

from PheTK.Phecode import Phecode

phecode = Phecode(platform="aou")
phecode.count_phecode(
    phecode_version="X", 
    icd_version="US",
    phecode_map_file_path=None, 
    output_file_name="my_phecode_counts.csv"
)

Jupyter Notebook example for other platforms

from PheTK.Phecode import Phecode

phecode = Phecode(platform="custom", icd_df_path="/path/to/my_icd_data.csv")
phecode.count_phecode(
    phecode_version="X", 
    icd_version="US", 
    phecode_map_file_path=None,
    output_file_name="my_phecode_counts.csv"
)

Users can provide their own phecode mapping file by adding a csv file path to phecode_map_file_path. If user provides their own ICD data, platform should be set to "custom".

5.3. PheWAS module

It is recommended to run Demo example above and have a look at example cohort and phecode counts file to be familiar with input data format. The example files should be generated in user's current working directory.

PheWAS class is instantiated with paths to csv files of cohort data and phecode counts data, in addition to other parameters as shown in the examples below. It can be used in both Linux command line interface (CLI) and any Python environment, e.g., Jupyter Notebook/Lab.

In these example, we would like to run PheWAS with phecodeX for example data generated by Demo module, with age, sex and 3 genetic PCs as covariates, and an independent variable of interest (for which PheWAS summary statistics will be generated). For each phecode, a participant must have a minimum count of 2 phecode events to be considered a case. There must be at least 50 cases and 50 controls for the phecode to be tested.

CLI example:

python3 -m PheTK.PheWAS \
--phecode_version X \
--cohort_csv_path example_cohort.csv \
--phecode_count_csv_path example_phecode_counts.csv \
--sex_at_birth_col sex \
--male_as_one True \
--covariates age sex pc1 pc2 pc3 \
--independent_variable_of_interest independent_variable_of_interest \
--min_case 50 \
--min_phecode_count 2 \
--output_file_name example_phewas_results.csv

Jupyter Notebook example:

from PheTK.PheWAS import PheWAS

example_phewas = PheWAS(
    phecode_version="X",
    phecode_count_csv_path="example_phecode_counts.csv",
    cohort_csv_path="example_cohort.csv",
    sex_at_birth_col="sex",
    male_as_one=True,
    covariate_cols=["age", "sex", "pc1", "pc2", "pc3"],
    independent_variable_of_interest="independent_variable_of_interest",
    min_cases=50,
    min_phecode_count=2,
    output_file_name="example_phewas_results.csv"
)
example_phewas.run()

Notes:

  • Each entry in sex_at_birth column should be either 0 or 1 for female or male. The default is male = 1 and female = 0.
  • User can use male_as_one to specify where male was coded as 1 (male_as_one=True) or 0 (male_as_one=False).
  • In the above example, "sex" column was declared twice, once in sex_at_birth_col and once in covariate_cols. sex_at_birth_col is always required as certain phecodes are sex restricted. If user would like to use sex as a covariate, sex column must be included in covariate_cols.

5.4. Plot module

Plot class is instantiated with path to PheWAS result csv file. After that, a plot type method can be called to generate a plot, e.g., calling manhattan() method to make Manhattan plot.

In this example, we are generating a Manhattan plot for the PheWAS results created by module Demo.

Jupyter Notebook example:

from PheTK.Plot import Plot

p = Plot("example_phewas_results.csv")
p.manhattan(label_values="p_value", label_count=1, save_plot=True)

The above code example generates this Manhattan plot figure:

Example Manhattan plot

Details on plot customization options will be provided in a separate document in the near future.

6. CONTACT

PheTK@mail.nih.gov

7. CITATION

Preprint version: https://www.medrxiv.org/content/10.1101/2024.02.12.24302720v1

Peer reviewed version: TBD

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

PheTK-0.1.36.tar.gz (1.3 MB view details)

Uploaded Source

Built Distribution

PheTK-0.1.36-py3-none-any.whl (1.4 MB view details)

Uploaded Python 3

File details

Details for the file PheTK-0.1.36.tar.gz.

File metadata

  • Download URL: PheTK-0.1.36.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.13

File hashes

Hashes for PheTK-0.1.36.tar.gz
Algorithm Hash digest
SHA256 7d4a912bfbc1fb6374824f003b7d391f27ce67a79223898f31662d331b864539
MD5 81bdfbf161ea50faa36ec34de865b259
BLAKE2b-256 4c7978391ecbaaaa2758f22e0308a365acc2534ac15fc8398d50ea043c3a3bc3

See more details on using hashes here.

File details

Details for the file PheTK-0.1.36-py3-none-any.whl.

File metadata

  • Download URL: PheTK-0.1.36-py3-none-any.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.13

File hashes

Hashes for PheTK-0.1.36-py3-none-any.whl
Algorithm Hash digest
SHA256 f47170ddb557e3fafcd842eaa7842e27e7c67ad911467029d8c05d5b890dca76
MD5 2d4ef0fa6f8c119fd128373d0f575933
BLAKE2b-256 3012b270ac6e79fa4c0fa395aeaa4ee0fccd76a37a8f4e2edb73e7085798f280

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