本文首发于“生信大碗”公众号,转载请注明出处
上期推文我们介绍了一种线性数据降维的方法——主成分分析PCA,今天我们再来介绍一种非线性的算法——t-SNE。
t-SNE(t-distributed Stochastic Neighbor Embedding),中文全称t分布-随机邻近嵌入,其原理比较复杂,这里不多做讲解,感兴趣的小伙伴可以自行百度。
数据降维方法有很多,t-SNE算法的优势在哪里呢?t-SNE算法有效地解决了降维后的拥挤问题,也就是说,经t-SNE算法降维后,相似的数据相互靠近,而差异较大的数据则互相远离。但有利就有弊,t-SNE算法的缺点是运行所占内存大,所需时间长。具体选择哪种方法小伙伴们可以自行权衡。
话不多说,接下来我们开始实操。
1.安装并加载Rtsne包
2.加载示例数据
下载TCGA肺腺癌数据集并对正常组和肿瘤组进行差异分析,选取差异最显著的前十个基因的表达数据作为示例数据,注意行是样本,列是基因
3.获取样本的分组信息
4. 进行t-SNE降维
① t-SNE结果随机,进行分析之前需设置随机数种子是结果具有可重复性
② Rtsne()函数各参数的意义如下:
dims = 2, 正整数,表示降维后的数据纬度——将数据降到几维?
pca = TRUE/FALSE,表示在进行t-SNE前是否进行主成分分析PCA。
max_iter = 1000,表示迭代次数,默认为1000。
theta = 0.5,是速度/精度权衡,范围在0~1之间,数值越小越精确,默认0.5。该参数影响最终结果,可根据可视化结果进行调整。
perplexity = 20,困惑度:正整数,且需满足 3*perplexity < nrow(data) - 1 ,可以简单理解为每个数据点的近邻数据点的可能数目,是用于计算数据点相似度的参数,是数据局部/全局权衡,影响可视化结果,参数越小,样本越独立,参数越大,样本越趋向于形成一个整体。
check_duplicates = FALSE,检查是否存在重复项。最好确保在进行t-SNE之前数据不存在重复项,并将此选项设置为FALSE。
③ 输出结果是一个列表,其中元素Y就是降维结果。可以看到原来10个基因的表达数据(10维数据),已经降为二维数据。
5. 降维结果可视化
t-SNE算法数据降维与可视化完整代码如下:
# 安装并加载Rtsne包
install.packages("Rtsne")
library(Rtsne)
# 加载示例数据
load("前十个差异基因表达矩阵.rdata")
data[1:6,1:6]
# 样本分组
sample <- data.frame(id=rownames(data))
# TCGA样本命名方式,倒数二三位数字是11的为正常组,01的为肿瘤组
sample$group <- ifelse(substr(sample$id,14,15)==11,"normal","tumor")
sample[1:6,]
group <- sample$group
group[1:6]
# t-SNE降维
#设置随机数种子
set.seed(1)
#进行t-SNE
tsne_out = Rtsne(
data,
dims =2,
pca =TRUE,
max_iter = 1000,
theta =0.4,
perplexity = 20,
check_duplicates = FALSE,
verbose= F)
str(tsne_out)
# 降维结果可视化
library(ggplot2)
tsne_result = as.data.frame(tsne_out$Y)
colnames(tsne_result) =c("tSNE1","tSNE2")
ggplot(tsne_result,aes(tSNE1,tSNE2,color=group))+
geom_point()
本文首发于“生信大碗”公众号,转载请注明出处
—END—