Loading a multi-omics dataset#

Suppose you have your own -omics dataset(s) and you’d like to load them. One of OpenOmics’s primary goal is to encapsulate the data import process with one line of code along with a few parameters. Given any processed single-omic dataset, the library loads the data as a tabular structure where rows correspond to observation samples and columns correspond to measurements of different biomolecules.

Import TCGA LUAD data included in tests dataset (preprocessed from TCGA-Assembler). It is located at tests/data/TCGA_LUAD.

folder_path = "tests/data/TCGA_LUAD/"

Load the multiomics: Gene Expression, MicroRNA expression lncRNA expression, Copy Number Variation, Somatic Mutation, DNA Methylation, and Protein Expression data

from openomics import MessengerRNA, MicroRNA, LncRNA, SomaticMutation, Protein

# Load each expression dataframe
mRNA = MessengerRNA(data=folder_path + "LUAD__geneExp.txt",
                    transpose=True, usecols="GeneSymbol|TCGA", gene_index="GeneSymbol", gene_level="gene_name")
miRNA = MicroRNA(data=folder_path + "LUAD__miRNAExp__RPM.txt",
                 transpose=True, usecols="GeneSymbol|TCGA", gene_index="GeneSymbol", gene_level="transcript_name")
lncRNA = LncRNA(data=folder_path + "TCGA-rnaexpr.tsv",
                transpose=True, usecols="Gene_ID|TCGA", gene_index="Gene_ID", gene_level="gene_id")
som = SomaticMutation(data=folder_path + "LUAD__somaticMutation_geneLevel.txt",
                      transpose=True, usecols="GeneSymbol|TCGA", gene_index="gene_name")
pro = Protein(data=folder_path + "protein_RPPA.txt",
              transpose=True, usecols="GeneSymbol|TCGA", gene_index="GeneSymbol", gene_level="protein_name")

# Create an integrated MultiOmics dataset
luad_data = MultiOmics(cohort_name="LUAD")
luad_data.add_clinical_data(
    clinical=folder_path + "nationwidechildrens.org_clinical_patient_luad.txt")

luad_data.add_omic(mRNA)
luad_data.add_omic(miRNA)
luad_data.add_omic(lncRNA)
luad_data.add_omic(som)
luad_data.add_omic(pro)

luad_data.build_samples()

Each data is stored as a Pandas DataFrame. Below are all the data imported for TCGA LUAD. For each, the first number represents the number of samples, the second number is the number of features.

PATIENTS (522, 5) SAMPLES (1160, 6) DRUGS (461, 4) MessengerRNA (576, 20472) SomaticMutation (587, 21070) MicroRNA (494, 1870) LncRNA (546, 12727) Protein (364, 154)

You may notice that in this dataset, the samples index (e.g. TCGA-XX-XXXX) across different omics does not match. It may be necessary to change them to be 12 characters in total.

lncRNA.expressions.index = lncRNA.expressions.index.str.slice(-12, )
miRNA.expressions.index = miRNA.expressions.index.str.slice(0, 12)
mRNA.expressions.index = mRNA.expressions.index.str.slice(0, 12)
som.expressions.index = som.expressions.index.str.slice(0, 12)
pro.expressions.index = pro.expressions.index.str.slice(0, 12)

luad_data.build_samples()
luad_data.samples

Index([‘TCGA-05-4244’, ‘TCGA-05-4249’, ‘TCGA-05-4250’, ‘TCGA-05-4382’, ‘TCGA-05-4384’, ‘TCGA-05-4389’, ‘TCGA-05-4390’, ‘TCGA-05-4395’, ‘TCGA-05-4396’, ‘TCGA-05-4397’, … ‘TCGA-NJ-A4YG’, ‘TCGA-NJ-A4YI’, ‘TCGA-NJ-A4YP’, ‘TCGA-NJ-A4YQ’, ‘TCGA-NJ-A55A’, ‘TCGA-NJ-A55O’, ‘TCGA-NJ-A55R’, ‘TCGA-NJ-A7XG’, ‘TCGA-O1-A52J’, ‘TCGA-S2-AA1A’], dtype=’object’, length=952)

Load single omics expressions for MessengerRNA, MicroRNA, LncRNA#

We instantiate the MessengerRNA, MicroRNA and LncRNA -omics expression data from gtex.data. Since the gene expression were not seperated by RNA type, we use GENCODE and Ensembl gene annotations to filter the list of mRNA, miRNA, and lncRNAs.

from openomics import MessengerRNA, MicroRNA, LncRNA

# Gene Expression
messengerRNA_id = gtex_transcripts_gene_id & pd.Index(gencode.data[gencode.data["gene_type"] == "protein_coding"]["gene_id"].unique())

messengerRNA = MessengerRNA(gtex_transcripts[gtex_transcripts["gene_id"].isin(messengerRNA_id)],
                           transpose=True, gene_index="gene_name", usecols=None, npartitions=4)

# MicroRNA expression
microRNA_id = pd.Index(ensembl.data[ensembl.data["gene_biotype"] == "miRNA"]["gene_id"].unique()) & gtex_transcripts_gene_id

microRNA = MicroRNA(gtex_transcripts[gtex_transcripts["gene_id"].isin(microRNA_id)],
                   gene_index="gene_id", transpose=True, usecols=None, )

# LncRNA expression
lncRNA_id = pd.Index(gencode.data[gencode.data["gene_type"] == "lncRNA"]["gene_id"].unique()) & gtex_transcripts_gene_id
lncRNA = LncRNA(gtex_transcripts[gtex_transcripts["gene_id"].isin(lncRNA_id)],
               gene_index="gene_id", transpose=True, usecols=None, )

Create a MultiOmics dataset#

Now, we create a MultiOmics dataset object by combining the messengerRNA, microRNA, and lncRNA.

   from openomics import MultiOmics

   gtex_data = MultiOmics(cohort_name="GTEx Tissue Avg Expressions")

   gtex_data.add_omic(messengerRNA)
   gtex_data.add_omic(microRNA)
   gtex_data.add_omic(lncRNA)

   gtex_data.build_samples()

Accessing clinical data#

Each multi-omics and clinical data can be accessed through luad_data.data[], like:

luad_data.data["PATIENTS"]
gender race histologic_subtype pathologic_stage
bcr_patient_barcode
TCGA-05-4244 MALE NaN Lung Adenocarcinoma- Not Otherwise Specified (... Stage IV
TCGA-05-4245 MALE NaN Lung Adenocarcinoma- Not Otherwise Specified (... Stage III
TCGA-05-4249 MALE NaN Lung Adenocarcinoma- Not Otherwise Specified (... Stage I
TCGA-05-4250 FEMALE NaN Lung Adenocarcinoma- Not Otherwise Specified (... Stage III
TCGA-05-4382 MALE NaN Lung Adenocarcinoma Mixed Subtype Stage I

522 rows × 4 columns

luad_data.data["MessengerRNA"]
gene_name A1BG A1BG-AS1 A1CF A2M A2ML1 A4GALT A4GNT AAAS AACS AACSP1 ... ZXDA ZXDB ZXDC ZYG11A ZYG11B ZYX ZZEF1 ZZZ3 psiTPTE22 tAKR
TCGA-05-4244-01A 4.756500 5.239211 0.000000 13.265291 0.431997 7.043317 1.033652 9.348765 9.652057 0.763921 ... 5.350285 8.197321 9.907260 0.763921 10.088859 11.471139 9.768648 9.170597 2.932118 0.000000
TCGA-05-4249-01A 6.920471 7.056843 0.402722 14.650247 1.383939 9.178805 0.717123 9.241537 9.967223 0.000000 ... 5.980428 8.950001 10.204971 4.411650 9.622978 11.199826 10.153700 9.433116 7.499637 0.000000
TCGA-05-4250-01A 5.696542 6.136327 0.000000 14.048541 0.000000 8.481646 0.996244 9.203535 9.560412 0.733962 ... 5.931168 8.517334 9.722642 4.782796 8.895339 12.408981 10.194168 9.060342 2.867956 0.000000
TCGA-05-4382-01A 7.198727 6.809804 0.000000 14.509730 2.532591 9.117559 1.657045 9.251035 10.078124 1.860883 ... 5.373036 8.441914 9.888267 6.041142 9.828389 12.725186 10.192589 9.376841 5.177029 0.000000

576 rows × 20472 columns

To match samples accross different multi-omics, use#

luad_data.match_samples(modalities=["MicroRNA", "MessengerRNA"])
Index(['TCGA-05-4384-01A', 'TCGA-05-4390-01A', 'TCGA-05-4396-01A',
       'TCGA-05-4405-01A', 'TCGA-05-4410-01A', 'TCGA-05-4415-01A',
       'TCGA-05-4417-01A', 'TCGA-05-4424-01A', 'TCGA-05-4425-01A',
       'TCGA-05-4427-01A',
       ...
       'TCGA-NJ-A4YG-01A', 'TCGA-NJ-A4YI-01A', 'TCGA-NJ-A4YP-01A',
       'TCGA-NJ-A4YQ-01A', 'TCGA-NJ-A55A-01A', 'TCGA-NJ-A55O-01A',
       'TCGA-NJ-A55R-01A', 'TCGA-NJ-A7XG-01A', 'TCGA-O1-A52J-01A',
       'TCGA-S2-AA1A-01A'],
      dtype='object', length=465)