##install.packages("ape")
##install.packages("phangorn")
library(ape)
library(phangorn)
##Summary on Obtaining Data The data for Example 2, or 5 sequences of genetic DNA was obtained by looking at multiple sequence pair alignments of five chimpanzee species in Africa. These 5 species were Mahale East, Bodongo East, Gombe East, Tai West and Mahale West. To obtain this data, if was first important to color code each base pair so as to easily distinguish them. From here, a “random” selection of 10 base pair sequences were taken from each species of chimpanzee and compared with each other, for a total of 10 different sequence combinations. Each of these sequences were required to have at least one single nucleotide polymorphism. These sequences were examined to check their percent identity, or PID using the if() function built into excel. After calculating the percent identity, it was inputted into a five-by-five matrix, with data being represented in a lower triangular matrix. The matrix data was then inputted into R and used for the basis of the examination.
This matrix is based on the proportion of bases that are identical between sequence. This is often referred to as PID for Proportion Identical or Percentage Identical.
BLAST reports PID in its main output. PID is a very simple metric of similarity; more sophisticated measures are used in pratice.
Make a similarity matrix with the matrix() command. Note that I have to declare the number of rows
# Bad matrix 1
matrix(c(1.0, 0.5, 0.3,
0.5, 1.0, 0.4,
0.3, 0.4, 1.0))
## [,1]
## [1,] 1.0
## [2,] 0.5
## [3,] 0.3
## [4,] 0.5
## [5,] 1.0
## [6,] 0.4
## [7,] 0.3
## [8,] 0.4
## [9,] 1.0
# Good matrix
matrix(c(1.0, 0.5, 0.3,
0.5, 1.0, 0.4,
0.3, 0.4, 1.0),
nrow = 3)
## [,1] [,2] [,3]
## [1,] 1.0 0.5 0.3
## [2,] 0.5 1.0 0.4
## [3,] 0.3 0.4 1.0
Store the matrix
my_sim_mat <- matrix(c(1.0, 0.5, 0.3,
0.5, 1.0, 0.4,
0.3, 0.4, 1.0),
nrow = 3,
byrow = T)
Label the matrix with row.names() and colnames()
row.names(my_sim_mat) <- c("G","T","M")
colnames(my_sim_mat) <- c("G","T","M")
Similarity, disimilarity, and distance are all related. Most methods use distance, not similarity.
We can do vectorized math to recalculate the matrix
my_dist_mat <- 1-my_sim_mat
my_dist_mat2 <- as.dist(my_dist_mat)
my_dist_mat
## G T M
## G 0.0 0.5 0.7
## T 0.5 0.0 0.6
## M 0.7 0.6 0.0
my_dist_mat2
## G T
## T 0.5
## M 0.7 0.6
is(my_dist_mat2)
## [1] "dist"
class(my_dist_mat2)
## [1] "dist"
Neighbor Joining is one of the most common ways to build a tree using molecular data that’s been converted to sequences; its one of the options within BLAST.
Build the tree with nj()
my_nj <- ape::nj(my_dist_mat2)
Plot the tree as an “unrooted” tree
plot(my_nj, "unrooted")
Plot the tree as an “rooted” tree
plot(my_nj)
UPGMA/WPGMA are other algorithms that work with distance matrices. They are not commonly used now but are useful for teaching becaues they can easily be done by hand on small datasets.
my_upgma <- phangorn::upgma(my_dist_mat2)
Plot the UPGMA tree
plot(my_upgma)
Compare the rooted NJ and the UPGMA
par(mfrow = c(1,2))
plot(my_nj)
plot(my_upgma)
WPGMA tree
plot(wpgma(my_dist_mat2))
Minimum evolution tree
plot(fastme.ols(my_dist_mat2))
Build the matrix.
Be sure to add the nrow = … statemetn.
five_sim_mat <- matrix(c(1.0, 0.0, 0.0, 0.0, 0.0,
0.8, 1.0, 0.0, 0.0, 0.0,
0.8, 0.6, 1.0, 0.0, 0.0,
0.4, 0.3, 0.2, 1.0, 0.0,
0.4, 0.3, 0.2, 0.8, 1.0),
nrow = 5,
byrow = T)
Name things
row.names(five_sim_mat) <- c("ME","BE","GE","TW","MW")
colnames(five_sim_mat) <- c("ME","BE","GE","TW","MW")
Turn into a distance matrix. This is 2 steps and requires the as.dist() command
five_dist_mat <- 1-five_sim_mat
five_dist_mat2 <- as.dist(five_dist_mat)
Neighbor-Joining tree with nj()
five_nj <- ape::nj(five_dist_mat2)
Plot Unrooted NJ tree
plot(five_nj, "unrooted")
Plot rooted NJ tree
plot(five_nj)
Build UPGMA tree
five_upgma <- phangorn::upgma(five_dist_mat2)
Plot UPGMA tree
plot(five_upgma)
Compare rooted NJ and UPGMA plots
par(mfrow = c(1,2))
plot(five_nj)
plot(five_upgma)
Build WPGMA tree
plot(wpgma(five_dist_mat2))
Compare rooted WPGMA and UPGMA plots
par(mfrow = c(1,2))
plot(five_upgma)
plot(wpgma(five_dist_mat2))
Build Minimum evolution tree
plot(fastme.ols(five_dist_mat2))