====== MDS分析 ====== 多维尺度分析(Multidimensional scaling, 简称MDS)是根据具有很多维度的样本或变量之间的相似性(距离近)或非相似性(距离远,即通过计算其距离)来对其进行分类的一种统计学研究方法。是一种降维分析法。 MDS分析的目标是将对象间的差异(或相似性)通过图形展示出来,图中两点的距离表示对象差异,距离越远表示两个对象差异越大,距离越近表示两个对象差异越小。空间图的坐标不一定有实际意义。 ===== 代码 ===== #!/TJPROJ6/RNA_SH/personal_dir/lizhengnan/mamba/envs/R_4.2/bin/R suppressMessages({ library(ggplot2) library(stats) library(argparser)}) argv <- arg_parser('') argv <- add_argument(argv,"--fpkm", help="") argv <- add_argument(argv,"--prefix", help="") argv <- parse_args(argv) fpkm_file = argv$fpkm prefix = argv$prefix # 读入fpkm数据 fpkm <- read.table(fpkm_file, sep = '\t', header = T, row.names = 1, quote = '') if ('gene_name' %in% colnames(fpkm)){ gene_name_index <- which(colnames(fpkm)=='gene_name') data <- fpkm[,1:gene_name_index-1] }else{ data <- fpkm } # 计算距离矩阵, 计算距离有多种方法,此处使用评估文献中的方法:表达变化倍数的均方根 dist <- matrix(0, nrow = ncol(data), ncol = ncol(data)) # 创建一个空的对数折叠变化矩阵 rownames(dist) <- colnames(data) colnames(dist) <- colnames(data) for (i in 1:(ncol(data) - 1)) { for (j in (i + 1):ncol(data)) { tmp_df <- data[,c(i,j)] tmp_df$fc <- tmp_df[,2]/tmp_df[,1] res <- sqrt(mean(tmp_df$fc[!is.na(tmp_df$fc) & !is.infinite(tmp_df$fc)],na.rm = T)) dist[i, j] <- res dist[j, i] <- res # 对角线对称 } } # 应用多维尺度分析 mds_res <- cmdscale(dist,k=2) mds_res <- as.data.frame(mds_res) colnames(mds_res) <- c('MDS1','MDS2') mds_res$sample <- rownames(mds_res) # 结果可视化 P <- ggplot(mds_res, aes(x = MDS1, y = MDS2, color=sample)) + geom_point(size=5) + labs(x = "Leading log(FC): Dimension 1", y = "Leading log(FC): Dimension 2")+ theme_test() pdf(file=paste(prefix, '_mds.pdf',sep='')) P dev.off() svg(filename=paste(prefix, '_mds.svg',sep='')) P dev.off() ggsave(file=paste(prefix, '_mds.png',sep=''),type='cairo-png',plot=P)