Last updated: 2019-06-18

Checks: 6 1

Knit directory: Comparative_eQTL/analysis/

This reproducible R Markdown analysis was created with workflowr (version 1.4.0). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(20190319) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

The following chunks had caches available:
  • GO-2,
  • GO-3
  • GO-analysis

To ensure reproducibility of the results, delete the cache directory 20190521_eQTL_CrossSpeciesEnrichment_cache and re-run the analysis. To have workflowr automatically delete the cache directory prior to building the file, set delete_cache = TRUE when running wflow_build() or wflow_publish().

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility. The version displayed above was the version of the Git repository at the time these results were generated.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .DS_Store
    Ignored:    .Rhistory
    Ignored:    .Rproj.user/
    Ignored:    analysis/.DS_Store
    Ignored:    analysis/20190521_eQTL_CrossSpeciesEnrichment_cache/
    Ignored:    analysis/figure/
    Ignored:    analysis_temp/.DS_Store
    Ignored:    code/.DS_Store
    Ignored:    code/snakemake_workflow/.DS_Store
    Ignored:    data/.DS_Store
    Ignored:    data/PastAnalysesDataToKeep/.DS_Store
    Ignored:    docs/.DS_Store
    Ignored:    docs/assets/.DS_Store

Untracked files:
    Untracked:  analysis/20190617_ExpressionVarianceOfEgenes.Rmd
    Untracked:  docs/figure/20190613_PowerAnalysis.Rmd/

Unstaged changes:
    Modified:   analysis/20190613_PowerAnalysis.Rmd

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the R Markdown and HTML files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view them.

File Version Author Date Message
Rmd aa8067e Benjmain Fair 2019-06-15 added power analysis rmd
Rmd 22eda3a Benjmain Fair 2019-06-12 update site
html 22eda3a Benjmain Fair 2019-06-12 update site
Rmd 7ef6fe2 Benjmain Fair 2019-06-11 update site
html 7ef6fe2 Benjmain Fair 2019-06-11 update site

library(plyr)
library(tidyverse)
library(knitr)
library(data.table)
library(ggpmisc)
library("clusterProfiler")
library("org.Hs.eg.db")
library(gridExtra)
library(enrichplot)

Here the dataset is eQTLs called from a model with the following pre-testing filters/transformations/checks:

  • cis-window=250kB
  • MAF>10%
  • genes tested must have >6 reads in 80% of samples
  • lmm with genetic relatedness matrix produced by gemma
  • Gene expression is standardized and normalized
  • 10PCs added as covariates
  • FDR estimated by Storey’s qvalue
  • Pvalues well calibrated under a permutated null

First, Read in the data…

eQTLs <- read.table(gzfile("../data/PastAnalysesDataToKeep/20190521_eQTLs_250kB_10MAF.txt.gz"), header=T)
kable(head(eQTLs))
snps gene beta statistic pvalue FDR qvalue
ID.1.126459696.ACCCTAGTAAG.A ENSPTRG00000001061 3.570039 12.50828 0 3.5e-06 3.5e-06
ID.1.126465687.TTGT.A ENSPTRG00000001061 3.570039 12.50828 0 3.5e-06 3.5e-06
ID.1.126465750.TG.CT ENSPTRG00000001061 3.570039 12.50828 0 3.5e-06 3.5e-06
ID.1.126465756.T.C ENSPTRG00000001061 3.570039 12.50828 0 3.5e-06 3.5e-06
ID.1.126465766.C.A ENSPTRG00000001061 3.570039 12.50828 0 3.5e-06 3.5e-06
ID.1.126465774.G.A ENSPTRG00000001061 3.570039 12.50828 0 3.5e-06 3.5e-06
# List of chimp tested genes
ChimpTestedGenes <- rownames(read.table('../output/ExpressionMatrix.un-normalized.txt.gz', header=T, check.names=FALSE, row.names = 1))

ChimpToHumanGeneMap <- read.table("../data/Biomart_export.Hsap.Ptro.orthologs.txt.gz", header=T, sep='\t', stringsAsFactors = F)
kable(head(ChimpToHumanGeneMap))
Gene.stable.ID Transcript.stable.ID Chimpanzee.gene.stable.ID Chimpanzee.gene.name Chimpanzee.protein.or.transcript.stable.ID Chimpanzee.homology.type X.id..target.Chimpanzee.gene.identical.to.query.gene X.id..query.gene.identical.to.target.Chimpanzee.gene dN.with.Chimpanzee dS.with.Chimpanzee Chimpanzee.orthology.confidence..0.low..1.high.
ENSG00000198888 ENST00000361390 ENSPTRG00000042641 MT-ND1 ENSPTRP00000061407 ortholog_one2one 94.6541 94.6541 0.0267 0.5455 1
ENSG00000198763 ENST00000361453 ENSPTRG00000042626 MT-ND2 ENSPTRP00000061406 ortholog_one2one 96.2536 96.2536 0.0185 0.7225 1
ENSG00000210127 ENST00000387392 ENSPTRG00000042642 MT-TA ENSPTRT00000076396 ortholog_one2one 100.0000 100.0000 NA NA NA
ENSG00000198804 ENST00000361624 ENSPTRG00000042657 MT-CO1 ENSPTRP00000061408 ortholog_one2one 98.8304 98.8304 0.0065 0.5486 1
ENSG00000198712 ENST00000361739 ENSPTRG00000042660 MT-CO2 ENSPTRP00000061402 ortholog_one2one 97.7974 97.7974 0.0106 0.5943 1
ENSG00000228253 ENST00000361851 ENSPTRG00000042653 MT-ATP8 ENSPTRP00000061400 ortholog_one2one 94.1176 94.1176 0.0325 0.3331 1
# Of this ortholog list, how many genes are one2one
table(ChimpToHumanGeneMap$Chimpanzee.homology.type)

ortholog_many2many  ortholog_one2many   ortholog_one2one 
              2278              19917             140351 
OneToOneMap <- ChimpToHumanGeneMap %>%
  filter(Chimpanzee.homology.type=="ortholog_one2one")

# Read gtex heart egene list
# Only consider those that were tested in both species and are one2one orthologs
GtexHeartEgenes <- read.table("../data/Heart_Left_Ventricle.v7.egenes.txt.gz", header=T, sep='\t', stringsAsFactors = F) %>%
  mutate(gene_id_stable = gsub(".\\d+$","",gene_id)) %>%
  filter(gene_id_stable %in% OneToOneMap$Gene.stable.ID) %>%
  mutate(chimp_id = plyr::mapvalues(gene_id_stable, OneToOneMap$Gene.stable.ID,  OneToOneMap$Chimpanzee.gene.stable.ID, warn_missing = F)) %>%
  filter(chimp_id %in% ChimpTestedGenes)

ChimpToHuman.ID <- function(Chimp.ID){
  #function to convert chimp ensembl to human ensembl gene ids
  return(
    plyr::mapvalues(Chimp.ID, OneToOneMap$Chimpanzee.gene.stable.ID, OneToOneMap$Gene.stable.ID, warn_missing = F)
  )}

Now compare with GTEx by making 2x2 contigency table (eGene/not-eGene in Chimp/human). The odds ratio from this table is symetrical.

HumanFDR <- 0.1
ChimpFDR <- 0.1

#Get chimp eQTLs
Chimp_eQTLs <- eQTLs %>%
  filter(qvalue<ChimpFDR)

# Count chimp eGenes
length(unique(Chimp_eQTLs$gene))
[1] 336
# Count human eGenes
length(GtexHeartEgenes %>% filter(qval< HumanFDR) %>% pull(chimp_id))
[1] 5410
# Count number genes tested in both species (already filtered for 1to1 orthologs)
length(GtexHeartEgenes$gene_id_stable)
[1] 11586

The number of human eGenes is huge (about half of all tested genes) and GTEx over-powered compared to chimp. With huge power, everything is an eGene and the eGene classification becomes devoid of meaningful information. So I will play with different ways to classify human eGenes.

#Change FDR thresholds or take top N eGenes by qvalue
HumanTopN <- 600
HumanFDR <- 0.1
ChimpFDR <- 0.1

# Filter human eGenes by qval threshold
HumanSigGenes <- GtexHeartEgenes %>% filter(qval<HumanFDR) %>% pull(chimp_id)

# Filter human eGenes by topN qval
# HumanSigGenes <- GtexHeartEgenes %>% top_n(-HumanTopN, qval) %>% pull(chimp_id)

# Filter human eGeness by qval threshold then topN betas 
# HumanSigGenes <- GtexHeartEgenes %>% filter(qval<HumanFDR) %>% top_n(1000, abs(slope)) %>% pull(chimp_id)

HumanNonSigGenes <- GtexHeartEgenes %>%
  filter(!chimp_id %in% HumanSigGenes) %>%
  pull(chimp_id)

ChimpSigGenes <- GtexHeartEgenes %>%
  filter(chimp_id %in% Chimp_eQTLs$gene) %>%
  pull(chimp_id)

ChimpNonSigGenes <- GtexHeartEgenes %>%
  filter(! chimp_id %in% Chimp_eQTLs$gene) %>%
  pull(chimp_id)



ContigencyTable <- matrix( c( length(intersect(ChimpSigGenes,HumanSigGenes)),
                              length(intersect(HumanSigGenes,ChimpNonSigGenes)),
                              length(intersect(ChimpSigGenes,HumanNonSigGenes)),
                              length(intersect(ChimpNonSigGenes,HumanNonSigGenes))), 
                           nrow = 2)

rownames(ContigencyTable) <- c("Chimp eGene", "Not Chimp eGene")
colnames(ContigencyTable) <- c("Human eGene", "Not human eGene")

#what is qval threshold for human eGene classification in this contigency table
print(GtexHeartEgenes %>% top_n(-HumanTopN, qval) %>% top_n(1, qval) %>% pull(qval))
[1] 5.83223e-12
#Contigency table of one to one orthologs tested in both chimps and humans of whether significant in humans, or chimps, or both, or neither
ContigencyTable
                Human eGene Not human eGene
Chimp eGene             145             135
Not Chimp eGene        5265            6041
#One-sided Fisher test for greater overlap than expected by chance
fisher.test(ContigencyTable, alternative="greater")

    Fisher's Exact Test for Count Data

data:  ContigencyTable
p-value = 0.04779
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
 1.002643      Inf
sample estimates:
odds ratio 
  1.232354 

The above contingency table and one-sided fisher test indicated a greater-than-chance overlap between the sets of eGenes in chimp and human.

A few plots might give me a better intuition for thinking about the data…

# Plot betas vs qval for GTEx for qval<0.1
GtexHeartEgenes %>%
  filter(qval<0.1) %>%
  ggplot(aes(x=slope, y=-log10(qval))) +
         geom_point(alpha=0.05)

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11
HumanAndChimpEffectSizes <- Chimp_eQTLs %>%
    group_by(gene) %>%
    dplyr::slice(which.min(qvalue)) %>% 
    ungroup() %>%
    left_join((GtexHeartEgenes %>% filter(qval<0.1)), by=c("gene"="chimp_id")) %>%
    dplyr::select(gene, slope, beta)
Warning: Column `gene`/`chimp_id` joining factor and character vector,
coercing into character vector
# For shared eGenes, are scatter plot of absolute value of betas
ggplot(HumanAndChimpEffectSizes, aes(x=log10(abs(slope)), y=log10(abs(beta)))) +
  geom_point() +
  geom_smooth(method = "lm") +
  theme_bw() +
  xlim(c(-1,1)) +
  ylim(c(-1,1)) +
  xlab("Human |beta|") +
  ylab("Chimp |beta|")
Warning: Removed 191 rows containing non-finite values (stat_smooth).
Warning: Removed 191 rows containing missing values (geom_point).

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11
cor.test(HumanAndChimpEffectSizes$slope, HumanAndChimpEffectSizes$beta,method='spearman')

    Spearman's rank correlation rho

data:  HumanAndChimpEffectSizes$slope and HumanAndChimpEffectSizes$beta
S = 476920, p-value = 0.4633
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
0.06132499 

Effect sizes for cross-species eGenes appear uncorrelated. This might at first appear at odds with the greater-than-chance overlap for the same set of eGenes across sepecies. However, one explanation is that the above effect sizes analysis didn’t consider non eGenes for which the null of effect-size=0 could not be rejected.

OK, so now I will perform the same Odds ratio estimate and Fisher exact test for different thresholds/quantiles of the human data ordered by significance.

ChimpFDR <- 0.1
HumanFDR <- 0.1
Chimp_eQTLs <- eQTLs %>%
  filter(qvalue<ChimpFDR)

ChimpSigGenes <- GtexHeartEgenes %>%
  filter(chimp_id %in% Chimp_eQTLs$gene) %>%
  pull(chimp_id)

ChimpNonSigGenes <- GtexHeartEgenes %>%
  filter(! chimp_id %in% Chimp_eQTLs$gene) %>%
  pull(chimp_id)

LengthOut=200
TopHumanEgeneCountList <- round(seq(100,5410, length.out=LengthOut))
OddsRatiosList <- rep(0,LengthOut)
CI.lower <- rep(0,LengthOut)
CI.upper <- rep(0,LengthOut)

for (i in seq_along(TopHumanEgeneCountList)){
  HumanTopN <- TopHumanEgeneCountList[i]


# Filter human eGenes by qval threshold
# HumanSigGenes <- GtexHeartEgenes %>% filter(qval<HumanFDR) %>% pull(chimp_id)

# Filter human eGenes by topN qval
HumanSigGenes <- GtexHeartEgenes %>% top_n(-HumanTopN, qval) %>% pull(chimp_id)

# Filter human eGeness by qval threshold then topN betas 
# HumanSigGenes <- GtexHeartEgenes %>% filter(qval<HumanFDR) %>% top_n(1000, abs(slope)) %>% pull(chimp_id)

HumanNonSigGenes <- GtexHeartEgenes %>%
  filter(!chimp_id %in% HumanSigGenes) %>%
  pull(chimp_id)

ContigencyTable <- matrix( c( length(intersect(ChimpSigGenes,HumanSigGenes)),
                              length(intersect(HumanSigGenes,ChimpNonSigGenes)),
                              length(intersect(ChimpSigGenes,HumanNonSigGenes)),
                              length(intersect(ChimpNonSigGenes,HumanNonSigGenes))), 
                           nrow = 2)

#Contigency table of one to one orthologs tested in both chimps and humans of whether significant in humans, or chimps, or both, or neither
ContigencyTable
A<-fisher.test(ContigencyTable, conf.int=T)
OddsRatiosList[i]<- as.numeric(A$estimate)
CI.lower[i] <- as.numeric(A$conf.int[1])
CI.upper[i] <- as.numeric(A$conf.int[2])
}
HeartOddsRatios <- data.frame(TopHumanEgeneCountList=TopHumanEgeneCountList, OddsRatio=OddsRatiosList, GTEx.Tissue="Heart_LeftVentricle", CI.lower=CI.lower, CI.upper=CI.upper)

ggplot(HeartOddsRatios, aes(x=TopHumanEgeneCountList, y=OddsRatiosList)) +
  geom_point() +
  geom_ribbon(aes(ymin=CI.lower, ymax=CI.upper), alpha=0.2) +
  theme_bw() +
  ylab("Odds Ratio") +
  xlab("Considering only top X human eGenes") +
  geom_hline(yintercept=1, linetype="dashed")

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11

Now do the same for a couple of GTEx tissues

GTEx.eGene.Files <- c("../data/Heart_Left_Ventricle.v7.egenes.txt.gz",
                      "../data/Adipose_Subcutaneous.v7.egenes.txt.gz",
                      # "../data/Cells_EBV-transformed_lymphocytes.v7.egenes.txt.gz",
                      "../data/Thyroid.v7.egenes.txt.gz",
                      "../data/Lung.v7.egenes.txt.gz")

GTEx.tissue.labels <- c("Heart_Left_Ventricle",
                        "Adipose_Subcutaneous",
                        # "LCL",
                        "Thyroid",
                        "Lung")

OddsRatios.rbinded <- data.frame()
                      
for (j in seq_along(GTEx.eGene.Files)){
  paste0("processing")
  GtexEgenes <- read.table(GTEx.eGene.Files[j], header=T, sep='\t', stringsAsFactors = F) %>%
  mutate(gene_id_stable = gsub(".\\d+$","",gene_id)) %>%
  filter(gene_id_stable %in% OneToOneMap$Gene.stable.ID) %>%
  mutate(chimp_id = plyr::mapvalues(gene_id_stable, OneToOneMap$Gene.stable.ID,  OneToOneMap$Chimpanzee.gene.stable.ID, warn_missing = F)) %>%
  filter(chimp_id %in% ChimpTestedGenes)

LengthOut=200
TopHumanEgeneCountList <- round(seq(100,5410, length.out=LengthOut))
OddsRatiosList <- rep(0,LengthOut)
CI.lower <- rep(0,LengthOut)
CI.upper <- rep(0,LengthOut)

for (i in seq_along(TopHumanEgeneCountList)){
  HumanTopN <- TopHumanEgeneCountList[i]


  # Filter human eGenes by qval threshold
  # HumanSigGenes <- GtexHeartEgenes %>% filter(qval<HumanFDR) %>% pull(chimp_id)
  
  # Filter human eGenes by topN qval
  HumanSigGenes <- GtexEgenes %>% top_n(-HumanTopN, qval) %>% pull(chimp_id)
  
  HumanNonSigGenes <- GtexEgenes %>%
    filter(!chimp_id %in% HumanSigGenes) %>%
    pull(chimp_id)
  
  ContigencyTable <- matrix( c( length(intersect(ChimpSigGenes,HumanSigGenes)),
                                length(intersect(HumanSigGenes,ChimpNonSigGenes)),
                                length(intersect(ChimpSigGenes,HumanNonSigGenes)),
                                length(intersect(ChimpNonSigGenes,HumanNonSigGenes))), 
                             nrow = 2)
  
  #Contigency table of one to one orthologs tested in both chimps and humans of whether significant in humans, or chimps, or both, or neither
  A<-fisher.test(ContigencyTable, conf.int=T)
  OddsRatiosList[i]<- as.numeric(A$estimate)
  CI.lower[i] <- as.numeric(A$conf.int[1])
  CI.upper[i] <- as.numeric(A$conf.int[2])
}

OddsRatios <- data.frame(HumanEgeneThreshold=TopHumanEgeneCountList, OR=OddsRatiosList, GTEx.Tissue=GTEx.tissue.labels[j], CI.lower=CI.lower, CI.upper=CI.upper)

OddsRatios.rbinded <- rbind(OddsRatios.rbinded, OddsRatios)
  
}

ggplot(OddsRatios.rbinded, aes(x=HumanEgeneThreshold, y=OR, color=GTEx.Tissue)) +
  geom_line(size=2) +
  geom_ribbon(aes(ymin=CI.lower, ymax=CI.upper, fill = GTEx.Tissue), alpha=0.1,linetype = 3) +
  theme_bw() +
  ylab("Odds Ratio") +
  xlab("Considering only top X human eGenes") +
  geom_hline(yintercept=1, linetype="dashed") +
  ylim(c(0,4)) +
  theme(legend.position="top")

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11

Try one alternative way to present these odds ratios as a function of eGene stringency:

# Get qval ordered ordered list of Chimp genes (that were tested in both)
Chimp_OrderedGenes <- eQTLs %>%
    group_by(gene) %>% 
    dplyr::slice(which.min(qvalue)) %>%
    filter(gene %in% GtexHeartEgenes$chimp_id) %>%
    arrange(qvalue) %>%
    as.data.frame()

# Get qval ordered list of human genes 
Human_OrderedGenes <- GtexHeartEgenes %>%
  arrange(qval)


LengthOut=60

ChimpEgeneCount <- Chimp_OrderedGenes %>% filter(qvalue<0.2) %>% pull(qvalue) %>% length()
HumanEgeneCount <- Human_OrderedGenes %>% filter(qval<0.2) %>% pull(qval) %>% length()
TopHumanEgeneCountList <- round(seq(1,HumanEgeneCount, by=50))[-1]
TopChimpEgeneCountList <- round(seq(1,ChimpEgeneCount, by=25))[-1]

OddsRatioMatrix <- matrix(nrow = length(TopHumanEgeneCountList), ncol = length(TopChimpEgeneCountList))

for (i in seq_along(TopHumanEgeneCountList)){
  HumanTopN <- TopHumanEgeneCountList[i]

# Filter human eGenes by topN qval
HumanSigGenes <- Human_OrderedGenes %>% top_n(-HumanTopN, qval) %>% pull(chimp_id)

HumanNonSigGenes <- Human_OrderedGenes %>%
  filter(!chimp_id %in% HumanSigGenes) %>%
  pull(chimp_id)

for (j in seq_along(TopChimpEgeneCountList)){
  TopChimpN <- TopChimpEgeneCountList[j]
  
  ChimpSigGenes <- Chimp_OrderedGenes %>% top_n(-TopChimpN, qvalue) %>% pull(gene)
  ChimpNonSigGenes <- GtexHeartEgenes %>%
    filter(!chimp_id %in% ChimpSigGenes) %>%
    pull(chimp_id)
  
  ContigencyTable <- matrix( c( length(intersect(ChimpSigGenes,HumanSigGenes)),
                              length(intersect(HumanSigGenes,ChimpNonSigGenes)),
                              length(intersect(ChimpSigGenes,HumanNonSigGenes)),
                              length(intersect(ChimpNonSigGenes,HumanNonSigGenes))), 
                           nrow = 2)
  A<-fisher.test(ContigencyTable, conf.int=F)
  OddsRatioMatrix[i,j] <- (as.numeric(A$estimate))
}
}

row.names(OddsRatioMatrix) <- TopHumanEgeneCountList
colnames(OddsRatioMatrix) <- TopChimpEgeneCountList

melt(OddsRatioMatrix) %>%
  dplyr::rename(OddsRatio=value) %>%
ggplot(aes(x=as.numeric(Var1),y=as.numeric(Var2), fill=OddsRatio)) +
  geom_raster(interpolate=F) +
  xlab("Top N human eGenes") +
  ylab("Top N chimp eGenes") +
  scale_y_continuous(expand = c(0,0)) +
  scale_x_continuous(expand = c(0,0)) +
  scale_fill_distiller(palette = "Spectral") +
  # coord_fixed(ratio = 1, xlim = NULL, ylim = NULL, expand = F, clip = "on") +
  
  geom_vline(xintercept=7555, colour="grey") +
  geom_text(aes(x=7555, label="FDR=0.2", y=400), angle=90, vjust = 0, color="grey", size=4)+
  geom_vline(xintercept=5410, colour="grey") +
  geom_text(aes(x=5410, label="FDR=0.1", y=400), angle=90, vjust = 0, color="grey", size=4)+
  geom_vline(xintercept=4240, colour="grey") +
  geom_text(aes(x=4240, label="FDR=0.05", y=400), angle=90, vjust = 0, color="grey", size=4)+
  
    geom_hline(yintercept=731, colour="grey") +
  geom_text(aes(x=2000, label="FDR=0.2", y=731-50), vjust = 0, color="grey", size=4)+
  geom_hline(yintercept=280, colour="grey") +
  geom_text(aes(x=2000, label="FDR=0.1", y=280-50), vjust = 0, color="grey", size=4)+
  geom_hline(yintercept=98, colour="grey") +
  geom_text(aes(x=2000, label="FDR=0.05", y=98-50), vjust = 0, color="grey", size=4)+
  theme_bw() +
  theme(legend.position="bottom")

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11

Gene ontology overlap analysis of genes that are Chimp eGenes but not human eGenes. The interpretation is that this is a somewhat prioritized list of candidate genes under stabilizing selection in the human lineage.

#Change FDR thresholds or take top N eGenes by qvalue
HumanFDR <- 0.1
ChimpFDR <- 0.1
HumanTopN <- 600

Chimp_eQTLs <- eQTLs %>%
  filter(qvalue<ChimpFDR)

# Filter human eGenes by qval threshold
HumanSigGenes <- GtexHeartEgenes %>% filter(qval<HumanFDR) %>% pull(chimp_id)
# HumanSigGenes <- GtexHeartEgenes %>% top_n(-HumanTopN, qval) %>% pull(chimp_id)


HumanNonSigGenes <- GtexHeartEgenes %>%
  filter(!chimp_id %in% HumanSigGenes) %>%
  pull(chimp_id)

ChimpSigGenes <- GtexHeartEgenes %>%
  filter(chimp_id %in% Chimp_eQTLs$gene) %>%
  pull(chimp_id)

ChimpNonSigGenes <- GtexHeartEgenes %>%
  filter(! chimp_id %in% Chimp_eQTLs$gene) %>%
  pull(chimp_id)



ContigencyTable <- matrix( c( length(intersect(ChimpSigGenes,HumanSigGenes)),
                              length(intersect(HumanSigGenes,ChimpNonSigGenes)),
                              length(intersect(ChimpSigGenes,HumanNonSigGenes)),
                              length(intersect(ChimpNonSigGenes,HumanNonSigGenes))), 
                           nrow = 2)

rownames(ContigencyTable) <- c("Chimp eGene", "Not Chimp eGene")
colnames(ContigencyTable) <- c("Human eGene", "Not human eGene")


#Contigency table of one to one orthologs tested in both chimps and humans of whether significant in humans, or chimps, or both, or neither
ContigencyTable
                Human eGene Not human eGene
Chimp eGene             145             135
Not Chimp eGene        5265            6041

Now that we have a contingency table of eGenes between chimp and human, lets do gene set enrichment analysis. This analysis uses clusterProfiler package to look for gene set enrichment in a foreground set of genes over a background set. For each foreground/background comparison, there will be a gene ontology enrichment for the GO subcategories of - biological process (bp) - cellular component (cc) - molecular function (mf)

Perhaps first most intuitive comparison to make is:

Foreground = Chimp eGene & not human eGene

background = All genes tested in both species

foreground = ChimpToHuman.ID(intersect(ChimpSigGenes,HumanNonSigGenes))
background = ChimpToHuman.ID(GtexHeartEgenes$chimp_id)
length(foreground)
[1] 135
length(background)
[1] 11586
ego.mf <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "MF", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.mf)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
ego.bp <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "BP", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.bp)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
ego.cc <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "CC", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.cc)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count

Nothing enriched by this comparison of gene sets. Perhaps a more appropriate foreground/background set is:

foreground = chimp specific eGenes

background = all chimp eGenes

foreground = ChimpToHuman.ID(intersect(ChimpSigGenes,HumanNonSigGenes))
background = ChimpToHuman.ID(ChimpSigGenes)
length(foreground)
[1] 135
length(background)
[1] 280
ego.mf <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "MF", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.mf)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
GO:0003676 GO:0003676 nucleic acid binding 40/127 54/256 3.91e-05 0.0026993 0.0025943 ENSG00000159208/ENSG00000158796/ENSG00000153187/ENSG00000184898/ENSG00000163602/ENSG00000114127/ENSG00000072274/ENSG00000114503/ENSG00000151623/ENSG00000164342/ENSG00000124279/ENSG00000113643/ENSG00000037241/ENSG00000106261/ENSG00000165061/ENSG00000185122/ENSG00000196150/ENSG00000147854/ENSG00000107371/ENSG00000125484/ENSG00000150593/ENSG00000211450/ENSG00000170325/ENSG00000134283/ENSG00000075856/ENSG00000139718/ENSG00000061936/ENSG00000173575/ENSG00000178952/ENSG00000102974/ENSG00000102984/ENSG00000167513/ENSG00000125457/ENSG00000185504/ENSG00000141646/ENSG00000181007/ENSG00000128000/ENSG00000090971/ENSG00000204519/ENSG00000152454 40
ego.bp <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "BP", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.bp)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
GO:0051252 GO:0051252 regulation of RNA metabolic process 39/122 50/255 1.4e-06 0.0005097 0.0003559 ENSG00000159208/ENSG00000159388/ENSG00000153187/ENSG00000123609/ENSG00000163602/ENSG00000114127/ENSG00000114503/ENSG00000157404/ENSG00000118785/ENSG00000168743/ENSG00000151623/ENSG00000151718/ENSG00000164342/ENSG00000124279/ENSG00000152409/ENSG00000078401/ENSG00000106261/ENSG00000161057/ENSG00000164758/ENSG00000185122/ENSG00000196150/ENSG00000107371/ENSG00000171862/ENSG00000150593/ENSG00000170325/ENSG00000134283/ENSG00000094916/ENSG00000075856/ENSG00000061936/ENSG00000173575/ENSG00000102974/ENSG00000102984/ENSG00000167513/ENSG00000141646/ENSG00000181007/ENSG00000128000/ENSG00000090971/ENSG00000204519/ENSG00000152454 39
GO:0019219 GO:0019219 regulation of nucleobase-containing compound metabolic process 41/122 54/255 2.5e-06 0.0005097 0.0003559 ENSG00000159208/ENSG00000159388/ENSG00000153187/ENSG00000123609/ENSG00000163602/ENSG00000114127/ENSG00000072274/ENSG00000114503/ENSG00000157404/ENSG00000118785/ENSG00000168743/ENSG00000151623/ENSG00000151718/ENSG00000164342/ENSG00000124279/ENSG00000152409/ENSG00000078401/ENSG00000106261/ENSG00000161057/ENSG00000164758/ENSG00000185122/ENSG00000196150/ENSG00000107371/ENSG00000170312/ENSG00000171862/ENSG00000150593/ENSG00000170325/ENSG00000134283/ENSG00000094916/ENSG00000075856/ENSG00000061936/ENSG00000173575/ENSG00000102974/ENSG00000102984/ENSG00000167513/ENSG00000141646/ENSG00000181007/ENSG00000128000/ENSG00000090971/ENSG00000204519/ENSG00000152454 41
GO:0051171 GO:0051171 regulation of nitrogen compound metabolic process 57/122 83/255 3.0e-06 0.0005097 0.0003559 ENSG00000121769/ENSG00000159208/ENSG00000159388/ENSG00000153187/ENSG00000172985/ENSG00000163083/ENSG00000123609/ENSG00000163359/ENSG00000163376/ENSG00000163602/ENSG00000114127/ENSG00000072274/ENSG00000114503/ENSG00000163975/ENSG00000157404/ENSG00000118785/ENSG00000168743/ENSG00000151623/ENSG00000151718/ENSG00000164342/ENSG00000124279/ENSG00000152409/ENSG00000055163/ENSG00000078401/ENSG00000106261/ENSG00000161057/ENSG00000164758/ENSG00000185122/ENSG00000196150/ENSG00000107140/ENSG00000107371/ENSG00000170312/ENSG00000171862/ENSG00000138166/ENSG00000150593/ENSG00000154127/ENSG00000170325/ENSG00000134283/ENSG00000094916/ENSG00000075856/ENSG00000061936/ENSG00000133116/ENSG00000173575/ENSG00000150281/ENSG00000102974/ENSG00000102984/ENSG00000167513/ENSG00000109062/ENSG00000125457/ENSG00000141646/ENSG00000181007/ENSG00000128000/ENSG00000090971/ENSG00000204519/ENSG00000152454/ENSG00000100985/ENSG00000099958 57
GO:0010556 GO:0010556 regulation of macromolecule biosynthetic process 41/122 55/255 6.0e-06 0.0006226 0.0004347 ENSG00000159208/ENSG00000159388/ENSG00000153187/ENSG00000163083/ENSG00000123609/ENSG00000163376/ENSG00000163602/ENSG00000114127/ENSG00000114503/ENSG00000157404/ENSG00000118785/ENSG00000168743/ENSG00000151623/ENSG00000151718/ENSG00000164342/ENSG00000124279/ENSG00000152409/ENSG00000164219/ENSG00000078401/ENSG00000106261/ENSG00000161057/ENSG00000164758/ENSG00000185122/ENSG00000196150/ENSG00000170312/ENSG00000171862/ENSG00000150593/ENSG00000170325/ENSG00000134283/ENSG00000094916/ENSG00000173575/ENSG00000102974/ENSG00000102984/ENSG00000167513/ENSG00000125457/ENSG00000141646/ENSG00000181007/ENSG00000128000/ENSG00000090971/ENSG00000204519/ENSG00000152454 41
GO:0009889 GO:0009889 regulation of biosynthetic process 42/122 57/255 7.4e-06 0.0006226 0.0004347 ENSG00000121769/ENSG00000159208/ENSG00000159388/ENSG00000153187/ENSG00000163083/ENSG00000123609/ENSG00000163376/ENSG00000163602/ENSG00000114127/ENSG00000114503/ENSG00000157404/ENSG00000118785/ENSG00000168743/ENSG00000151623/ENSG00000151718/ENSG00000164342/ENSG00000124279/ENSG00000152409/ENSG00000164219/ENSG00000078401/ENSG00000106261/ENSG00000161057/ENSG00000164758/ENSG00000185122/ENSG00000196150/ENSG00000170312/ENSG00000171862/ENSG00000150593/ENSG00000170325/ENSG00000134283/ENSG00000094916/ENSG00000173575/ENSG00000102974/ENSG00000102984/ENSG00000167513/ENSG00000125457/ENSG00000141646/ENSG00000181007/ENSG00000128000/ENSG00000090971/ENSG00000204519/ENSG00000152454 42
GO:0010468 GO:0010468 regulation of gene expression 42/122 57/255 7.4e-06 0.0006226 0.0004347 ENSG00000159208/ENSG00000159388/ENSG00000153187/ENSG00000163376/ENSG00000163602/ENSG00000114127/ENSG00000114503/ENSG00000163975/ENSG00000157404/ENSG00000118785/ENSG00000168743/ENSG00000151623/ENSG00000151718/ENSG00000164342/ENSG00000124279/ENSG00000152409/ENSG00000078401/ENSG00000106261/ENSG00000161057/ENSG00000164758/ENSG00000185122/ENSG00000196150/ENSG00000107371/ENSG00000170312/ENSG00000171862/ENSG00000150593/ENSG00000170325/ENSG00000134283/ENSG00000094916/ENSG00000075856/ENSG00000061936/ENSG00000173575/ENSG00000102974/ENSG00000102984/ENSG00000167513/ENSG00000125457/ENSG00000141646/ENSG00000181007/ENSG00000128000/ENSG00000090971/ENSG00000204519/ENSG00000152454 42
ego.cc <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "CC", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.cc)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
dotplot(ego.mf, font.size=8)

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11
dotplot(ego.bp, font.size=8)

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11
dotplot(ego.cc, font.size=8)

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11

Compare those that are shared species eGenes, with the interpretation that they would be enriched for things not under stabilizing selection in either, perhaps things like relatively useless pseudogenes.

foreground = shared eGenes

background = all genes tested in both species

foreground = ChimpToHuman.ID(intersect(ChimpSigGenes,HumanSigGenes))
background = ChimpToHuman.ID(GtexHeartEgenes$chimp_id)
length(foreground)
[1] 145
length(background)
[1] 11586
# foreground = ChimpToHuman.ID(intersect(ChimpSigGenes,(GtexHeartEgenes %>% top_n(-600, qval) %>% pull(chimp_id))))
# Could also use the more stringent intersection of chimp eGenes and top600 human eGenes. You get mostly the sae GO terms, including MHC complex

ego.mf <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "MF", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.mf)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
GO:0042605 GO:0042605 peptide antigen binding 7/129 19/10605 0.00e+00 0.0000004 0.0000004 ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389 7
GO:0003823 GO:0003823 antigen binding 8/129 37/10605 0.00e+00 0.0000016 0.0000016 ENSG00000158473/ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389 8
GO:0042277 GO:0042277 peptide binding 11/129 172/10605 7.50e-06 0.0007191 0.0007172 ENSG00000134184/ENSG00000158473/ENSG00000169760/ENSG00000163697/ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389 11
GO:0033218 GO:0033218 amide binding 11/129 221/10605 7.74e-05 0.0055310 0.0055167 ENSG00000134184/ENSG00000158473/ENSG00000169760/ENSG00000163697/ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389 11
ego.bp <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "BP", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.bp)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
GO:0019884 GO:0019884 antigen processing and presentation of exogenous antigen 9/133 96/10512 3.2e-06 0.0065215 0.0064726 ENSG00000158473/ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389/ENSG00000161800 9
ego.cc <- enrichGO(gene = foreground,
                 universe = background,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 ont = "CC", 
                 pAdjustMethod = "BH", 
                 pvalueCutoff  = 0.01,
                 qvalueCutoff  = 0.05)
kable(head(as.data.frame(ego.cc)))
ID Description GeneRatio BgRatio pvalue p.adjust qvalue geneID Count
GO:0071556 GO:0071556 integral component of lumenal side of endoplasmic reticulum membrane 8/136 21/10999 0.0e+00 0.00e+00 0.00e+00 ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389/ENSG00000005206 8
GO:0098553 GO:0098553 lumenal side of endoplasmic reticulum membrane 8/136 21/10999 0.0e+00 0.00e+00 0.00e+00 ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389/ENSG00000005206 8
GO:0042611 GO:0042611 MHC protein complex 7/136 18/10999 0.0e+00 1.00e-07 1.00e-07 ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389 7
GO:0042613 GO:0042613 MHC class II protein complex 5/136 12/10999 2.0e-07 1.31e-05 1.17e-05 ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389 5
GO:0030660 GO:0030660 Golgi-associated vesicle membrane 9/136 84/10999 9.0e-07 4.61e-05 4.10e-05 ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389/ENSG00000005206/ENSG00000242247 9
GO:0012507 GO:0012507 ER to Golgi transport vesicle membrane 7/136 47/10999 1.6e-06 6.96e-05 6.19e-05 ENSG00000206503/ENSG00000234745/ENSG00000198502/ENSG00000196126/ENSG00000196735/ENSG00000237541/ENSG00000231389 7
dotplot(ego.mf, font.size=8)

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11
dotplot(ego.bp, font.size=8)

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11
dotplot(ego.cc, font.size=8)

Version Author Date
7ef6fe2 Benjmain Fair 2019-06-11

Interestingly, the MHC complex comes out of this analysis as enriched among the genes that are eGenes in both species, consistent with these genes being rapidly evolving targets of selection in between human/chimp, with high diversity in both species.

A complementart analysis to GO overlap is gene set enrichment analysis. Here I will perform GSEA on the chimp qvalue orded list of chimp/human shared eGenes and chimp specific eGenes based on FDR<0.1 in the human dataset…

Actually, maybe a more sensible thing to do is consider the human qvalue ordered list and then separate based on if chimp eGene or not. This is more similar to what the previous odds-ratio plots are.

HumanOrderedGenes <- GtexHeartEgenes %>%
  arrange(qval) %>%
  filter(chimp_id %in% ChimpSigGenes)
GeneList <- log10(HumanOrderedGenes$qval) * -1
names(GeneList) <- as.character(ChimpToHuman.ID(HumanOrderedGenes$chimp_id))

gsego.cc.shared <- gseGO(gene = GeneList,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 maxGSSize = 500,
                 # pvalueCutoff=0.8,
                 ont = "CC")
kable(head(as.data.frame(gsego.cc.shared)))

dotplot(gsego.cc.shared, font.size=8, showCategory=15)
gseaplot(gsego.cc.shared, geneSetID = "GO:0042611", pvalue_table = TRUE)

That was still a work in progress that I may come back to one day… For now I will perform GSEA on ranked gene lists based on chimp FDR.

First, create chimp-qval-ordered gene list for genes that are human eGenes I expect this to return similar results as gene overlap analysis with forground as shared eGenes and background as all all genes tested. So this should return MHC complex among other things.

Chimp_OrderedGenes <- eQTLs %>%
    group_by(gene) %>% 
    dplyr::slice(which.min(qvalue)) %>%
    filter(gene %in% GtexHeartEgenes$chimp_id) %>%
    arrange(qvalue) %>%
    filter(gene %in% HumanSigGenes)
GeneList <- log10(Chimp_OrderedGenes$qvalue) * -1
names(GeneList) <- as.character(ChimpToHuman.ID(Chimp_OrderedGenes$gene))



gsego.cc.shared <- gseGO(gene = GeneList,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 maxGSSize = 500,
                 # pvalueCutoff=0.8,
                 ont = "CC",
                 nPerm = 10000)
preparing geneSet collections...
GSEA analysis...
Warning in fgsea(pathways = geneSets, stats = geneList, nperm = nPerm, minSize = minGSSize, : There are ties in the preranked stats (38.71% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
leading edge analysis...
done...
kable(head(as.data.frame(gsego.cc.shared)))
ID Description setSize enrichmentScore NES pvalue p.adjust qvalues rank leading_edge core_enrichment
GO:0012507 GO:0012507 ER to Golgi transport vesicle membrane 28 0.7104864 1.940217 0.0001007 0.0101562 0.0096857 436 tags=39%, list=8%, signal=36% ENSG00000196735/ENSG00000196126/ENSG00000206503/ENSG00000198502/ENSG00000237541/ENSG00000234745/ENSG00000231389/ENSG00000204525/ENSG00000148396/ENSG00000179344/ENSG00000223865
GO:0071556 GO:0071556 integral component of lumenal side of endoplasmic reticulum membrane 16 0.8600123 2.186654 0.0001034 0.0101562 0.0096857 436 tags=69%, list=8%, signal=63% ENSG00000196735/ENSG00000196126/ENSG00000206503/ENSG00000198502/ENSG00000237541/ENSG00000005206/ENSG00000234745/ENSG00000231389/ENSG00000204525/ENSG00000179344/ENSG00000223865
GO:0098553 GO:0098553 lumenal side of endoplasmic reticulum membrane 16 0.8600123 2.186654 0.0001034 0.0101562 0.0096857 436 tags=69%, list=8%, signal=63% ENSG00000196735/ENSG00000196126/ENSG00000206503/ENSG00000198502/ENSG00000237541/ENSG00000005206/ENSG00000234745/ENSG00000231389/ENSG00000204525/ENSG00000179344/ENSG00000223865
GO:0042611 GO:0042611 MHC protein complex 14 0.8498340 2.108766 0.0001048 0.0101562 0.0096857 436 tags=71%, list=8%, signal=66% ENSG00000196735/ENSG00000196126/ENSG00000206503/ENSG00000198502/ENSG00000237541/ENSG00000234745/ENSG00000231389/ENSG00000204525/ENSG00000179344/ENSG00000223865
GO:0042613 GO:0042613 MHC class II protein complex 10 0.8404787 1.960527 0.0001085 0.0101562 0.0096857 436 tags=70%, list=8%, signal=64% ENSG00000196735/ENSG00000196126/ENSG00000198502/ENSG00000237541/ENSG00000231389/ENSG00000179344/ENSG00000223865
GO:0030669 GO:0030669 clathrin-coated endocytic vesicle membrane 19 0.7044431 1.834206 0.0002043 0.0159346 0.0151963 567 tags=47%, list=11%, signal=42% ENSG00000196735/ENSG00000196126/ENSG00000198502/ENSG00000237541/ENSG00000231389/ENSG00000179344/ENSG00000223865/ENSG00000174804/ENSG00000006125
dotplot(gsego.cc.shared, font.size=8, showCategory=15)

Version Author Date
22eda3a Benjmain Fair 2019-06-12
7ef6fe2 Benjmain Fair 2019-06-11
gseaplot2(gsego.cc.shared, geneSetID = c("GO:0042611", "GO:0042613", "GO:0032588"), title="Shared eGenes ordered by chimp -log(qvalue)", pvalue_table = TRUE)

Version Author Date
22eda3a Benjmain Fair 2019-06-12
7ef6fe2 Benjmain Fair 2019-06-11

Ok that does return MHC as expect. Now I will create chimp-qval-ordered gene list for genes that are not human eGenes. I expect this to not return MHC. Instead,I expect this to return similar results as gene overlap analysis with forground as chimp-specific eGenes and background as all chimp-eGenes (nucleic acid binding, etc).

Chimp_OrderedGenes <- eQTLs %>%
    group_by(gene) %>% 
    dplyr::slice(which.min(qvalue)) %>%
    filter(gene %in% GtexHeartEgenes$chimp_id) %>%
    filter(qvalue<0.2) %>%
    arrange(qvalue) %>%
    filter(!gene %in% HumanSigGenes)
GeneList <- log10(Chimp_OrderedGenes$qvalue) * -1
names(GeneList) <- as.character(ChimpToHuman.ID(Chimp_OrderedGenes$gene))

gsego.cc.chimpspecific <- gseGO(gene = GeneList,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 maxGSSize = 500,
                 pvalueCutoff=0.8,
                 ont = "BP")
preparing geneSet collections...
GSEA analysis...
Warning in fgsea(pathways = geneSets, stats = geneList, nperm = nPerm, minSize = minGSSize, : There are ties in the preranked stats (28.95% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
no term enriched under specific pvalueCutoff...
kable(head(as.data.frame(gsego.cc.chimpspecific)))
ID Description setSize enrichmentScore NES pvalue p.adjust qvalues

Ok that returned nothing, even at more relaxed pvalue thresholds (not shown) I can see the top terms do not have anything to do with nucleic acid binding like the previous gene overlap enrichment analysis results that compared chimp-specific-eGene (foreground) to all chimp eGenes (universe background).

By partitioning the GSEA analyses into “human eGene” ranked gene list and “not human eGene” ranked gene list, what I was really trying to get at is the semi-quantitative difference in eGene character. Essentially these are paired analyses, though GSEA does not have any natural way to run a paired analysis on two gene sets. Perhaps a better way to do this is to make a single gene list based on the difference in eGene ranks between the two species. Since GSEA is based on non-parametric rank orders, I think this is still somewhat reasonable to do. For example, if qvalues are ranked lowest to highest in both species (rank=1 being most significant), and I subtract the chimp ranking from the human ranking, I am left with the more chimp specific eGenes with a higher number. I will implement this idea below:

Chimp_OrderedGenes <- eQTLs %>%
    group_by(gene) %>% 
    dplyr::slice(which.min(qvalue)) %>%
    filter(gene %in% GtexHeartEgenes$chimp_id) %>%
    left_join(GtexHeartEgenes, by=c("gene"="chimp_id")) %>%
    dplyr::select(gene, qvalue, qval) %>% as.data.frame() %>%
    mutate(ChimpRank = dense_rank(qvalue)) %>%
    mutate(HumanRank = dense_rank(qval)) %>%
    mutate(RankDifference = HumanRank-ChimpRank) %>%
    arrange(desc(RankDifference))
Warning: Column `gene`/`chimp_id` joining factor and character vector,
coercing into character vector
GeneList <- Chimp_OrderedGenes$RankDifference
names(GeneList) <- as.character(ChimpToHuman.ID(Chimp_OrderedGenes$gene))
    
gsego.cc.chimpspecific <- gseGO(gene = GeneList,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 maxGSSize = 500,
                 pvalueCutoff=0.8,
                 ont = "BP")
preparing geneSet collections...
GSEA analysis...
Warning in fgsea(pathways = geneSets, stats = geneList, nperm = nPerm, minSize = minGSSize, : There are ties in the preranked stats (35.5% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
leading edge analysis...
done...
kable(head(as.data.frame(gsego.cc.chimpspecific)))
ID Description setSize enrichmentScore NES pvalue p.adjust qvalues rank leading_edge core_enrichment
GO:0000904 GO:0000904 cell morphogenesis involved in differentiation 473 0.3623578 1.318620 0.000999 0.0629941 0.0555252 4533 tags=50%, list=41%, signal=31% ENSG00000171862/ENSG00000179242/ENSG00000073712/ENSG00000163359/ENSG00000179820/ENSG00000176749/ENSG00000105186/ENSG00000163110/ENSG00000173482/ENSG00000167461/ENSG00000100345/ENSG00000118046/ENSG00000125650/ENSG00000197702/ENSG00000082684/ENSG00000133110/ENSG00000143590/ENSG00000167193/ENSG00000117600/ENSG00000011009/ENSG00000173166/ENSG00000149930/ENSG00000147862/ENSG00000163975/ENSG00000132561/ENSG00000181790/ENSG00000169554/ENSG00000046889/ENSG00000115904/ENSG00000174989/ENSG00000087470/ENSG00000117400/ENSG00000197283/ENSG00000115232/ENSG00000119508/ENSG00000159674/ENSG00000137845/ENSG00000165802/ENSG00000168036/ENSG00000117707/ENSG00000196923/ENSG00000166313/ENSG00000142168/ENSG00000153707/ENSG00000068305/ENSG00000163785/ENSG00000174238/ENSG00000169379/ENSG00000118785/ENSG00000124171/ENSG00000114745/ENSG00000076356/ENSG00000160460/ENSG00000144857/ENSG00000104133/ENSG00000084733/ENSG00000170558/ENSG00000141646/ENSG00000144619/ENSG00000100320/ENSG00000160691/ENSG00000141522/ENSG00000084112/ENSG00000138660/ENSG00000160469/ENSG00000165819/ENSG00000130558/ENSG00000179915/ENSG00000112658/ENSG00000105649/ENSG00000138411/ENSG00000067141/ENSG00000117228/ENSG00000173786/ENSG00000137817/ENSG00000092964/ENSG00000120156/ENSG00000101126/ENSG00000051382/ENSG00000163531/ENSG00000205221/ENSG00000169862/ENSG00000132003/ENSG00000170017/ENSG00000132640/ENSG00000176248/ENSG00000146013/ENSG00000109062/ENSG00000197892/ENSG00000106278/ENSG00000106078/ENSG00000119608/ENSG00000177885/ENSG00000154096/ENSG00000113749/ENSG00000184347/ENSG00000124126/ENSG00000099250/ENSG00000140538/ENSG00000122877/ENSG00000198836/ENSG00000079215/ENSG00000077942/ENSG00000091129/ENSG00000132670/ENSG00000055163/ENSG00000162738/ENSG00000036257/ENSG00000179051/ENSG00000148948/ENSG00000169439/ENSG00000197555/ENSG00000100968/ENSG00000107404/ENSG00000010017/ENSG00000136040/ENSG00000173898/ENSG00000171055/ENSG00000149269/ENSG00000160007/ENSG00000111913/ENSG00000164488/ENSG00000136854/ENSG00000152767/ENSG00000071127/ENSG00000188026/ENSG00000021574/ENSG00000142599/ENSG00000007168/ENSG00000117632/ENSG00000169604/ENSG00000105711/ENSG00000169855/ENSG00000138069/ENSG00000150760/ENSG00000107758/ENSG00000127603/ENSG00000171517/ENSG00000167601/ENSG00000111859/ENSG00000145675/ENSG00000159167/ENSG00000064300/ENSG00000124782/ENSG00000109458/ENSG00000133026/ENSG00000106571/ENSG00000156642/ENSG00000169504/ENSG00000137872/ENSG00000092820/ENSG00000148498/ENSG00000153234/ENSG00000130203/ENSG00000081052/ENSG00000105245/ENSG00000081189/ENSG00000100503/ENSG00000214655/ENSG00000257923/ENSG00000138347/ENSG00000169032/ENSG00000079805/ENSG00000092929/ENSG00000166579/ENSG00000173706/ENSG00000067900/ENSG00000008324/ENSG00000077943/ENSG00000149557/ENSG00000111962/ENSG00000188906/ENSG00000179403/ENSG00000114270/ENSG00000147459/ENSG00000128656/ENSG00000125266/ENSG00000149781/ENSG00000135387/ENSG00000151892/ENSG00000136603/ENSG00000197694/ENSG00000139626/ENSG00000251322/ENSG00000169760/ENSG00000179218/ENSG00000182578/ENSG00000115738/ENSG00000108561/ENSG00000137825/ENSG00000198513/ENSG00000118257/ENSG00000100030/ENSG00000116106/ENSG00000166333/ENSG00000198492/ENSG00000182197/ENSG00000121879/ENSG00000080371/ENSG00000164050/ENSG00000108830/ENSG00000206052/ENSG00000185950/ENSG00000133104/ENSG00000101144/ENSG00000154133/ENSG00000114251/ENSG00000087250/ENSG00000074527/ENSG00000130449/ENSG00000077097/ENSG00000112715/ENSG00000243364/ENSG00000171608/ENSG00000139926/ENSG00000156299/ENSG00000116035/ENSG00000221866/ENSG00000107731/ENSG00000119328/ENSG00000164736/ENSG00000166963/ENSG00000154310/ENSG00000187688/ENSG00000161642/ENSG00000100393/ENSG00000033327/ENSG00000182580/ENSG00000149418/ENSG00000105976/ENSG00000177169/ENSG00000125875/ENSG00000115694/ENSG00000184144/ENSG00000125249/ENSG00000158321/ENSG00000150977
GO:0001501 GO:0001501 skeletal system development 311 0.3801804 1.363580 0.000999 0.0629941 0.0555252 3391 tags=41%, list=31%, signal=29% ENSG00000100985/ENSG00000163359/ENSG00000109906/ENSG00000147316/ENSG00000139329/ENSG00000143570/ENSG00000078401/ENSG00000157404/ENSG00000019549/ENSG00000182718/ENSG00000178573/ENSG00000141873/ENSG00000151388/ENSG00000125878/ENSG00000133110/ENSG00000173868/ENSG00000116183/ENSG00000143995/ENSG00000092969/ENSG00000147862/ENSG00000107372/ENSG00000151702/ENSG00000132561/ENSG00000124216/ENSG00000139567/ENSG00000172845/ENSG00000120254/ENSG00000163513/ENSG00000120149/ENSG00000168036/ENSG00000116539/ENSG00000165458/ENSG00000204262/ENSG00000101265/ENSG00000081237/ENSG00000173153/ENSG00000163785/ENSG00000131759/ENSG00000170577/ENSG00000168542/ENSG00000134013/ENSG00000145423/ENSG00000172071/ENSG00000104313/ENSG00000168646/ENSG00000077092/ENSG00000119699/ENSG00000164692/ENSG00000135111/ENSG00000141543/ENSG00000196159/ENSG00000184916/ENSG00000105664/ENSG00000108557/ENSG00000142453/ENSG00000104447/ENSG00000112658/ENSG00000164190/ENSG00000134250/ENSG00000128606/ENSG00000054598/ENSG00000075711/ENSG00000141627/ENSG00000120156/ENSG00000205221/ENSG00000155090/ENSG00000070814/ENSG00000121039/ENSG00000183688/ENSG00000107679/ENSG00000180228/ENSG00000174600/ENSG00000166949/ENSG00000185630/ENSG00000078246/ENSG00000177119/ENSG00000153162/ENSG00000126351/ENSG00000165804/ENSG00000109685/ENSG00000106483/ENSG00000179111/ENSG00000125845/ENSG00000164107/ENSG00000176842/ENSG00000172809/ENSG00000012223/ENSG00000158859/ENSG00000127418/ENSG00000007168/ENSG00000142871/ENSG00000141753/ENSG00000178882/ENSG00000110693/ENSG00000145431/ENSG00000138685/ENSG00000166224/ENSG00000089041/ENSG00000090539/ENSG00000159167/ENSG00000145545/ENSG00000106571/ENSG00000143867/ENSG00000167522/ENSG00000148516/ENSG00000072840/ENSG00000081189/ENSG00000020633/ENSG00000134853/ENSG00000163659/ENSG00000082293/ENSG00000163132/ENSG00000170776/ENSG00000166341/ENSG00000134253/ENSG00000011143/ENSG00000188783/ENSG00000100644/ENSG00000118523/ENSG00000088256/ENSG00000112293/ENSG00000134245/ENSG00000102977/ENSG00000186480/ENSG00000179403/ENSG00000154122/ENSG00000114270/ENSG00000197467
GO:0001525 GO:0001525 angiogenesis 351 0.3623115 1.306815 0.000999 0.0629941 0.0555252 4224 tags=50%, list=38%, signal=32% ENSG00000171862/ENSG00000105974/ENSG00000164619/ENSG00000173482/ENSG00000100345/ENSG00000078401/ENSG00000182718/ENSG00000163638/ENSG00000069667/ENSG00000141376/ENSG00000105851/ENSG00000197702/ENSG00000164134/ENSG00000143995/ENSG00000143590/ENSG00000134871/ENSG00000092969/ENSG00000134954/ENSG00000154188/ENSG00000181790/ENSG00000139567/ENSG00000153904/ENSG00000137801/ENSG00000176170/ENSG00000163513/ENSG00000129173/ENSG00000233276/ENSG00000168036/ENSG00000173801/ENSG00000076706/ENSG00000138798/ENSG00000177464/ENSG00000176692/ENSG00000136848/ENSG00000106366/ENSG00000164342/ENSG00000134013/ENSG00000145423/ENSG00000123358/ENSG00000070495/ENSG00000172071/ENSG00000125730/ENSG00000141448/ENSG00000136158/ENSG00000048052/ENSG00000160691/ENSG00000205336/ENSG00000117461/ENSG00000112658/ENSG00000054598/ENSG00000140992/ENSG00000120156/ENSG00000051382/ENSG00000140199/ENSG00000074181/ENSG00000166292/ENSG00000174059/ENSG00000107014/ENSG00000065970/ENSG00000138080/ENSG00000163874/ENSG00000154096/ENSG00000099250/ENSG00000162434/ENSG00000105538/ENSG00000150782/ENSG00000130770/ENSG00000171951/ENSG00000091129/ENSG00000100219/ENSG00000214274/ENSG00000171812/ENSG00000138772/ENSG00000133639/ENSG00000100968/ENSG00000136960/ENSG00000173083/ENSG00000132170/ENSG00000170989/ENSG00000164107/ENSG00000239697/ENSG00000179348/ENSG00000142871/ENSG00000136826/ENSG00000169245/ENSG00000138685/ENSG00000160293/ENSG00000108691/ENSG00000168329/ENSG00000164283/ENSG00000126458/ENSG00000147649/ENSG00000101384/ENSG00000122679/ENSG00000111145/ENSG00000166086/ENSG00000171236/ENSG00000118503/ENSG00000142208/ENSG00000169855/ENSG00000187498/ENSG00000120063/ENSG00000101230/ENSG00000144476/ENSG00000157613/ENSG00000064300/ENSG00000166501/ENSG00000109458/ENSG00000162775/ENSG00000169429/ENSG00000169504/ENSG00000117020/ENSG00000140464/ENSG00000081052/ENSG00000117525/ENSG00000106511/ENSG00000073756/ENSG00000006638/ENSG00000074842/ENSG00000061273/ENSG00000134853/ENSG00000145632/ENSG00000111961/ENSG00000100644/ENSG00000115415/ENSG00000067900/ENSG00000168214/ENSG00000118523/ENSG00000112293/ENSG00000108840/ENSG00000126785/ENSG00000011405/ENSG00000006210/ENSG00000148926/ENSG00000112562/ENSG00000138061/ENSG00000125266/ENSG00000027869/ENSG00000140105/ENSG00000079385/ENSG00000123342/ENSG00000136720/ENSG00000106804/ENSG00000156427/ENSG00000113196/ENSG00000167772/ENSG00000161714/ENSG00000113721/ENSG00000185359/ENSG00000019991/ENSG00000160255/ENSG00000118257/ENSG00000115053/ENSG00000124212/ENSG00000135250/ENSG00000138639/ENSG00000064989/ENSG00000121879/ENSG00000087245/ENSG00000154133/ENSG00000127837/ENSG00000189058/ENSG00000114251/ENSG00000159399/ENSG00000143878/ENSG00000006831/ENSG00000135636/ENSG00000112715/ENSG00000091879/ENSG00000152270/ENSG00000004776/ENSG00000134318/ENSG00000110955/ENSG00000101109/ENSG00000107731/ENSG00000100292
GO:0001568 GO:0001568 blood vessel development 472 0.3523209 1.281995 0.000999 0.0629941 0.0555252 4224 tags=49%, list=38%, signal=31% ENSG00000171862/ENSG00000105974/ENSG00000148737/ENSG00000164619/ENSG00000173482/ENSG00000100345/ENSG00000078401/ENSG00000182718/ENSG00000163638/ENSG00000069667/ENSG00000141376/ENSG00000105851/ENSG00000197702/ENSG00000164134/ENSG00000143995/ENSG00000143590/ENSG00000134871/ENSG00000092969/ENSG00000134954/ENSG00000154188/ENSG00000181790/ENSG00000115904/ENSG00000174989/ENSG00000139567/ENSG00000153904/ENSG00000137801/ENSG00000176170/ENSG00000163513/ENSG00000129173/ENSG00000233276/ENSG00000168036/ENSG00000173801/ENSG00000076706/ENSG00000138798/ENSG00000117707/ENSG00000177464/ENSG00000176692/ENSG00000136848/ENSG00000106366/ENSG00000168542/ENSG00000169946/ENSG00000164342/ENSG00000134013/ENSG00000145423/ENSG00000123358/ENSG00000070495/ENSG00000172071/ENSG00000125730/ENSG00000104313/ENSG00000164692/ENSG00000141448/ENSG00000170558/ENSG00000136158/ENSG00000135111/ENSG00000133454/ENSG00000048052/ENSG00000086598/ENSG00000160691/ENSG00000205336/ENSG00000117461/ENSG00000112658/ENSG00000069122/ENSG00000054598/ENSG00000120738/ENSG00000140992/ENSG00000120156/ENSG00000116473/ENSG00000051382/ENSG00000185650/ENSG00000140199/ENSG00000074181/ENSG00000166292/ENSG00000174059/ENSG00000107014/ENSG00000065970/ENSG00000138080/ENSG00000163874/ENSG00000154096/ENSG00000099250/ENSG00000162434/ENSG00000105538/ENSG00000150782/ENSG00000198081/ENSG00000130770/ENSG00000107796/ENSG00000171951/ENSG00000091129/ENSG00000049323/ENSG00000100219/ENSG00000214274/ENSG00000171812/ENSG00000087088/ENSG00000138772/ENSG00000133639/ENSG00000100968/ENSG00000136960/ENSG00000105672/ENSG00000173083/ENSG00000132170/ENSG00000170989/ENSG00000164107/ENSG00000239697/ENSG00000179348/ENSG00000142871/ENSG00000136826/ENSG00000145715/ENSG00000169604/ENSG00000169245/ENSG00000138685/ENSG00000160293/ENSG00000166224/ENSG00000108691/ENSG00000113083/ENSG00000168329/ENSG00000164283/ENSG00000126458/ENSG00000147649/ENSG00000101384/ENSG00000122679/ENSG00000166135/ENSG00000111145/ENSG00000166086/ENSG00000171236/ENSG00000117713/ENSG00000118503/ENSG00000142208/ENSG00000137834/ENSG00000169855/ENSG00000187498/ENSG00000120063/ENSG00000101230/ENSG00000144476/ENSG00000157483/ENSG00000157613/ENSG00000064300/ENSG00000065534/ENSG00000166501/ENSG00000109458/ENSG00000162775/ENSG00000128918/ENSG00000133026/ENSG00000197603/ENSG00000169429/ENSG00000106571/ENSG00000169504/ENSG00000143867/ENSG00000117020/ENSG00000130203/ENSG00000140464/ENSG00000081052/ENSG00000107263/ENSG00000117525/ENSG00000081189/ENSG00000106511/ENSG00000073756/ENSG00000006638/ENSG00000074842/ENSG00000061273/ENSG00000134853/ENSG00000163659/ENSG00000145632/ENSG00000169032/ENSG00000079805/ENSG00000173706/ENSG00000111961/ENSG00000100644/ENSG00000115415/ENSG00000067900/ENSG00000168214/ENSG00000118523/ENSG00000112293/ENSG00000108840/ENSG00000126785/ENSG00000011405/ENSG00000006210/ENSG00000148926/ENSG00000112562/ENSG00000138061/ENSG00000125266/ENSG00000027869/ENSG00000163909/ENSG00000184557/ENSG00000140105/ENSG00000079385/ENSG00000183072/ENSG00000112655/ENSG00000123342/ENSG00000136720/ENSG00000106804/ENSG00000063176/ENSG00000156427/ENSG00000113196/ENSG00000167772/ENSG00000074219/ENSG00000161714/ENSG00000113721/ENSG00000185359/ENSG00000019991/ENSG00000160255/ENSG00000118257/ENSG00000115053/ENSG00000100030/ENSG00000124212/ENSG00000135250/ENSG00000138639/ENSG00000064989/ENSG00000121879/ENSG00000129038/ENSG00000087245/ENSG00000005981/ENSG00000114739/ENSG00000101144/ENSG00000154133/ENSG00000127837/ENSG00000189058/ENSG00000114251/ENSG00000159399/ENSG00000143878/ENSG00000006831/ENSG00000135636/ENSG00000118762/ENSG00000112715/ENSG00000091879/ENSG00000152270/ENSG00000107882/ENSG00000004776/ENSG00000134318/ENSG00000110955/ENSG00000101109/ENSG00000107731/ENSG00000100292
GO:0001655 GO:0001655 urogenital system development 224 0.3804207 1.351549 0.000999 0.0629941 0.0555252 4144 tags=49%, list=38%, signal=31% ENSG00000171862/ENSG00000178585/ENSG00000109906/ENSG00000128059/ENSG00000164619/ENSG00000181690/ENSG00000168743/ENSG00000118046/ENSG00000170561/ENSG00000141449/ENSG00000092969/ENSG00000130707/ENSG00000154188/ENSG00000103494/ENSG00000132470/ENSG00000168036/ENSG00000117707/ENSG00000153094/ENSG00000177464/ENSG00000115884/ENSG00000117724/ENSG00000131759/ENSG00000170577/ENSG00000124145/ENSG00000070495/ENSG00000170348/ENSG00000104313/ENSG00000173473/ENSG00000077092/ENSG00000162849/ENSG00000187391/ENSG00000141646/ENSG00000196159/ENSG00000081181/ENSG00000115204/ENSG00000070404/ENSG00000164190/ENSG00000163348/ENSG00000054598/ENSG00000006016/ENSG00000120738/ENSG00000075711/ENSG00000120156/ENSG00000005884/ENSG00000112837/ENSG00000074181/ENSG00000174059/ENSG00000121039/ENSG00000169018/ENSG00000099250/ENSG00000100360/ENSG00000166949/ENSG00000107796/ENSG00000185630/ENSG00000162738/ENSG00000186350/ENSG00000087088/ENSG00000153162/ENSG00000171016/ENSG00000125845/ENSG00000164488/ENSG00000179348/ENSG00000025796/ENSG00000138685/ENSG00000166224/ENSG00000101384/ENSG00000005513/ENSG00000117318/ENSG00000137834/ENSG00000187498/ENSG00000157483/ENSG00000111276/ENSG00000128918/ENSG00000145545/ENSG00000197603/ENSG00000106571/ENSG00000143867/ENSG00000081052/ENSG00000081189/ENSG00000134853/ENSG00000163659/ENSG00000166341/ENSG00000115415/ENSG00000134245/ENSG00000116962/ENSG00000077943/ENSG00000102977/ENSG00000188906/ENSG00000125266/ENSG00000163909/ENSG00000137869/ENSG00000121361/ENSG00000091831/ENSG00000111087/ENSG00000115738/ENSG00000113721/ENSG00000196562/ENSG00000116106/ENSG00000166333/ENSG00000116455/ENSG00000114739/ENSG00000101144/ENSG00000114251/ENSG00000102900/ENSG00000118762/ENSG00000112715/ENSG00000115758/ENSG00000091879/ENSG00000205213
GO:0001701 GO:0001701 in utero embryonic development 232 0.3694125 1.313362 0.000999 0.0629941 0.0555252 3705 tags=45%, list=34%, signal=30% ENSG00000100345/ENSG00000143570/ENSG00000078401/ENSG00000141873/ENSG00000100601/ENSG00000112893/ENSG00000154188/ENSG00000107372/ENSG00000103494/ENSG00000124216/ENSG00000174989/ENSG00000139567/ENSG00000172845/ENSG00000142784/ENSG00000144357/ENSG00000163513/ENSG00000129173/ENSG00000137845/ENSG00000130726/ENSG00000126457/ENSG00000168036/ENSG00000153094/ENSG00000185122/ENSG00000169946/ENSG00000119699/ENSG00000132376/ENSG00000141448/ENSG00000131446/ENSG00000108773/ENSG00000135111/ENSG00000141646/ENSG00000133454/ENSG00000086598/ENSG00000184916/ENSG00000100146/ENSG00000254999/ENSG00000147536/ENSG00000198730/ENSG00000104375/ENSG00000112658/ENSG00000150961/ENSG00000163348/ENSG00000134057/ENSG00000054598/ENSG00000113163/ENSG00000185650/ENSG00000198026/ENSG00000166292/ENSG00000121039/ENSG00000177885/ENSG00000122257/ENSG00000119048/ENSG00000166949/ENSG00000186350/ENSG00000036257/ENSG00000105672/ENSG00000165916/ENSG00000125845/ENSG00000164107/ENSG00000196839/ENSG00000179348/ENSG00000142871/ENSG00000100814/ENSG00000110693/ENSG00000112578/ENSG00000005513/ENSG00000101003/ENSG00000142208/ENSG00000120063/ENSG00000197063/ENSG00000157483/ENSG00000115760/ENSG00000133026/ENSG00000106571/ENSG00000167522/ENSG00000100888/ENSG00000134853/ENSG00000101773/ENSG00000034053/ENSG00000110107/ENSG00000163132/ENSG00000169032/ENSG00000166579/ENSG00000136450/ENSG00000173706/ENSG00000100644/ENSG00000168214/ENSG00000113555/ENSG00000148926/ENSG00000141030/ENSG00000184557/ENSG00000136720/ENSG00000106804/ENSG00000136603/ENSG00000138336/ENSG00000107077/ENSG00000111596/ENSG00000171345/ENSG00000113196/ENSG00000169375/ENSG00000161714/ENSG00000105656/ENSG00000140416/ENSG00000011132
# gseaplot(gsego.cc.chimpspecific, geneSetID = "GO:0001501", pvalue_table = TRUE)
# dotplot(gsego.cc.chimpspecific, font.size=8, showCategory=15)

Nothing is significant by any notable treshold by this method…

Perhaps I need to limit the gene set to genes which were called as eGenes in chimps, since many too many chimp non-eGenes may contribute to noise.

Chimp_OrderedGenes <- eQTLs %>%
    group_by(gene) %>% 
    dplyr::slice(which.min(qvalue)) %>%
    filter(gene %in% GtexHeartEgenes$chimp_id) %>%
    left_join(GtexHeartEgenes, by=c("gene"="chimp_id")) %>%
    dplyr::select(gene, qvalue, qval) %>% as.data.frame() %>%
    mutate(ChimpRank = dense_rank(qvalue)) %>%
    mutate(HumanRank = dense_rank(qval)) %>%
    mutate(RankDifference = HumanRank-ChimpRank) %>%
    filter(qvalue <0.1) %>%
    arrange(desc(RankDifference))
Warning: Column `gene`/`chimp_id` joining factor and character vector,
coercing into character vector
GeneList <- Chimp_OrderedGenes$RankDifference
names(GeneList) <- as.character(ChimpToHuman.ID(Chimp_OrderedGenes$gene))
    
gsego.cc.chimpspecific <- gseGO(gene = GeneList,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 maxGSSize = 500,
                 ont = "BP",
                 nPerm = 100000)
preparing geneSet collections...
GSEA analysis...
Warning in fgsea(pathways = geneSets, stats = geneList, nperm = nPerm, minSize = minGSSize, : There are ties in the preranked stats (2.14% of the list).
The order of those tied genes will be arbitrary, which may produce unexpected results.
leading edge analysis...
done...
kable(head(as.data.frame(gsego.cc.chimpspecific), 2))
ID Description setSize enrichmentScore NES pvalue p.adjust qvalues rank leading_edge core_enrichment
GO:0019219 GO:0019219 regulation of nucleobase-containing compound metabolic process 54 0.5389640 1.687601 4e-05 0.003674 0.0030403 120 tags=74%, list=43%, signal=52% ENSG00000173575/ENSG00000159208/ENSG00000171862/ENSG00000124279/ENSG00000102974/ENSG00000164758/ENSG00000196150/ENSG00000075856/ENSG00000167513/ENSG00000152454/ENSG00000094916/ENSG00000128000/ENSG00000078401/ENSG00000157404/ENSG00000090971/ENSG00000181007/ENSG00000168743/ENSG00000151623/ENSG00000150593/ENSG00000106261/ENSG00000163602/ENSG00000170325/ENSG00000153187/ENSG00000159388/ENSG00000123609/ENSG00000107371/ENSG00000134283/ENSG00000151718/ENSG00000102984/ENSG00000061936/ENSG00000114503/ENSG00000185122/ENSG00000170312/ENSG00000164342/ENSG00000118785/ENSG00000161057/ENSG00000072274/ENSG00000141646/ENSG00000152409/ENSG00000204519
GO:0006351 GO:0006351 transcription, DNA-templated 46 0.5577685 1.724233 4e-05 0.003674 0.0030403 120 tags=76%, list=43%, signal=52% ENSG00000173575/ENSG00000159208/ENSG00000171862/ENSG00000102974/ENSG00000164758/ENSG00000196150/ENSG00000125484/ENSG00000167513/ENSG00000152454/ENSG00000094916/ENSG00000128000/ENSG00000078401/ENSG00000157404/ENSG00000090971/ENSG00000181007/ENSG00000168743/ENSG00000151623/ENSG00000150593/ENSG00000106261/ENSG00000163602/ENSG00000170325/ENSG00000153187/ENSG00000159388/ENSG00000123609/ENSG00000134283/ENSG00000151718/ENSG00000102984/ENSG00000114503/ENSG00000185122/ENSG00000164342/ENSG00000118785/ENSG00000161057/ENSG00000141646/ENSG00000152409/ENSG00000204519
gseaplot2(gsego.cc.chimpspecific, geneSetID = c("GO:0006366","GO:0044260"), title="Chimp eGenes ordered by difference in species rank", pvalue_table = TRUE)

Version Author Date
22eda3a Benjmain Fair 2019-06-12
dotplot(gsego.cc.chimpspecific, font.size=8, showCategory=38)

Version Author Date
22eda3a Benjmain Fair 2019-06-12

Alright. Great. that analysis recapitulated the gene overlap analysis of [foreground=Chimp-specific-eGenes; background=all-chimp-eGenes] in the sense that terms like ‘gene transcription’ pop up.

Let’s look at some of the genes in this GO category that are at the top of this ranked metric (have more eGene character in chimp than human)

gsea.results <- as.data.frame(gsego.cc.chimpspecific)
PolII.genes.in.set <- gsea.results %>% 
  filter(Description=="transcription by RNA polymerase II") %>% 
  pull(core_enrichment) %>%
  strsplit("/") %>% unlist() %>%
  mapIds(org.Hs.eg.db, keys=., column="SYMBOL", keytype="ENSEMBL", multiVals="first")
'select()' returned 1:1 mapping between keys and columns
PolII.genes.in.set
ENSG00000173575 ENSG00000102974 ENSG00000164758 ENSG00000196150 
         "CHD2"          "CTCF"         "MED30"        "ZNF250" 
ENSG00000152454 ENSG00000094916 ENSG00000078401 ENSG00000157404 
       "ZNF256"          "CBX5"          "EDN1"           "KIT" 
ENSG00000181007 ENSG00000168743 ENSG00000151623 ENSG00000150593 
        "ZFP82"          "NPNT"         "NR3C2"         "PDCD4" 
ENSG00000106261 ENSG00000163602 ENSG00000170325 ENSG00000153187 
      "ZKSCAN1"          "RYBP"        "PRDM10"        "HNRNPU" 
ENSG00000159388 ENSG00000123609 ENSG00000151718 ENSG00000102984 
         "BTG2"           "NMI"          "WWC2"        "ZNF821" 
ENSG00000114503 ENSG00000185122 ENSG00000164342 ENSG00000161057 
        "NCBP2"          "HSF1"          "TLR3"         "PSMC2" 
ENSG00000141646 ENSG00000152409 ENSG00000204519 
        "SMAD4"           "JMY"        "ZNF551" 

CTCF (ENSG00000102974) and HSF1 (ENSG00000185122) sticks out as something interesting and recognizeable genes. Also, quite a few zinc-finger proteins (ZNF821, ZNF551, ZNF250, ZFP82, ZNF256, PRDM10) Let’s see exactly where they are on this ranked list…

# All the top genes by this difference in ranks ordered gene list
GeneSymbolAdded <- Chimp_OrderedGenes %>% 
  mutate(geneSymbol = mapIds(org.Hs.eg.db, keys=ChimpToHuman.ID(gene), column="SYMBOL", keytype="ENSEMBL", multiVals="first") )
'select()' returned 1:many mapping between keys and columns
GeneSymbolAdded %>% head(40) %>% kable()
gene qvalue qval ChimpRank HumanRank RankDifference geneSymbol
ENSPTRG00000001564 0.0549566 0.394075 41 9045 9004 F11R
ENSPTRG00000007478 0.0404686 0.385221 17 8945 8928 CHD2
ENSPTRG00000001252 0.0941768 0.394134 127 9046 8919 CIART
ENSPTRG00000002719 0.0529162 0.384939 36 8943 8907 PTEN
ENSPTRG00000016720 0.0799690 0.389822 94 8997 8903 FASTKD3
ENSPTRG00000049174 0.0898612 0.391974 120 9021 8901 CLGN
ENSPTRG00000023277 0.0404686 0.381735 17 8909 8892 NECAP1
ENSPTRG00000021354 0.0571713 0.381265 45 8900 8855 PSMB7
ENSPTRG00000009925 0.0404686 0.377596 17 8863 8846 CABYR
ENSPTRG00000008235 0.0469129 0.377657 30 8864 8834 CTCF
ENSPTRG00000013577 0.0404686 0.376814 17 8851 8834 MMP9
ENSPTRG00000020525 0.0523096 0.377596 35 8863 8828 MED30
ENSPTRG00000044805 0.0943837 0.385718 128 8948 8820 ZNF250
ENSPTRG00000013074 0.0404686 0.360164 17 8649 8632 COL6A3
ENSPTRG00000020911 0.0699290 0.364383 72 8703 8631 TESK1
ENSPTRG00000052561 0.0799690 0.362824 94 8683 8589 SELENOH
ENSPTRG00000012460 0.0735215 0.359114 84 8635 8551 FAM168B
ENSPTRG00000015086 0.0571713 0.352464 45 8548 8503 KBTBD8
ENSPTRG00000005567 0.0434259 0.350216 23 8525 8502 SETD1B
ENSPTRG00000051490 0.0626533 0.347984 56 8502 8446 ACKR4
ENSPTRG00000011636 0.0866416 0.352160 110 8547 8437 ASAP2
ENSPTRG00000051169 0.0404686 0.344418 17 8446 8429 HERC3
ENSPTRG00000015278 0.0793361 0.340627 92 8399 8307 FBXO40
ENSPTRG00000044857 0.0464412 0.334661 29 8335 8306 RABEP2
ENSPTRG00000008700 0.0586051 0.335386 46 8345 8299 SHBG
ENSPTRG00000014606 0.0469129 0.330502 30 8277 8247 EMC3
ENSPTRG00000005404 0.0404686 0.322560 17 8178 8161 SART3
ENSPTRG00000021501 0.0404686 0.318408 17 8118 8101 GTF3C4
ENSPTRG00000005695 0.0843731 0.322292 104 8172 8068 ZDHHC20
ENSPTRG00000010613 0.0469129 0.315997 30 8079 8049 SYDE1
ENSPTRG00000008465 0.0309940 0.314829 13 8058 8045 CDT1
ENSPTRG00000010060 0.0941381 0.321524 126 8157 8031 LMAN1
ENSPTRG00000010639 0.0410963 0.305536 19 7918 7899 RAB8A
ENSPTRG00000050016 0.0842910 0.310204 103 7991 7888 HERC2
ENSPTRG00000011577 0.0619315 0.306314 55 7936 7881 ZNF256
ENSPTRG00000005034 0.0618029 0.305659 54 7921 7867 CBX5
ENSPTRG00000010988 0.0404686 0.300724 17 7843 7826 ZNF780B
ENSPTRG00000007356 0.0535353 0.298250 37 7814 7777 TMED3
ENSPTRG00000017730 0.0260784 0.296499 11 7781 7770 EDN1
ENSPTRG00000016067 0.0788016 0.300901 90 7845 7755 KIT
# The "interesting genes" that are in the PolII regulation of transcription gene set
GeneSymbolAdded %>% 
  filter(geneSymbol %in% PolII.genes.in.set) %>% kable()
gene qvalue qval ChimpRank HumanRank RankDifference geneSymbol
ENSPTRG00000007478 0.0404686 0.385221 17 8945 8928 CHD2
ENSPTRG00000008235 0.0469129 0.377657 30 8864 8834 CTCF
ENSPTRG00000020525 0.0523096 0.377596 35 8863 8828 MED30
ENSPTRG00000044805 0.0943837 0.385718 128 8948 8820 ZNF250
ENSPTRG00000011577 0.0619315 0.306314 55 7936 7881 ZNF256
ENSPTRG00000005034 0.0618029 0.305659 54 7921 7867 CBX5
ENSPTRG00000017730 0.0260784 0.296499 11 7781 7770 EDN1
ENSPTRG00000016067 0.0788016 0.300901 90 7845 7755 KIT
ENSPTRG00000010894 0.0459946 0.284799 27 7620 7593 ZFP82
ENSPTRG00000016343 0.0713741 0.287004 76 7649 7573 NPNT
ENSPTRG00000016499 0.0799690 0.281694 94 7586 7492 NR3C2
ENSPTRG00000002940 0.0736106 0.279169 86 7545 7459 PDCD4
ENSPTRG00000044142 0.0866009 0.275569 109 7493 7384 ZKSCAN1
ENSPTRG00000051886 0.0799690 0.271973 94 7440 7346 RYBP
ENSPTRG00000004477 0.0842910 0.262606 103 7297 7194 PRDM10
ENSPTRG00000002182 0.0803410 0.261595 95 7280 7185 HNRNPU
ENSPTRG00000001871 0.0404686 0.255353 17 7180 7163 BTG2
ENSPTRG00000012531 0.0752192 0.248161 89 7080 6991 NMI
ENSPTRG00000016626 0.0997206 0.227277 137 6739 6602 WWC2
ENSPTRG00000008328 0.0696251 0.213046 71 6499 6428 ZNF821
ENSPTRG00000048726 0.0414226 0.197905 20 6248 6228 NCBP2
ENSPTRG00000048158 0.0688478 0.194752 68 6194 6126 HSF1
ENSPTRG00000016658 0.0536295 0.188872 38 6111 6073 TLR3
ENSPTRG00000019553 0.0323298 0.174447 14 5916 5902 PSMC2
ENSPTRG00000010028 0.0568039 0.159087 44 5687 5643 SMAD4
ENSPTRG00000017025 0.0999317 0.141147 139 5396 5257 JMY
ENSPTRG00000011567 0.0404686 0.133755 17 5267 5250 ZNF551

CTCF and other zinc fingers are among the top in the list (some top chimp eGenes but not for human). This surprises me considering I think of CTCF as so conserved across large evolutionary distance. I will have to look back at more raw data to reassure myself that these chimp eQTLs are real.

Now let’s try a reciprocal analysis; where we look for what is enriched in human-specific eGenes, (again where the metric to order the gene list is a difference in ranks.)… Still a work-in-progress

Chimp_OrderedGenes <- eQTLs %>%
    group_by(gene) %>% 
    dplyr::slice(which.min(qvalue)) %>%
    filter(gene %in% GtexHeartEgenes$chimp_id) %>%
    filter(qvalue <0.1) %>%
    left_join(GtexHeartEgenes, by=c("gene"="chimp_id")) %>%
    dplyr::select(gene, qvalue, qval) %>% as.data.frame() %>%
    mutate(ChimpRank = dense_rank(qvalue)) %>%
    mutate(HumanRank = dense_rank(qval)) %>%
    mutate(RankDifference = HumanRank-ChimpRank) %>%
    arrange(desc(RankDifference))
GeneList <- Chimp_OrderedGenes$RankDifference
names(GeneList) <- as.character(ChimpToHuman.ID(Chimp_OrderedGenes$gene))
    
gsego.cc.chimpspecific <- gseGO(gene = GeneList,
                 OrgDb = org.Hs.eg.db,
                 keyType = 'ENSEMBL',
                 maxGSSize = 500,
                 ont = "BP",
                 nPerm = 10000)
kable(head(as.data.frame(gsego.cc.chimpspecific), 15))
gseaplot2(gsego.cc.chimpspecific, geneSetID = c("GO:0006357", "GO:0006355"), title="Chimp eGenes ordered by difference in species rank", pvalue_table = TRUE)

dotplot(gsego.cc.chimpspecific, font.size=8, showCategory=60)

sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS  10.14

Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] parallel  stats4    stats     graphics  grDevices utils     datasets 
[8] methods   base     

other attached packages:
 [1] enrichplot_1.2.0       gridExtra_2.3          org.Hs.eg.db_3.7.0    
 [4] AnnotationDbi_1.44.0   IRanges_2.16.0         S4Vectors_0.20.1      
 [7] Biobase_2.42.0         BiocGenerics_0.28.0    clusterProfiler_3.10.1
[10] ggpmisc_0.3.1          data.table_1.12.2      knitr_1.23            
[13] forcats_0.4.0          stringr_1.4.0          dplyr_0.8.1           
[16] purrr_0.3.2            readr_1.3.1            tidyr_0.8.3           
[19] tibble_2.1.3           ggplot2_3.1.1          tidyverse_1.2.1       
[22] plyr_1.8.4            

loaded via a namespace (and not attached):
 [1] nlme_3.1-140        fs_1.3.1            lubridate_1.7.4    
 [4] bit64_0.9-7         progress_1.2.2      RColorBrewer_1.1-2 
 [7] httr_1.4.0          UpSetR_1.4.0        rprojroot_1.3-2    
[10] tools_3.5.1         backports_1.1.4     R6_2.4.0           
[13] DBI_1.0.0           lazyeval_0.2.2      colorspace_1.4-1   
[16] withr_2.1.2         prettyunits_1.0.2   tidyselect_0.2.5   
[19] bit_1.1-14          compiler_3.5.1      git2r_0.25.2       
[22] cli_1.1.0           rvest_0.3.4         xml2_1.2.0         
[25] labeling_0.3        triebeard_0.3.0     scales_1.0.0       
[28] ggridges_0.5.1      digest_0.6.19       rmarkdown_1.13     
[31] DOSE_3.8.2          pkgconfig_2.0.2     htmltools_0.3.6    
[34] highr_0.8           rlang_0.3.4         readxl_1.3.1       
[37] rstudioapi_0.10     RSQLite_2.1.1       gridGraphics_0.4-1 
[40] generics_0.0.2      farver_1.1.0        jsonlite_1.6       
[43] BiocParallel_1.16.6 GOSemSim_2.8.0      magrittr_1.5       
[46] ggplotify_0.0.3     GO.db_3.7.0         Matrix_1.2-17      
[49] Rcpp_1.0.1          munsell_0.5.0       viridis_0.5.1      
[52] stringi_1.4.3       whisker_0.3-2       yaml_2.2.0         
[55] ggraph_1.0.2        MASS_7.3-51.4       qvalue_2.14.1      
[58] grid_3.5.1          blob_1.1.1          ggrepel_0.8.1      
[61] DO.db_2.9           crayon_1.3.4        lattice_0.20-38    
[64] cowplot_0.9.4       haven_2.1.0         splines_3.5.1      
[67] hms_0.4.2           pillar_1.4.1        fgsea_1.8.0        
[70] igraph_1.2.4.1      reshape2_1.4.3      fastmatch_1.1-0    
[73] glue_1.3.1          evaluate_0.14       modelr_0.1.4       
[76] urltools_1.7.3      tweenr_1.0.1        cellranger_1.1.0   
[79] gtable_0.3.0        polyclip_1.10-0     assertthat_0.2.1   
[82] xfun_0.7            ggforce_0.2.2       europepmc_0.3      
[85] broom_0.5.2         viridisLite_0.3.0   rvcheck_0.1.3      
[88] memoise_1.1.0       workflowr_1.4.0