From 176c0d831fe52eb9bafb91db7f365f34b03167a3 Mon Sep 17 00:00:00 2001 From: noah Date: Fri, 30 Sep 2022 11:57:41 -0500 Subject: [PATCH] Part B and Part C --- .Rhistory | 512 ++++++++++++++++++++++++ .~lock.Schrick-Noah_CS-6643_Lab-4.docx# | 2 +- Schrick-Noah_CS-6643_Lab-4.R | 53 ++- Schrick-Noah_CS-6643_Lab-4.docx | Bin 15320 -> 27599 bytes 4 files changed, 565 insertions(+), 2 deletions(-) create mode 100644 .Rhistory diff --git a/.Rhistory b/.Rhistory new file mode 100644 index 0000000..50ddc87 --- /dev/null +++ b/.Rhistory @@ -0,0 +1,512 @@ +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.breaks[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean)/kmin) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1,2)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.breaks[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean)/kmin) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1,2,3)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.breaks[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean)/kmin) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.breaks[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean)/kmin) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +#g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.breaks <- g.hist$breaks # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.breaks[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean)/kmin) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.probs[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean)/kmin) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +alpha.LM +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.probs[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean/kmin)) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1, lwd=5) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.probs[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean/kmin)) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1, lwd=3) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.probs[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean/kmin)) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1, lwd=3) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2, lwd=3) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.probs[nz.probs.mask] +#plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3, lwd=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean/kmin)) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4, lwd=3) +plot(yeast) +hist(yeast) +hist(g.vec) +g.pois +g.mean +alpha.LM +alpha.ML +degree(g) +sort(degree(g)) +sort(degree(g),decreasing=FALSE) +sort(degree(g),decreasing=F) +sort(degree(g),decreasing=false) +sort(degree(g), decreasing = TRUE) +head(sort(degree(g), decreasing = TRUE)) +stddev(degree(g)) +sd(degree(g)) +tail(sort(degree(g), decreasing = TRUE)) +plot(log(g.breaks.clean), log(g.probs.clean)) +# Homework 4 for the University of Tulsa' s CS-7863 Network Theory Course +# Degree Distribution +# Professor: Dr. McKinney, Spring 2022 +# Noah Schrick - 1492657 +library(igraph) +library(igraphdata) +data(yeast) +g <- yeast +g.netname <- "Yeast" +################# Set up Work ################# +g.vec <- degree(g) +g.hist <- hist(g.vec, freq=FALSE, main=paste("Histogram of the", g.netname, +" Network")) +legend("topright", c("Guess", "Poisson", "Least-Squares Fit", +"Max Log-Likelihood"), lty=c(1,2,3,4), col=c("#40B0A6", +"#006CD1", "#E66100", "#D35FB7")) +g.mean <- mean(g.vec) +g.seq <- 0:max(g.vec) # x-axis +################# Guessing Alpha ################# +alpha.guess <- 1.5 +lines(g.seq, g.seq^(-alpha.guess), col="#40B0A6", lty=1, lwd=3) +################# Poisson ################# +g.pois <- dpois(g.seq, g.mean, log=F) +lines(g.seq, g.pois, col="#006CD1", lty=2, lwd=3) +################# Linear model: Least-Squares Fit ################# +g.breaks <- g.hist$breaks[-c(1)] # remove 0 +g.probs <- g.hist$density[-1] # make lengths match +# Need to clean up probabilities that are 0 +nz.probs.mask <- g.probs!=0 +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.probs[nz.probs.mask] +plot(log(g.breaks.clean), log(g.probs.clean)) +g.fit <- lm(log(g.probs.clean)~log(g.breaks.clean)) +summary(g.fit) +alpha.LM <- coef(g.fit)[2] +lines(g.seq, g.seq^(-alpha.LM), col="#E66100", lty=3, lwd=3) +################# Max-Log-Likelihood ################# +n <- length(g.breaks.clean) +kmin <- g.breaks.clean[1] +alpha.ML <- 1 + n/sum(log(g.breaks.clean/kmin)) +alpha.ML +lines(g.seq, g.seq^(-alpha.ML), col="#D35FB7", lty=4, lwd=3) +plot(log(g.breaks.clean), log(g.probs.clean)) +g.breaks.clean <- g.breaks[nz.probs.mask] +g.probs.clean <- g.probs[nz.probs.mask] +plot(log(g.breaks.clean), log(g.probs.clean)) +## Set Working Directory to file directory - RStudio approach +setwd(dirname(rstudioapi::getActiveDocumentContext()$path)) +#### Part A: Preparing Data +load("sense.filtered.cpm.Rdata") +# load phenotype (mdd/hc) data +subject.attrs <- read.csv("Demographic_symptom.csv", +stringsAsFactors = FALSE) +if (!require("dplyr")) install.packages("dplyr") +library(dplyr) +# grab intersecting X (subject ids) and Diag (Diagnosis) from columns +phenos.df <- subject.attrs %>% +filter(X %in% colnames(sense.filtered.cpm)) %>% +dplyr::select(X, Diag) +mddPheno <- as.factor(phenos.df$Diag) +# Normalized and transform +library(preprocessCore) +mddExprData_quantile <- normalize.quantiles(sense.filtered.cpm) +mddExprData_quantileLog2 <- log2(mddExprData_quantile) +# attach phenotype names and gene names to data +colnames(mddExprData_quantileLog2) <- mddPheno +rownames(mddExprData_quantileLog2) <- rownames(sense.filtered.cpm) +rownames(sense.filtered.cpm) +len(rownames(sense.filtered.cpm)) +length(rownames(sense.filtered.cpm)) +length(rownames(sense.filtered.cpm)) diff --git a/.~lock.Schrick-Noah_CS-6643_Lab-4.docx# b/.~lock.Schrick-Noah_CS-6643_Lab-4.docx# index 111e6d0..dc2814b 100644 --- a/.~lock.Schrick-Noah_CS-6643_Lab-4.docx# +++ b/.~lock.Schrick-Noah_CS-6643_Lab-4.docx# @@ -1 +1 @@ -,noah,NovaArchSys,29.09.2022 14:42,file:///home/noah/.config/libreoffice/4; \ No newline at end of file +,noah,NovaArchSys,30.09.2022 11:57,file:///home/noah/.config/libreoffice/4; \ No newline at end of file diff --git a/Schrick-Noah_CS-6643_Lab-4.R b/Schrick-Noah_CS-6643_Lab-4.R index bda527f..5038cf7 100644 --- a/Schrick-Noah_CS-6643_Lab-4.R +++ b/Schrick-Noah_CS-6643_Lab-4.R @@ -21,6 +21,7 @@ phenos.df <- subject.attrs %>% mddPheno <- as.factor(phenos.df$Diag) # Normalized and transform +if (!require("preprocessCore")) install.packages("preprocessCore") library(preprocessCore) mddExprData_quantile <- normalize.quantiles(sense.filtered.cpm) mddExprData_quantileLog2 <- log2(mddExprData_quantile) @@ -29,4 +30,54 @@ colnames(mddExprData_quantileLog2) <- mddPheno rownames(mddExprData_quantileLog2) <- rownames(sense.filtered.cpm) length(rownames(sense.filtered.cpm)) -#### Part B: Filter noise genes \ No newline at end of file + + +#### Part B: Filter noise genes +# coefficient of variation filter sd(x)/abs(mean(x)) +CoV_values <- apply(mddExprData_quantileLog2,1, + function(x) {sd(x)/abs(mean(x))}) +# smaller threshold, the higher the experimental effect relative to the +# measurement precision +sum(CoV_values<.045) +# there is one gene that has 0 variation -- remove +sd_values <- apply(mddExprData_quantileLog2,1, function(x) {sd(x)}) +rownames(mddExprData_quantileLog2)[sd_values==0] +# filter the data matrix +GxS.covfilter <- mddExprData_quantileLog2[CoV_values<.045 & sd_values>0,] +dim(GxS.covfilter) + + +#### Part C: Differential Expression with t-tests +# convert phenotype +pheno.factor <- as.factor(colnames(GxS.covfilter)) +pheno.factor +str(pheno.factor) +levels(pheno.factor) + +## Run t-tests +myrow <- 2 # first pick a gene row index to test +mygene<-rownames(GxS.covfilter)[myrow] +mygene + +# a. traditional R interface +mdd <- GxS.covfilter[myrow,pheno.factor=="MDD"] +hc <- GxS.covfilter[myrow,pheno.factor=="HC"] +t.result <- t.test(mdd,hc) +t.result + +# b. formula interface ~ saves a step +t.result <- t.test(GxS.covfilter[myrow,] ~ pheno.factor) +t.result +p <- t.result$p.value +t.result$statistic + +## Plot the Data +if (!require("ggplot2")) install.packages("ggplot2") +library(ggplot2) +# create data frame for gene +mygene.data.df <- data.frame(gene=GxS.covfilter[myrow,],phenotype=pheno.factor) +# boxplot +p <- ggplot(mygene.data.df, aes(x=phenotype, y=gene, fill=phenotype)) + + stat_boxplot(geom ='errorbar') + geom_boxplot() +p <- p + xlab("MDD versus HC") + ylab(mygene) +p diff --git a/Schrick-Noah_CS-6643_Lab-4.docx b/Schrick-Noah_CS-6643_Lab-4.docx index 3d88b9c5cb9037d32ed3ab56aceb33f300cc9c60..0c5c630d6e7ea73943c7cfb93413497e6d84d3f4 100644 GIT binary patch delta 24621 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

wM7B81bLYRb<3oB z3p0tf9Yt-M?Na-CE;c3Z`mO3t4T)wC?eg{xXWV)fv#B4dvqSgnSHh9TKjY`55db_* zyq&6R`S?%pT1gJ95-``TR>eF^IYO z-cO^^nVY=~<5x4~y(P|kwV}1r$KBSkw((J7xKq5@_0Hr@ue0X2m-H24*=#s*Becb? zMN0C9C*90yI6c)|%d>juf6}B^ct>Op_0KaKfm26oly>2l+s%nR3oa%_szO(4kbJ_j zpYH7D)Xye4%nCtf`c40~XaMhe-b3iNed*{^L%9e2Ecg2AXP)^d>({qf)bj6q!fxpQ z$U1Np2D`?t3%2{b{Z~-`jDrnl0_u|zr zrAmgGl8DU}y9x4|;K!uNv{g+n?eeg4{zAQ&Oqtb$rmO+&q0gT?Z^}iq6Hx}8X;^*> ztrcu&PkZwnKKx-+^A|2%qzdDDNlBsEbGn)k%fJ@Ha3pe;2>wr40BF}uv09BN?g@#w zK{p<_T|X94=+FA~>yTC_YoyXriId{f=k7Y}wPKl;VK!AR9v`~0j(d=y%MB8#+A(9s z9m6W)wM+__b%w)lc?8Mb(IAO@R=@UMc}v$_pGV2=^CtGWEp0;6C)kb#FoR#--MzQ0K!r*j=vy!t8CgYy9$99Wn+HlC|jZpi|OF`Zv%-0*Bbj$dJ>;( zKmm8|EQYWxp~lK6a~nPNFo0Kj?X@r8JHH|#*k{QF|IQ~@`-{^I zgtFoy`J?@vbBp@7q5%V&1!`H5{8chuRs`T*fk{^6e1vXP}Tlk*C_vh9o%+4!GaeEQ z?4Q#}-~^g|C6W1K>F-I$_=hF6Phem=BKCI9@6$9;^>8qA()(Ay(C^W`^Ksu_o$pj< J2%bOM{{cOMk`w>{