这段代码处理RNA-Seq数据,主要包括质量控制(QC)结果的读取、数据过滤、样本筛选、数据转换、聚类分析和降维(t-SNE)可视化。我们可以将代码分为几个部分进行讲解。
第一部分:创建工作目录并读取相关数据
yid = 'ca19a5'
dirw = file.path(dird, '11_qc', yid)
if(!dir.exists(dirw)) system(sprintf("mkdir -p %s", dirw))
- 设置
yid为'ca19a5',这是该分析的样本标识符。 - 创建并检查工作目录路径
dirw,如果目录不存在,则使用system(sprintf("mkdir -p %s", dirw))创建它。
第二部分:读取样本信息并过滤
ref = t_cfg %>% filter(yid == !!yid) %>% pull(ref)
th = rnaseq_sample_meta(yid)
tt = rnaseq_mapping_stat(yid)
res = rnaseq_cpm_raw(yid)
th = res$th; tm = res$tm; tl = res$tl; th_m = res$th_m; tm_m = res$tm_m
sum_stat_tibble(tt)
- 从
t_cfg配置文件中根据yid筛选对应的参考信息。 - 使用
rnaseq_sample_meta()函数读取样本的元数据th。 - 使用
rnaseq_mapping_stat()函数读取RNA-Seq映射统计信息tt。 - 使用
rnaseq_cpm_raw()函数读取RNA-Seq的原始CPM数据(每百万映射读数)并赋值给多个变量(如th,tm,tl等)。 sum_stat_tibble(tt)计算并显示映射统计数据的摘要。
第三部分:筛选满足条件的样本
sids_keep = tt %>% filter(mapped > 3) %>% pull(SampleID)
sum_stat_tibble(tt %>% filter(SampleID %in% sids_keep))
- 从映射统计数据
tt中筛选出已映射的读数大于3的样本,存储其样本ID(SampleID)在sids_keep中。 - 输出这些筛选后样本的映射统计信息。
第四部分:修正和保存样本元数据
th2 = th %>% filter(SampleID %in% sids_keep)
th = th2
tt = tt %>% filter(SampleID %in% th$SampleID)
fh = file.path(dirw, 'meta.tsv')
write_tsv(th, fh, na='')
- 根据筛选出的样本ID,更新
th(样本元数据)。 - 根据修正后的
th,更新tt(映射统计数据)。 - 将更新后的样本元数据保存为
meta.tsv文件。
第五部分:计算和添加标签列
res = rnaseq_cpm(yid)
th = res$th; tm = res$tm; tl = res$tl; th_m = res$th_m; tm_m = res$tm_m
th = th %>% mutate(lab = str_c(Tissue, Genotype, sep='_'))
- 调用
rnaseq_cpm(yid)函数重新计算CPM数据,并将其分配给th,tm,tl等变量。 - 在
th数据框中,创建一个新的列lab,将Tissue和Genotype列的值合并为一个字符串,作为标签。
第六部分:聚类分析 (Hierarchical Clustering)
tw = tm %>% select(SampleID, gid, CPM) %>% mutate(CPM=asinh(CPM)) %>% spread(SampleID, CPM)
t_exp = tm %>% group_by(gid) %>% summarise(n.exp = sum(CPM >= 1))
gids = t_exp %>% filter(n.exp >= (ncol(tw)-1) * .7) %>% pull(gid)
e = tw %>% filter(gid %in% gids) %>% select(-gid)
dim(e)cor_opt = "pearson"
cor_opt = "spearman"
hc_opt = "ward.D"
hc_title = sprintf("dist: %s\nhclust: %s", cor_opt, hc_opt)
edist <- as.dist(1 - cor(e, method = cor_opt))
ehc <- hclust(edist, method = hc_opt)
tree = as.phylo(ehc)
lnames = ehc$labels[ehc$order]
说明:
-
数据准备:
tw:选取样本ID(SampleID)、基因ID(gid)和对应的CPM值,并将CPM值应用反双曲线函数(asinh())进行转换。spread()将数据转化为宽格式,其中每列代表一个样本。
-
过滤低表达基因:
t_exp:按照基因ID(gid)分组,计算每个基因表达的样本数量(n.exp),即哪些样本中该基因的CPM值大于等于1。gids:选取那些在至少70%样本中有表达(n.exp >= (ncol(tw) - 1) * .7)的基因。
-
计算相关性矩阵:
e:从数据中筛选出表达良好的基因(gids)。移除gid列后,e只包含CPM值。cor_opt:定义了相关性计算的方法,可以选择"pearson"或"spearman",这两种方法分别用于计算皮尔逊相关系数和斯皮尔曼等级相关系数。edist:计算基于选定相关性方法(cor_opt)的距离矩阵。as.dist(1 - cor(...))计算相关系数的距离(1减去相关系数)。
-
层次聚类:
ehc:使用hclust()函数进行层次聚类,ward.D方法是最常见的聚类算法之一,用于最小化类内方差。tree:通过as.phylo()将层次聚类结果转换为树形结构(phylogenetic tree)。
总结:
这一部分的代码进行了聚类分析,首先通过计算基因的表达情况,筛选出在大多数样本中有表达的基因。然后,使用相关性矩阵计算基因之间的相关性,并通过层次聚类方法生成基因表达的树状图。
第七部分:绘制聚类树
tp = th %>% mutate(taxa = SampleID) %>%select(taxa, everything())
p1 = ggtree(tree, layout = 'rectangular') +scale_x_continuous(expand = expand_scale(0, .2)) +scale_y_discrete(expand = c(.01, 0))
p1 = p1 %<+% tp + geom_tiplab(aes(label = lab, color = Tissue), size = 2.5) +scale_color_aaas()
fo = sprintf("%s/21.cpm.hclust.pdf", dirw)
ggsave(p1, filename = fo, width = 6, height = 6)
说明:
-
准备样本标签:
tp:在样本数据框th中新增一个taxa列,值为SampleID,然后选择相关列。
-
绘制树形图:
- 使用
ggtree()绘制层次聚类结果的树形图,layout = 'rectangular'设置树形图的布局为矩形。 - 调整X轴和Y轴的显示范围和扩展。
- 使用
geom_tiplab()添加样本标签,其中aes(label = lab, color = Tissue)将样本标签设置为lab列,并根据Tissue列的值进行颜色编码。
- 使用
-
保存图形:
- 将聚类树保存为PDF文件,文件名为
21.cpm.hclust.pdf,保存路径为工作目录。
- 将聚类树保存为PDF文件,文件名为
小结:
这一部分代码实现了层次聚类分析,主要通过计算基因之间的相关性来进行聚类,并通过 ggtree 绘制树形图,显示样本的聚类情况。
好的,我们继续分析最后一部分代码:tSNE分析。
第八部分:tSNE分析
require(Rtsne)
tw = tm %>% select(SampleID, gid, CPM) %>% mutate(CPM = asinh(CPM)) %>% spread(SampleID, CPM)
t_exp = tm %>% group_by(gid) %>% summarise(n.exp = sum(CPM >= 1))
gids = t_exp %>% filter(n.exp >= (ncol(tw) - 1) * .7) %>% pull(gid)
tt = tw %>% filter(gid %in% gids)
dim(tt)
tsne <- Rtsne(t(as.matrix(tt[-1])), dims = 2, verbose = T, perplexity = 1,pca = T, max_iter = 500)tp = as_tibble(tsne$Y) %>%add_column(SampleID = colnames(tt)[-1]) %>%inner_join(th, by = 'SampleID')
x.max = max(tp$V1)
p_tsne = ggplot(tp, aes(x = V1, y = V2)) +geom_text_repel(aes(x = V1, y = V2, label = lab), size = 2.5) +geom_point(aes(color = Tissue, shape = Tissue), size = 2) +scale_x_continuous(name = 'tSNE-1') +scale_y_continuous(name = 'tSNE-2') +scale_shape_manual(values = c(0:6)) +scale_color_aaas() +otheme(legend.pos = 'top.left', legend.dir = 'v', legend.title = T,xtitle = T, ytitle = T,margin = c(.2, .2, .2, .2)) +theme(axis.ticks.length = unit(0, 'lines')) +guides(fill = F)
fp = file.path(dirw, "25.tsne.pdf")
ggsave(p_tsne, filename = fp, width = 6, height = 6)
说明:
-
数据准备:
tw:与聚类分析类似,首先筛选出样本ID (SampleID)、基因ID (gid) 和对应的CPM值。然后对CPM值进行反双曲线变换(asinh()),并将数据转换为宽格式,每个样本一列。t_exp:与聚类分析一样,计算每个基因的表达情况,筛选出在至少70%样本中表达的基因。gids:选取那些在大多数样本中有表达的基因。tt:从数据中筛选出在大多数样本中有表达的基因,保留它们的CPM值。
-
tSNE降维:
- 使用
Rtsne包对数据进行tSNE降维,tSNE()函数的主要参数包括:dims = 2:表示将数据降至二维空间。verbose = T:在运行时显示详细信息。perplexity = 1:设置困惑度(Perplexity)值,用于控制tSNE算法的表现,通常选择20-50之间的值,这里设置为1,可能是为了实验或特定数据。pca = T:表示在tSNE计算前先进行PCA降维。max_iter = 500:设置最大迭代次数为500次,确保算法收敛。
- 使用
-
结果合并和可视化:
-
tp:将tSNE结果(tsne$Y)转换为数据框,并将样本ID添加到结果中。同时,使用inner_join()将样本元数据(th)与tSNE结果按样本ID合并。 -
绘制tSNE图:
ggplot()创建tSNE的散点图,aes(x = V1, y = V2)表示tSNE的第一维和第二维分别对应V1和V2。geom_text_repel()为每个点添加标签,geom_point()绘制样本的散点。- 通过
scale_color_aaas()为不同的组织(Tissue)赋予不同的颜色,scale_shape_manual()控制不同的形状。 - 使用
othem()设置图形的样式和位置,theme()调整轴的显示方式。
-
-
保存结果:
- 将绘制的tSNE图保存为PDF文件,命名为
25.tsne.pdf,存储路径为dirw目录。
- 将绘制的tSNE图保存为PDF文件,命名为
总结:
tSNE分析是一个常用的非线性降维方法,能够将高维数据映射到低维空间(通常是二维或三维),以便更直观地观察样本之间的关系。这里通过tSNE算法对基因表达数据进行了降维处理,并根据样本的组织类型(Tissue)对结果进行了可视化。
总结:
通过上述分析,我们逐步解析了这个R代码的不同部分。主要包括:
- 数据准备与过滤。
- 层次聚类(HClust)分析与树形图可视化。
- tSNE降维分析与散点图可视化。
每一部分都有其独立的功能,整体工作流程旨在分析和可视化基因表达数据,以便深入理解样本之间的差异性。
如果你对任何部分有进一步的疑问,或者希望继续分析其他内容,请告诉我!
