Introduction to ontologySimilarity

Daniel Greene

2024-03-29

ontologySimilarity is part of the ‘ontologyX’ family of packages (see the ‘Introduction to ontologyX’ vignette supplied with the ontologyIndex package). It contains various functions for calculating semantic similarity between ontological objects. The functions operate on various kinds of object. It’s useful to look out for particular parameter names, as each kind of object tends to be called the same thing by the functions. To make full use of the features in ontologySimilarity, the user is encouraged to gain familiarity of the functions in ontologyIndex.

Various kinds of similarity can be calculated, including:

Some key functions are:

Example

To use the package, first load ontologyIndex and an ontology_index object. Here we demonstrate using the Human Phenotype Ontology, hpo.

library(ontologyIndex)
library(ontologySimilarity)
data(hpo)
set.seed(1)

Next, we’ll set the information content for the terms. This is typically based on some kind of ‘population frequency’, for example: the frequency with which the term is used, explicitly or implicity, to annotate objects in a database. Such frequency information is not always available, but it could still be useful to define the information content with respect to the frequency with which the term is an ancestor of other terms in the ontology (as this still captures the structure of the ontology).

information_content <- descendants_IC(hpo)

Now we’ll generate some random sets of terms. We’ll sample 5 random term sets (which could for example represent the phenotypes of patients) of 8 terms. Note that here, we call the minimal_set function from the ontologyIndex package on each sample set to remove redundant terms. Typically, ontological annotations would be stored as such minimal sets, however if you are unsure, it is best to call minimal_set on each term set to guarantee the similarity expressions are faithfully evaluated (the package chooses not to map to minimal sets by default for speed).

term_sets <- replicate(simplify=FALSE, n=5, expr=minimal_set(hpo, sample(hpo$id, size=8)))
term_sets
## [[1]]
## [1] "HP:0430093" "HP:0007165" "HP:0032845" "HP:0030058" "HP:0005876"
## [6] "HP:0033126" "HP:0031139"
## 
## [[2]]
## [1] "HP:0031850" "HP:3000041" "HP:0033889" "HP:5200422" "HP:0033530"
## [6] "HP:0025158" "HP:0011571" "HP:0500133"
## 
## [[3]]
## [1] "HP:0001100" "HP:0009792" "HP:0031795" "HP:0030578" "HP:0010377"
## [6] "HP:0034289" "HP:0020133" "HP:0004921"
## 
## [[4]]
## [1] "HP:0002622" "HP:0002034" "HP:0034854" "HP:0032247" "HP:0100078"
## [6] "HP:0006887" "HP:0009785" "HP:0001635"
## 
## [[5]]
## [1] "HP:0030138" "HP:0025103" "HP:0200035" "HP:0500049" "HP:0008390"
## [6] "HP:5200413" "HP:0033555" "HP:0100927"

Then one can calculate a similarity matrix, containing pairwise term-set similarities:

sim_mat <- get_sim_grid(ontology=hpo, term_sets=term_sets)
sim_mat
##            [,1]      [,2]       [,3]      [,4]      [,5]
## [1,] 1.00000000 0.1242382 0.07890359 0.1361949 0.2450250
## [2,] 0.12423823 1.0000000 0.22358934 0.1615010 0.1728086
## [3,] 0.07890359 0.2235893 1.00000000 0.1095122 0.1405417
## [4,] 0.13619488 0.1615010 0.10951216 1.0000000 0.1488531
## [5,] 0.24502498 0.1728086 0.14054170 0.1488531 1.0000000

Group similarity of phenotypes 1-3, based on sim_mat:

get_sim(sim_mat, group=1:3)
## [1] 0.1422437

p-value for significance of similarity of phenotypes 1-3:

get_sim_p(sim_mat, group=1:3)
## [1] 0.7132867