From f17c2a1422192efbd3aa16ddb35045a4a27a707f Mon Sep 17 00:00:00 2001 From: noah Date: Thu, 8 Sep 2022 14:58:43 -0500 Subject: [PATCH] Lab 2 init and README --- README.md | 141 ++++++++++++++++++++++++++++++++ Schrick-Noah_CS-6643_Lab-2.R | 4 + Schrick-Noah_CS-6643_Lab-2.docx | Bin 0 -> 28077 bytes assignment.docx | Bin 0 -> 28077 bytes distance_matrix.txt | 1 + labels2colors.R | 46 +++++++++++ 6 files changed, 192 insertions(+) create mode 100644 README.md create mode 100644 Schrick-Noah_CS-6643_Lab-2.R create mode 100644 Schrick-Noah_CS-6643_Lab-2.docx create mode 100644 assignment.docx create mode 100644 distance_matrix.txt create mode 100644 labels2colors.R diff --git a/README.md b/README.md new file mode 100644 index 0000000..c65e941 --- /dev/null +++ b/README.md @@ -0,0 +1,141 @@ +# Bioinformatics Lab 2 + +## Part A - hclust + +1.) Write a 2-column linkage matrix using the following hclust rules + +- Label the objects A, B, C, D, E, F as negative numbers -1, -2, -3, -4, -5, -6 +- Put the closest pair of objects in the first row of the matrix. The first row will be: -1, -2 +- Merge AB (1) with C (-3) +- Repeat for the rest of the tree. +- Show the full merge matrix and the heights of each row in the merge matrix. + +2.) Create a script with the following *incomplete* code. Based on your UPGMA merging calculation and your linkage matrix above, fill in the blanks in the code below to plot the tree. Show the resulting plot. + + # initialize an empty list that will contain fields of our hclust object + a <- list() + # encoding rules: + # negative numbers are leaves (A,B,...,E) -> (-1,-2,...,-5) + # positive are merged clusters (defined by row number in $merge) + + # each merged pair in a row + a$merge <- rbind(c(-1, -2), # +1 (A-B) + c(1,-3) , # +2 (A-B)-C + _______ , # +3 (D-E) + _______ , # +4 ((A-B)-C)-(DE) + _______) # +5 (((A-B)-C)-(DE))-F + + a$height <- c(1, 2, 1.5, 3, 4) # merge heights + a$order <- 1:6 # order of leaves + a$labels <- LETTERS[1:6] # labels of leaves as Letters + class(a) <- "hclust" # force a to be hclust object + # plot the tree + # plot knows that a is an hclust object and plots accordingly + plot(a,hang=-1) # or use plot(as.dendrogram(a)) + +## Part B - UPGMA and WGCNA + +1) Add the code below to your script to read in the distance matrix distance_matrix.txt and plot the dendrogram. Show the dendrogram. + + # Set the Working Directory First + my.dist1 <- read.table("distance_matrix.txt",sep="\t", header=T) + rownames(my.dist1) = colnames(my.dist1) + my.dist1[lower.tri(my.dist1)] = t(my.dist1)[lower.tri(my.dist1)] + hc1 <- hclust(as.dist(my.dist1), method="average") + plot(hc1,hang=-1) + +2.) View the distance matrix in Excel and paste it in the report. Use header=T. + +3.) What does header=T do in this situation? + +4.) Add the following code to install and run WGCNA. + + # method 1 + install.packages("WGCNA", dependencies=T) + source("http://bioconductor.org/biocLite.R") + biocLite(c("AnnotationDbi", "impute", "GO.db", "preprocessCore")) + biocLite("WGCNA") + install.packages("WGCNA") + + # method 2 (easier method) + install.packages("BiocManager") + library(BiocManager) + BiocManager::install("WGCNA") + + # load WGCNA and run on the hc1 dendrogram + cutree(hc1,k=3) # hclust cluster labels with k=3 clusters + library(WGCNA) + dynamicMods = cutreeDynamic( + dendro = hc1, + distM = my.dist1, + deepSplit = 2, + pamRespectsDendro = FALSE, + minClusterSize = 2) + names(dynamicMods) <- colnames(my.dist1) + +5.) Looking at dynamicMods, what leaves are clustered together? + +6.) Add the following code to show the clustered data. What do the colors at the bottom represent? + + dynamicColors = labels2colors(dynamicMods) # colors might not work + table(dynamicColors) + # Plot the dendrogram and colors underneath + sizeGrWindow(8,6) + plotDendroAndColors(hc1, + dynamicColors, + "Dynamic Tree Cut", + dendroLabels = NULL, + hang = -1, + addGuide = TRUE, + #guideHang = 0.05, + main = "dynamic cut clustering") + +## Part C - Distance Matrix + +| <> | A | B | C | D | +|:------:|:------:|:------:|:------:|:------:| +| A | x | 0.14 | 0.48 | 0.33 | +| B | | x | 0.5 | 0.28 | +| C | | | x | 0.55 | +| D | | | | x | + + +1.) Do the UPGMA by hand, showing the new UPGMA distance matrices as you merge clusters. + +2.) Create the linkage matrix as you did in A.1, and list the height of each branch. For example, the first row of the linkage matrix is -1, -2 with height .14. + +3.) Mirror the code you used in A.2 to plot the dendrogram for this new matrix. + +4.) Use code below to verify your results by applying hclust to the distance matrix. + + # create distance matrix + my.dist2 <- matrix(data=rep(0,16),ncol=4) + my.dist2[1,2]<-.14; my.dist2[1,3]<-.48; my.dist2[1,4]<-.33; + my.dist2[2,3]<-.50; my.dist2[2,4]<-.28; + my.dist2[3,4]<-.55; + # make matrix symmetric + # make the lower triangle equal to the upper triangle + my.dist2[lower.tri(my.dist2)] = t(my.dist2)[lower.tri(my.dist2)] + diag(my.dist2)<-999 # big number to guarantee it’s not the min + # compare with hclust + test <- hclust(as.dist(my.dist2), method="average") # average linkage, UPGMA + test$merge + test$height + test$order + test$labels<-LETTERS[1:4] + plot(test,hang=-1) + +## Part D - Multidimensional Scaling + +1.) Show the 2d MDS plot for my.dist2. How does this visualization change your perspective on how the objects are clustered? + + ## MDS, you might need to refresh (sweep) the plot window + locs<-cmdscale(as.dist(my.dist2), k=2) # k is number of mds components + x<-locs[,1] + y<-locs[,2] + # pch=NA hides plot symbols: + plot(x,y,main="Multi-dimensional Scaling", + xlab="MDS dimension-1", ylab="MDS dimension-2", pch=NA,asp=1) + # pch specifies plot symbol; we want null because we are using letter next + # plot the text labels instead of symbols: + text(x,y,test$labels,cex=1) diff --git a/Schrick-Noah_CS-6643_Lab-2.R b/Schrick-Noah_CS-6643_Lab-2.R new file mode 100644 index 0000000..f0bd440 --- /dev/null +++ b/Schrick-Noah_CS-6643_Lab-2.R @@ -0,0 +1,4 @@ +# Lab 2 for the University of Tulsa's CS-6643 Bioinformatics Course +# Hierarchical clustering (upgma and linkage matrix), WGCNA, Multidimensional scaling +# Professor: Dr. McKinney, Fall 2022 +# Noah L. Schrick - 1492657 diff --git a/Schrick-Noah_CS-6643_Lab-2.docx b/Schrick-Noah_CS-6643_Lab-2.docx new file mode 100644 index 0000000000000000000000000000000000000000..14ed45c329112da48013f1a302744cb2a946c27e GIT binary patch literal 28077 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 af2I*d8R!@51Or2UdA@rwa1FCR-u)kE(S6(i literal 0 HcmV?d00001 diff --git a/assignment.docx b/assignment.docx new file mode 100644 index 0000000000000000000000000000000000000000..14ed45c329112da48013f1a302744cb2a946c27e GIT binary patch literal 28077 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 af2I*d8R!@51Or2UdA@rwa1FCR-u)kE(S6(i literal 0 HcmV?d00001 diff --git a/distance_matrix.txt b/distance_matrix.txt new file mode 100644 index 0000000..39dece8 --- /dev/null +++ b/distance_matrix.txt @@ -0,0 +1 @@ +A B C D E F 999 2 4 6 6 8 999 999 4 6 6 8 999 999 999 6 6 8 999 999 999 999 3 8 999 999 999 999 999 8 999 999 999 999 999 999 \ No newline at end of file diff --git a/labels2colors.R b/labels2colors.R new file mode 100644 index 0000000..43e5de1 --- /dev/null +++ b/labels2colors.R @@ -0,0 +1,46 @@ +labels2colors <- function (labels, zeroIsGrey = TRUE, colorSeq = NULL, naColor = "grey", commonColorCode = TRUE) +{ + if (is.null(colorSeq)) + colorSeq = standardColors() + if (is.numeric(labels)) { + if (zeroIsGrey) + minLabel = 0 + else minLabel = 1 + if (any(labels < 0, na.rm = TRUE)) + minLabel = min(c(labels), na.rm = TRUE) + nLabels = labels + } + else { + if (commonColorCode) { + factors = factor(c(as.matrix(as.data.frame(labels)))) + nLabels = as.numeric(factors) + dim(nLabels) = dim(labels) + } + else { + labels = as.matrix(as.data.frame(labels)) + factors = list() + for (c in 1:ncol(labels)) factors[[c]] = factor(labels[, c]) + nLabels = sapply(factors, as.numeric) + } + } + if (max(nLabels, na.rm = TRUE) > length(colorSeq)) { + nRepeats = as.integer((max(labels) - 1)/length(colorSeq)) + + 1 + warning(paste("labels2colors: Number of labels exceeds number of avilable colors.", + "Some colors will be repeated", nRepeats, "times.")) + extColorSeq = colorSeq + for (rep in 1:nRepeats) extColorSeq = c(extColorSeq, paste(colorSeq, ".", rep, sep = "")) + } + else { + nRepeats = 1 + extColorSeq = colorSeq + } + colors = rep("grey", length(nLabels)) + fin = !is.na(nLabels) + colors[!fin] = naColor + finLabels = nLabels[fin] + colors[fin][finLabels != 0] = extColorSeq[finLabels[finLabels != 0]] + if (!is.null(dim(labels))) + dim(colors) = dim(labels) + colors +}