Contents

1 Abstract

Discovering disease-disease simialrties can be useful for us to inferring the mechanisms of complex diseases. Disease similarity has become the important basis in disease-related molecular function research. There have been a number of methods proposed for measuring disease similarity in recent years. But there are lacks of tools or web servers for the computation of these methods. We present an R package dSimer which provides computation of nine methods for measuring disease-disease similarity, including a standard cosine similarity measure and eight function-based methods. The disease similarity matrix obtained from these nine methods can be visualized through heatmap and network. Biological data widely used in disease-disease associations study are also provided by dSimer.

2 Introduction

The quantification of similarity among diseases has drawn more and more attention in modern biology and medicine. Understanding similarity among diseases can not only help us gain deeper insights into complex diseases, but also lead to improvements in disease diagnosis, drug repurposing and new drug development. Due to the growing body of high-throughput biological data such as genomic and proteomic data, a number of methods have been proposed for the computation of similarity among diseases during the past decade.

Here we present dSimer for the calculation of nine disease similarity methods, including one standard cosine similarity method [1, 2] and eight function-based methods which compare disease-related gene set for calculating [3]. Besides, we also implemented methods for the visualization of disease similarity matrix.

To start with dSimer package, type following codes below:

library(dSimer)
help("dSimer")

3 The standard cosine similarity method

The cosine similarity method is a widely used standard measure in disease association analyses [1, 2]. First it constructs feature vectors for diseases from literature or by using other biological data. Then it calculate the cosine of the angle between normalized vector pairs as the similarity scores between diseases. We implemented function CosineDFV for this method:

data(d2s_hsdn) #get disease-symptom associations for constructing feature vectors
ds <- sample(unique(d2s_hsdn[,2]), 5) #get disease names sample
simmat <- CosineDFV(ds, ds, d2s_hsdn)
simmat
##                               Spinocerebellar Degenerations Facial Pain
## Spinocerebellar Degenerations                   1.000000000 0.000556501
## Facial Pain                                     0.000556501 1.000000000
## Trigger Finger Disorder                         0.000000000 0.015203031
## Liver Cirrhosis, Biliary                        0.015259983 0.001187471
## Renal Artery Obstruction                        0.011792379 0.009321150
##                               Trigger Finger Disorder
## Spinocerebellar Degenerations              0.00000000
## Facial Pain                                0.01520303
## Trigger Finger Disorder                    1.00000000
## Liver Cirrhosis, Biliary                   0.01480865
## Renal Artery Obstruction                   0.21405529
##                               Liver Cirrhosis, Biliary
## Spinocerebellar Degenerations              0.015259983
## Facial Pain                                0.001187471
## Trigger Finger Disorder                    0.014808645
## Liver Cirrhosis, Biliary                   1.000000000
## Renal Artery Obstruction                   0.018146252
##                               Renal Artery Obstruction
## Spinocerebellar Degenerations               0.01179238
## Facial Pain                                 0.00932115
## Trigger Finger Disorder                     0.21405529
## Liver Cirrhosis, Biliary                    0.01814625
## Renal Artery Obstruction                    1.00000000

4 Function-based methods

4.1 BOG

BOG [4] is a method for disease similarity calculating only using disease-gene associations. We designed function BOG to implement this method. And for the purpose of normalizing the matrix produced by method BOG, we implemented function Normalize. For example:

data(d2g_separation) #get disease-gene associations
ds<-sample(names(d2g_separation),5)
ds
## [1] "blood protein disorders"     "lung neoplasms"             
## [3] "leukemia, b-cell"            "endocrine system diseases"  
## [5] "blood coagulation disorders"
sim<-BOG(ds,ds,d2g_separation)
Normalize(sim) #normalize BOG sim scores
##                             blood protein disorders lung neoplasms
## blood protein disorders                1.0000000000   0.0000000000
## lung neoplasms                         0.0000000000   0.1896048110
## leukemia, b-cell                       0.0075425769   0.0000000000
## endocrine system diseases              0.0003748844   0.0001977548
## blood coagulation disorders            0.0211393650   0.0000000000
##                             leukemia, b-cell endocrine system diseases
## blood protein disorders         7.542577e-03              3.748844e-04
## lung neoplasms                  0.000000e+00              1.977548e-04
## leukemia, b-cell                1.896048e-01              3.917248e-05
## endocrine system diseases       3.917248e-05              8.088040e-02
## blood coagulation disorders     0.000000e+00              0.000000e+00
##                             blood coagulation disorders
## blood protein disorders                      0.02113937
## lung neoplasms                               0.00000000
## leukemia, b-cell                             0.00000000
## endocrine system diseases                    0.00000000
## blood coagulation disorders                  0.17899164

Note that disease-gene associations d2g_separation is a list object that can be obtained by function x2y_df2list. Function x2y_df2list take a data.frame which has two columns (one column contains disease ids and one column contains gene ids, each row declares an association between a disease and a gene) as a input. See an example below:

options(stringsAsFactors = FALSE) #this may be neccessary
 
d2g_fundo_sample<-read.table(text = "DOID:5218    IL6
DOID:8649  EGFR
DOID:8649   PTGS2
DOID:8649   VHL
DOID:8649   ERBB2
DOID:8649   PDCD1
DOID:8649   KLRC1
DOID:5214   MPZ
DOID:5214   EGR2
DOID:5210   AMH")

d2g_fundo_list<-x2y_df2list(d2g_fundo_sample)
d2g_fundo_list
## $`DOID:5218`
## [1] "IL6"
## 
## $`DOID:8649`
## [1] "EGFR"  "PTGS2" "VHL"   "ERBB2" "PDCD1" "KLRC1"
## 
## $`DOID:5214`
## [1] "MPZ"  "EGR2"
## 
## $`DOID:5210`
## [1] "AMH"

Function Normalize normalize a matrix or a vector as the following formula: \[NormScore=\frac{OrigScore-MinScore}{MaxScore-MinScore}\]

Here’s an example:

m<-matrix(1:9,3,3)
m
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
Normalize(m)
##       [,1]  [,2]  [,3]
## [1,] 0.000 0.375 0.750
## [2,] 0.125 0.500 0.875
## [3,] 0.250 0.625 1.000

4.2 PSB

PSB [5] uses not only disease-gene associations but also GO-gene associations. We designed function PSB to implement this method. Function PSB needs disease-GO associations which can be obtained by function HypergeometricTest.

Here’s an example for PSB:

## get the data 
data(go2g_sample)
data(d2go_sample)

ds<-names(d2go_sample)
sim<-PSB(ds,ds,d2go_sample,go2g_sample)
sim
##            DOID:5652 DOID:10005  DOID:2290
## DOID:5652  4.1743210 0.44099253 0.51055413
## DOID:10005 0.4409925 5.82708131 0.09897865
## DOID:2290  0.5105541 0.09897865 5.45446576
Normalize(sim)
##             DOID:5652 DOID:10005  DOID:2290
## DOID:5652  0.71146461 0.05970806 0.07185197
## DOID:10005 0.05970806 1.00000000 0.00000000
## DOID:2290  0.07185197 0.00000000 0.93494957

4.3 FunSim

FunSim [3] is a method that takes advantage of gene function network data from HumanNet [6]. First we got the raw data from HumanNet, then we normalized the associated log likelihood score of gene pairs. Then we can use function FunSim to mearsure similarity between diseases (note that we use function LLSn2List to convert HumanNet data from data.frame to list, for more efficient calculating):

## in this method, we must use disease-gene associations 
## which genes are represented by entrez ids because of
## HumanNet
data(d2g_fundo_entrezid) ##get disease-gene associations
data(HumanNet_sample)
## we specified 5 DOIDs to match Human_sample
ds<-c("DOID:8176","DOID:2394","DOID:3744","DOID:8466","DOID:5679")
llsnlist<-LLSn2List(HumanNet_sample)
FunSim(ds,ds,d2g_fundo_entrezid,llsnlist)
##              DOID:8176  DOID:2394    DOID:3744    DOID:8466 DOID:5679
## DOID:8176 1.0000000000 0.43350044 0.4476822789 0.0002666029 0.1457867
## DOID:2394 0.4335004444 1.00000000 0.4222353572 0.0166884115 0.1592188
## DOID:3744 0.4476822789 0.42223536 1.0000000000 0.0001286379 0.1293250
## DOID:8466 0.0002666029 0.01668841 0.0001286379 1.0000000000 0.1349979
## DOID:5679 0.1457866621 0.15921884 0.1293250308 0.1349979009 1.0000000

4.4 ICod

ICod [7] mearsures disease-disease similarities based on disease-related PPIs. We used an R graph igraph to import PPI data into R. For example:

## get disease-gene associations and HPRD PPI data
data(d2g_fundo_symbol)
data(PPI_HPRD)

graph_hprd<-graph.data.frame(PPI_HPRD,directed=FALSE) #get a igraph object based on HPRD PPI data

ds<-sample(names(d2g_fundo_symbol),5)
ICod(ds,ds,d2g_fundo_symbol,graph_hprd)
##             DOID:11613 DOID:3467    DOID:801   DOID:1781   DOID:2030
## DOID:11613 1.000000000         0 0.005443107 0.008179232 0.012421285
## DOID:3467  0.000000000         1 0.000000000 0.000000000 0.000000000
## DOID:801   0.005443107         0 1.000000000 0.004607343 0.001982739
## DOID:1781  0.008179232         0 0.004607343 1.000000000 0.007397408
## DOID:2030  0.012421285         0 0.001982739 0.007397408 1.000000000

4.5 Sun’s measures

Sun [8] proposed three measures which use different biological information. These three measures are: annotation-baesd, function-based and topological-based.

4.5.1 Sun’s annotation-based measure

Sun’s annotation-based measure used the information of disease-gene association data. We implemented function Sun_annotation to calculate disease-disease similarity:

data(d2g_separation) ## get disease-gene associations

ds<-sample(names(d2g_separation),5)
Sun_annotation(ds,ds,d2g_separation)
##                                 colitis peroxisomal disorders
## colitis                     1.000000000                     0
## peroxisomal disorders       0.000000000                     1
## urogenital abnormalities    0.000000000                     0
## blood coagulation disorders 0.008196721                     0
## ataxia                      0.000000000                     0
##                             urogenital abnormalities
## colitis                                            0
## peroxisomal disorders                              0
## urogenital abnormalities                           1
## blood coagulation disorders                        0
## ataxia                                             0
##                             blood coagulation disorders ataxia
## colitis                                     0.008196721      0
## peroxisomal disorders                       0.000000000      0
## urogenital abnormalities                    0.000000000      0
## blood coagulation disorders                 1.000000000      0
## ataxia                                      0.000000000      1

4.5.2 Sun’s function-based measure

Sun’s function-based measure uses both GO term annotations and disease-gene associations to estimate the disease similarity scores. We implemented function Sun_function to perform this method like follows:

## get a sample of disease-GO associations
data(d2go_sample)
ds<-names(d2go_sample)
Sun_function(ds,ds,d2go_sample)
##             DOID:5652 DOID:10005  DOID:2290
## DOID:5652  1.00000000          0 0.02672606
## DOID:10005 0.00000000          1 0.00000000
## DOID:2290  0.02672606          0 1.00000000

4.5.3 Sun’s topology-based measure

Sun’s topology-based measure takes advantage of the topology of PPI network and disease-gene association data to measure disease similarity scores. Futhurmore Function Sun_topology was implemented for this method. And in this method, the graphlet signature of nodes in PPI were calculated by a tool orca [9] (see details in [8]).

Here is an example:

data(d2g_fundo_symbol)
data(graphlet_sig_hprd) #get graphlet signatures of genes in HPRD PPI network
data(weight)
ds<-sample(names(d2g_fundo_symbol),5)
Sun_topology(ds,ds,d2g_fundo_symbol,graphlet_sig_hprd,weight)
##            DOID:14110  DOID:646  DOID:277 DOID:1059 DOID:1540
## DOID:14110  1.0000000 0.2354743 0.3486098 0.4515966 0.3384632
## DOID:646    0.2354743 1.0000000 0.3209996 0.4054046 0.3133584
## DOID:277    0.3486098 0.3209996 1.0000000 0.4563651 0.4316756
## DOID:1059   0.4515966 0.4054046 0.4563651 1.0000000 0.4314750
## DOID:1540   0.3384632 0.3133584 0.4316756 0.4314750 1.0000000

4.6 Separation

Method Separation is actually a method measuring a netowrk-based separation of disease pairs [10]. But the result can also be turned into similarity scores. And we implemented function Separation2Similarity for this purpose as the following formula: \[SimScore=\frac{MaxSepScore-SepScore}{MaxSepScore-MinSepScore}\]

Here is an example:

## get the disease-gene association data and interactome data
data(d2g_separation)
data(interactome)

## import ppi data to R by igraph
graph_interactome<-graph.data.frame(interactome,directed=FALSE)

## calculate separation of 5 sample diseases
ds<-sample(names(d2g_separation),5)
sep<-Separation(ds,ds,d2g_separation,graph_interactome)

## convert separation into simialrity
sim<-Separation2Similarity(sep)
sim
##                               skin diseases, papulosquamous
## skin diseases, papulosquamous                    0.87291542
## otorhinolaryngologic diseases                    0.16174773
## aneurysm                                         0.05022401
## genetic diseases, x-linked                       0.09634279
## muscular dystrophies                             0.00000000
##                               otorhinolaryngologic diseases   aneurysm
## skin diseases, papulosquamous                    0.16174773 0.05022401
## otorhinolaryngologic diseases                    1.00000000 0.03881989
## aneurysm                                         0.03881989 0.86740125
## genetic diseases, x-linked                       0.09573554 0.04570019
## muscular dystrophies                             0.02547566 0.04894792
##                               genetic diseases, x-linked
## skin diseases, papulosquamous                 0.09634279
## otorhinolaryngologic diseases                 0.09573554
## aneurysm                                      0.04570019
## genetic diseases, x-linked                    0.84096411
## muscular dystrophies                          0.08658526
##                               muscular dystrophies
## skin diseases, papulosquamous           0.00000000
## otorhinolaryngologic diseases           0.02547566
## aneurysm                                0.04894792
## genetic diseases, x-linked              0.08658526
## muscular dystrophies                    0.81047546

5 Visualization

5.1 Visualization of disease-gene associations

Disease-gene associations are the most widely used information to measure disease similarity in function-based methods. Here we provide function plot_bipartite for users to observe associations between diseases and genes more intuitively. This function can also visualize other associations like disease-GO term associations. Here’s an example:

data(d2g_fundo_symbol)
d2g_sample<-d2g_fundo_symbol[1:10]
plot_bipartite(d2g_sample)

For two specific diseases, we implemented function plot_topo to visualize the topological relationship of the two diseases’ gene sets in gene network. The following is an example:

data("PPI_HPRD")
g<-graph.data.frame(PPI_HPRD,directed = FALSE) #get an igraph graph

data(d2g_fundo_symbol)
a<-d2g_fundo_symbol[["DOID:8242"]] # get gene set a
b<-d2g_fundo_symbol[["DOID:4914"]] # get gene set b

plot_topo(a,b,g)

5.2 Visualization of disease similarity network

We implemented two functions plot_heatmap and plot_net for the disease similarity network’s visualization. Function plot_heatmap is a reuse of function simplot in package DOSE [11] which shows the heatmap of disease similarity network. Given a cutoff, function plot_net will show the relationships among diseases in a graph. For example:

data(d2g_separation)
data(interactome)

graph_interactome<-graph.data.frame(interactome,directed=FALSE)
ds<-c("myocardial ischemia","myocardial infarction","coronary artery disease",
 "cerebrovascular disorders","arthritis, rheumatoid","diabetes mellitus, type 1",
 "autoimmune diseases of the nervous system","demyelinating autoimmune diseases, cns",
 "respiratory hypersensitivity","asthma","retinitis pigmentosa",
 "retinal degeneration","macular degeneration")
 
sep<-Separation(ds,ds,d2g_separation,graph_interactome)
sim<-Separation2Similarity(sep)
plot_heatmap(sim,font.size = 3)

plot_net(sim,cutoff=0.2)

6 References

[1] Zhou X Z, Menche J, Barabasi A L, et al. Human symptoms-disease network[J]. Nature communications, 2014, 5.

[2] Van Driel M A, Bruggeman J, Vriend G, et al. A text-mining analysis of the human phenome[J]. European journal of human genetics, 2006, 14(5): 535-542.

[3] Cheng L, Li J, Ju P, et al. SemFunSim: a new method for measuring disease similarity by integrating semantic and gene functional association[J]. PloS one, 2014, 9(6): e99415.

[4] Mathur S, Dinakarpandian D. Automated ontological gene annotation for computing disease similarity[J]. AMIA Summits on Translational Science Proceedings, 2010, 2010: 12.

[5] Mathur S, Dinakarpandian D. Finding disease similarity based on implicit semantic similarity[J]. Journal of biomedical informatics, 2012, 45(2): 363-371.

[6] Lee I, Blom U M, Wang P I, et al. Prioritizing candidate disease genes by network-based boosting of genome-wide association data[J]. Genome research, 2011, 21(7): 1109-1121.

[7] Paik H, Heo HS, Ban H, et al. Unraveling human protein interaction networks underlying co-occurrences of diseases and pathological conditions[J]. Journal of translational medicine, 2014, 12(1): 99.

[8] Sun K, Gonçalves JP, Larminie C. Predicting disease associations via biological network analysis[J]. BMC bioinformatics, 2014, 15(1): 304.

[9] Hočevar T, Demšar J. A combinatorial approach to graphlet counting[J]. Bioinformatics, 2014, 30(4): 559-565.

[10] Menche J, Sharma A, Kitsak M, et al. Uncovering disease-disease relationships through the incomplete interactome[J]. Science, 2015, 347(6224): 1257601.

[11] Yu G, Wang L G, Yan G R, et al. DOSE: an R/Bioconductor package for disease ontology semantic and enrichment analysis[J]. Bioinformatics, 2015, 31(4): 608-609.