看到群里很多人讨论拟时序分析,使用的包是monocle2,遇到了一个很常见的错误,当然已经有答案了,见技能树的帖子:解决monocle2的orderCells报错。然后我也很久没有做过monocle2,,为了保持跟大家都在一线,我找了个数据来做做看。一翻自己的资料,找到一个使用bulk RNA-seq来做monocle2的文献。来看看~
这篇文献于2021年3月26发表在NPJ Precis Oncol杂志,文献标题为:《Preoperative immune landscape predisposes adverse outcomes in hepatocellular carcinoma patients with liver transplantation》。
对来自韩国HCC队列的124个样本进行了转录组测序,包括62个恶性肿瘤样本、47个癌旁非肿瘤样本和15个正常组织样本(图1a)。大部分肿瘤样本来自早期阶段或低分级,其中约三分之二取自接受全肝切除术的患者。为探究疾病分期之间的关系,我们采用Top1000变异度最大的蛋白质编码基因进行主成分分析(PCA),将样本投射至二维空间(附图1a)。肿瘤样本与非肿瘤样本呈现明显分离,而非肿瘤样本处于中间状态。值得注意的是,不典型增生结节(DN)样本与肿瘤样本聚集分布,而纤维化及肝硬化组织样本则与正常样本邻近(附图1a插图)。鉴于癌旁非肿瘤样本呈现两种明显不同的状态,我们将其进一步分类为低/高级别纤维化与肝硬化(FibCS)组、或低/高级别不典型增生结节(DN)组(图1a外圈)。

图注:
a 组织病理学分期各阶段样本数量的饼图。T1~3/4代表TNM分期系统中的T分期;混合型指肝细胞癌合并肝内胆管癌。
b 使用元数据集中表达量最高的5000个蛋白质编码基因进行t-SNE分析(样本量n=1179)。
c 采用Monocle 2对韩国HCC队列进行的轨迹分析。配色方案与b图一致。轨迹线上的数字表示分支点。肿瘤样本的两条演化路径标注为Tumor 1和Tumor 2。
d 对c图中分支点1处两条演化路径(Tumor 1和Tumor 2)进行的分支表达分析。
e d图中各簇富集的GO术语和KEGG通路。可视化展示了显著性排名前五的术语(错误发现率FDR<0.05)。
文献中的描述如下:
由于PCA与t-SNE图中本研究 HCC样本呈现从各非肿瘤阶段到肿瘤的连续分布,我们运用Monocle 2进行轨迹分析以验证疾病进程中转录组程序的动态转变(图1c)。以正常样本为根状态,非肿瘤样本首先与肿瘤样本分离。这些非肿瘤样本(状态5)在免疫细胞浸润水平方面与根状态(状态1)存在差异(附图1d)。样本进一步分为两个分支,分别以细胞外基质相互作用与炎症反应(Tumor 1)、或代谢通路(Tumor 2)为特征(图1c-e)。基于肿瘤样本按炎症特征呈现二元分化,我们后续对肿瘤微环境展开了深入解析。
PCA与t-SNE图能看样本连续分布类型了吗?
这里还是用了 正常样本为根状态?
疾病进程中转录组程序的动态转变跟拟时序有什么关联吗?
正常样本向肿瘤进展的过程中是线性变化吗?
我反正是一脸懵啊,各位!!!
来都来了,作者连数据和代码都给了,来温习一下:
数据:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE148355
代码:https://github.com/sangho1130/KOR_HCC
rm(list = ls())
# 这个步骤超级耗费时间,拟时序分析在单细胞领域火爆起来的
# 这个项目就一百多个普通转录组样品,跟单细胞动辄成千上万个细胞还是有差距
# 所以个人电脑仍然是可以hold住
library(monocle)
library(plyr)
packageVersion("igraph")
early_state <- function(cds){
if (length(unique(pData(cds)$State)) > 1){
progenitorState <- table(pData(cds)$State, pData(cds)$Grade)[,"Normal"]
return(as.numeric(names(progenitorState)[which (progenitorState == max(progenitorState))]))
} else {
return (1)
}
}
label <- read.delim('../data/monocle_label.txt', sep = '\t', header = TRUE, row.names = 1, check.names = FALSE)
head(label)
expr <- read.delim('../data/monocle_expr.txt', sep = '\t', header = TRUE, row.names = 2, check.names = FALSE)
expr$ID <- NULL
identical(sort(rownames(label)), sort(colnames(expr)))
fd <- data.frame(row.names=rownames(expr), gene_short_name=rownames(expr)); head(fd)
monocleObj <- newCellDataSet(as.matrix(expr),
phenoData = new("AnnotatedDataFrame", data = label),
featureData=new("AnnotatedDataFrame", data = fd),
expressionFamily=negbinomial.size())
# 重点就是构建对象,后续分析全部是使用这个对象
monocleObj
pData(monocleObj)$Grade <- factor(pData(monocleObj)$Grade, levels = c('Normal', 'FibCS', 'DN', 'T1', 'T2', 'T3-4', 'Mixed'))
pData(monocleObj)$site <- factor(pData(monocleObj)$site, levels = c('Normal', 'FibCS', 'DN', 'Tumor'))
pData(monocleObj)$pretx <- factor(pData(monocleObj)$pretx, levels = c('Yes', 'No', 'Not applicable'))
pData(monocleObj)$op <- factor(pData(monocleObj)$op, levels = c('Total_hepatectomy', 'Partial_hepatectomy', 'Not applicable'))
head(pData(monocleObj))
monocleObj <- estimateSizeFactors(monocleObj)
monocleObj <- estimateDispersions(monocleObj)
monocleObj <- detectGenes(monocleObj, min_expr = 1)
head(fData(monocleObj))
expressed_genes <- row.names(subset(fData(monocleObj), num_cells_expressed >= 10))
length(expressed_genes) # 17814 genes
disp_table <- dispersionTable(monocleObj);
rownames(disp_table) <- disp_table$gene_id
### Dispersion genes ###
monocleObj_ordering_genes <- subset(disp_table, mean_expression >= 10 & dispersion_empirical >= 2 * dispersion_fit)$gene_id; length(monocleObj_ordering_genes) # 2127
disp_table$cols <- 'no'; disp_table[as.character(monocleObj_ordering_genes), 'cols'] <- 'in use'
ggplot(disp_table, aes(log10(mean_expression+1), dispersion_empirical, col = cols)) +
geom_point() +
scale_color_manual(values = c('red2', 'grey80'))
monocleObj <- setOrderingFilter(monocleObj, ordering_genes = monocleObj_ordering_genes)
monocleObj <- reduceDimension(monocleObj, method = 'DDRTree')
monocleObj <- orderCells(monocleObj)
monocleObj <- orderCells(monocleObj, root_state = early_state(monocleObj))
head(pData(monocleObj))
plot_cell_trajectory(monocleObj, color_by = 'site') +
scale_color_manual(values = c('Normal'='#bdc1c8', 'FibCS'='#67814f', 'DN'='#f2ae2e', 'Tumor'='#e65251'))
ggsave('../results/disp.site.orig.pdf', units = 'cm', width = 9, height = 10)

就是原版的monocle2用来做单细胞数据分析的拟时序代码。
这对吗,各位?
看一下 monocle2适用条件是什么?(我翻了一遍官网,没有找到什么证据,基本上都是提到的单细胞组学数据)。
下面是deepseek的回答: