本文首發(fā)于“生信大碗”公眾號,轉(zhuǎn)載請注明出處
上期推文我們介紹了一種線性數(shù)據(jù)降維的方法——主成分分析PCA,今天我們再來介紹一種非線性的算法——t-SNE。
t-SNE(t-distributed Stochastic Neighbor Embedding),中文全稱t分布-隨機鄰近嵌入,其原理比較復雜,這里不多做講解,感興趣的小伙伴可以自行百度。
數(shù)據(jù)降維方法有很多,t-SNE算法的優(yōu)勢在哪里呢?t-SNE算法有效地解決了降維后的擁擠問題,也就是說,經(jīng)t-SNE算法降維后,相似的數(shù)據(jù)相互靠近,而差異較大的數(shù)據(jù)則互相遠離。但有利就有弊,t-SNE算法的缺點是運行所占內(nèi)存大,所需時間長。具體選擇哪種方法小伙伴們可以自行權(quán)衡。
話不多說,接下來我們開始實操。
1.安裝并加載Rtsne包

2.加載示例數(shù)據(jù)
下載TCGA肺腺癌數(shù)據(jù)集并對正常組和腫瘤組進行差異分析,選取差異最顯著的前十個基因的表達數(shù)據(jù)作為示例數(shù)據(jù),注意行是樣本,列是基因

3.獲取樣本的分組信息

4.?進行t-SNE降維

①?t-SNE結(jié)果隨機,進行分析之前需設(shè)置隨機數(shù)種子是結(jié)果具有可重復性
②?Rtsne()函數(shù)各參數(shù)的意義如下:
dims = 2, 正整數(shù),表示降維后的數(shù)據(jù)緯度——將數(shù)據(jù)降到幾維?
pca = TRUE/FALSE,表示在進行t-SNE前是否進行主成分分析PCA。
max_iter = 1000,表示迭代次數(shù),默認為1000。
theta = 0.5,是速度/精度權(quán)衡,范圍在0~1之間,數(shù)值越小越精確,默認0.5。該參數(shù)影響最終結(jié)果,可根據(jù)可視化結(jié)果進行調(diào)整。
perplexity = 20,困惑度:正整數(shù),且需滿足?3*perplexity < nrow(data) - 1?,可以簡單理解為每個數(shù)據(jù)點的近鄰數(shù)據(jù)點的可能數(shù)目,是用于計算數(shù)據(jù)點相似度的參數(shù),是數(shù)據(jù)局部/全局權(quán)衡,影響可視化結(jié)果,參數(shù)越小,樣本越獨立,參數(shù)越大,樣本越趨向于形成一個整體。
check_duplicates = FALSE,檢查是否存在重復項。最好確保在進行t-SNE之前數(shù)據(jù)不存在重復項,并將此選項設(shè)置為FALSE。
③?輸出結(jié)果是一個列表,其中元素Y就是降維結(jié)果??梢钥吹皆瓉?0個基因的表達數(shù)據(jù)(10維數(shù)據(jù)),已經(jīng)降為二維數(shù)據(jù)。
5.?降維結(jié)果可視化


t-SNE算法數(shù)據(jù)降維與可視化完整代碼如下:
# 安裝并加載Rtsne包
install.packages("Rtsne")
library(Rtsne)
# 加載示例數(shù)據(jù)
load("前十個差異基因表達矩陣.rdata")
data[1:6,1:6]
# 樣本分組
sample <- data.frame(id=rownames(data))
?# TCGA樣本命名方式,倒數(shù)二三位數(shù)字是11的為正常組,01的為腫瘤組
sample$group <- ifelse(substr(sample$id,14,15)==11,"normal","tumor")
sample[1:6,]
group <- sample$group
group[1:6]
# t-SNE降維
?#設(shè)置隨機數(shù)種子
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)
# 降維結(jié)果可視化
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()
本文首發(fā)于“生信大碗”公眾號,轉(zhuǎn)載請注明出處
—END—