title: “DESeq2 clustering heatmap script” output: html_notebook
library(vegan)
library(pheatmap)
clustering_heatmap <- function(dds, res, pgenes, outpath, treatment, control) {
print("loding the human protein coding genes...")
pgenes <- read.csv(pgenes)
deseq_result <- res
deseq_result <- as.data.frame(deseq_result)
deseq_result <- deseq_result[rownames(deseq_result) %in% pgenes[[1]],]
deseq_result <- na.omit(deseq_result)
#get the normalized count matrix
cdata <- as.data.frame(counts(dds, normalized = TRUE))
cdata <- cdata[rownames(cdata) %in% rownames(deseq_result),]
#cluster the sample based on phenotype
coldata <- as.data.frame(colData(dds))
coldata <- coldata[order(coldata$Condition, decreasing = TRUE),]
cdata <- cdata[rownames(coldata)]
print("Calculating the expression density...")
div <- diversity(cdata, index = "invsimpson")
cdata <- cbind(cdata, div)
deseq_result <- merge(deseq_result, cdata[c("div")], by = 0, all = FALSE)
#calculate the median of diversity for up-regulated genes and down-regulated genes
up_div <- median(deseq_result[deseq_result$log2FoldChange > 0 & deseq_result$pvalue <= 0.05,]$div)
down_div <- median(deseq_result[deseq_result$log2FoldChange < 0 & deseq_result$pvalue <= 0.05,]$div)
#rank the genes
deseq_result <-deseq_result[order(as.numeric(deseq_result[,"stat"])),]
down_50 <- deseq_result[deseq_result$div > down_div,]$Row.names[1:50]
up_50 <- tail(deseq_result[deseq_result$div > up_div,], 50)$Row.names
df <- cdata[c(down_50, up_50),]
#df <- df[rownames(coldata)]
df <- df[-ncol(df)]
#calculate the z-score across the samples
a <- t(scale(t(df)))
pdf(paste0(outpath,'heatmap_',treatment,'_vs_',control,'.pdf'), width = 5, height = 20)
pheatmap(a, cluster_cols = FALSE, cluster_rows = TRUE, annotation = coldata["Condition"])
dev.off()
}
LS0tCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAotLS0KCnRpdGxlOiAiREVTZXEyIGNsdXN0ZXJpbmcgaGVhdG1hcCBzY3JpcHQiCm91dHB1dDogaHRtbF9ub3RlYm9vawoKYGBge3J9CmxpYnJhcnkodmVnYW4pCmxpYnJhcnkocGhlYXRtYXApCgpjbHVzdGVyaW5nX2hlYXRtYXAgPC0gZnVuY3Rpb24oZGRzLCByZXMsIHBnZW5lcywgb3V0cGF0aCwgdHJlYXRtZW50LCBjb250cm9sKSB7CiAgCiAgcHJpbnQoImxvZGluZyB0aGUgaHVtYW4gcHJvdGVpbiBjb2RpbmcgZ2VuZXMuLi4iKQogIHBnZW5lcyA8LSByZWFkLmNzdihwZ2VuZXMpCQogIGRlc2VxX3Jlc3VsdCA8LSByZXMKICBkZXNlcV9yZXN1bHQgPC0gYXMuZGF0YS5mcmFtZShkZXNlcV9yZXN1bHQpCiAgCiAgZGVzZXFfcmVzdWx0IDwtIGRlc2VxX3Jlc3VsdFtyb3duYW1lcyhkZXNlcV9yZXN1bHQpICVpbiUgcGdlbmVzW1sxXV0sXQogIGRlc2VxX3Jlc3VsdCA8LSBuYS5vbWl0KGRlc2VxX3Jlc3VsdCkKICAKICAjZ2V0IHRoZSBub3JtYWxpemVkIGNvdW50IG1hdHJpeCAKICBjZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGNvdW50cyhkZHMsIG5vcm1hbGl6ZWQgPSBUUlVFKSkKICBjZGF0YSA8LSBjZGF0YVtyb3duYW1lcyhjZGF0YSkgJWluJSByb3duYW1lcyhkZXNlcV9yZXN1bHQpLF0KICAKICAjY2x1c3RlciB0aGUgc2FtcGxlIGJhc2VkIG9uIHBoZW5vdHlwZSAKICBjb2xkYXRhIDwtIGFzLmRhdGEuZnJhbWUoY29sRGF0YShkZHMpKQogIGNvbGRhdGEgPC0gY29sZGF0YVtvcmRlcihjb2xkYXRhJENvbmRpdGlvbiwgZGVjcmVhc2luZyA9IFRSVUUpLF0KICAKICBjZGF0YSA8LSBjZGF0YVtyb3duYW1lcyhjb2xkYXRhKV0KICAKICBwcmludCgiQ2FsY3VsYXRpbmcgdGhlIGV4cHJlc3Npb24gZGVuc2l0eS4uLiIpCiAgZGl2IDwtIGRpdmVyc2l0eShjZGF0YSwgaW5kZXggPSAiaW52c2ltcHNvbiIpCiAgCiAgY2RhdGEgPC0gY2JpbmQoY2RhdGEsIGRpdikKICAKICBkZXNlcV9yZXN1bHQgPC0gbWVyZ2UoZGVzZXFfcmVzdWx0LCBjZGF0YVtjKCJkaXYiKV0sIGJ5ID0gMCwgYWxsID0gRkFMU0UpCiAgCiAgI2NhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIGRpdmVyc2l0eSBmb3IgdXAtcmVndWxhdGVkIGdlbmVzIGFuZCBkb3duLXJlZ3VsYXRlZCBnZW5lcwogIHVwX2RpdiA8LSBtZWRpYW4oZGVzZXFfcmVzdWx0W2Rlc2VxX3Jlc3VsdCRsb2cyRm9sZENoYW5nZSA+IDAgJiBkZXNlcV9yZXN1bHQkcHZhbHVlIDw9IDAuMDUsXSRkaXYpCiAgZG93bl9kaXYgPC0gbWVkaWFuKGRlc2VxX3Jlc3VsdFtkZXNlcV9yZXN1bHQkbG9nMkZvbGRDaGFuZ2UgPCAwICYgZGVzZXFfcmVzdWx0JHB2YWx1ZSA8PSAwLjA1LF0kZGl2KQogIAogICNyYW5rIHRoZSBnZW5lcwogIGRlc2VxX3Jlc3VsdCA8LWRlc2VxX3Jlc3VsdFtvcmRlcihhcy5udW1lcmljKGRlc2VxX3Jlc3VsdFssInN0YXQiXSkpLF0KICAKICBkb3duXzUwIDwtIGRlc2VxX3Jlc3VsdFtkZXNlcV9yZXN1bHQkZGl2ID4gZG93bl9kaXYsXSRSb3cubmFtZXNbMTo1MF0KICB1cF81MCA8LSB0YWlsKGRlc2VxX3Jlc3VsdFtkZXNlcV9yZXN1bHQkZGl2ID4gdXBfZGl2LF0sIDUwKSRSb3cubmFtZXMKICAKICAKICBkZiA8LSBjZGF0YVtjKGRvd25fNTAsIHVwXzUwKSxdCiAgI2RmIDwtIGRmW3Jvd25hbWVzKGNvbGRhdGEpXQogIAogIGRmIDwtIGRmWy1uY29sKGRmKV0KICAjY2FsY3VsYXRlIHRoZSB6LXNjb3JlIGFjcm9zcyB0aGUgc2FtcGxlcyAKICBhIDwtIHQoc2NhbGUodChkZikpKQogIAogIHBkZihwYXN0ZTAob3V0cGF0aCwnaGVhdG1hcF8nLHRyZWF0bWVudCwnX3ZzXycsY29udHJvbCwnLnBkZicpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDIwKQogIHBoZWF0bWFwKGEsIGNsdXN0ZXJfY29scyA9IEZBTFNFLCBjbHVzdGVyX3Jvd3MgPSBUUlVFLCBhbm5vdGF0aW9uID0gY29sZGF0YVsiQ29uZGl0aW9uIl0pCiAgZGV2Lm9mZigpCn0KYGBgCgo=