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)