这篇短文将涵盖一个典型路径分析中涉及的广泛的分析和可视化技术。的概述部分将详细介绍细节,但请注意,这个小插图是模块化设计的,并经过仔细考虑。请不要简单地运行整个脚本,并期望从最终输出中得到任何有意义的东西。这是一个教学设备,理想的指导研讨会。

1安装

首先,确保你有rWikiPathways安装…

如果(!“rWikiPathways”%in% installed.packages()){if (!requireNamespace("BiocManager", quiet = TRUE)) install.packages("BiocManager") BiocManager::install("rWikiPathways", update = FALSE)} library(rWikiPathways)

在这个小插图中,我们将使用一组不同的R包。下一个块应该处理我们需要的所有R包的安装和加载。最后打印的一行将说明它是否成功。好运!

与大多数安装一样,可能会提示您进行响应。对于这个小插曲,你可以回复'一个'更新所有旧包(如果提示)和'没有'以跳过从源代码编译(如果设置为选项)。在继续操作之前,请验证最后打印的“success”信息。

负载。libs <- c("DOSE", "GO.db", "GSEABase", "org.Hs.eg.db", "clusterProfiler", "dplyr", "tidyr", "ggplot2", "stringr", "RColorBrewer", "rWikiPathways", "RCy3") options(install.packages.check. c)Source = "no") options(install.packages.compile.from. Source = "never") if (!require("pacman")) install.packages("pacman");图书馆(小精灵)p_load(负载。libs,更新= TRUE,字符。only = TRUE) status <- sapply(load.libs,require,character. libs)only = TRUE) if(all(status)){print("SUCCESS: You have successfully installed and load all required libraries.")} else{cat("ERROR:一个或多个库无法正确安装。检查以下列表中的错误情况并重试…\n\n")

RCy3包是用来连接的Cytoscape.因此,您还需要安装并启动Cytoscape:

cytoscapePing() #这将告诉您是否能够成功连接到Cytoscape

对于这个小插图,你还需要一对应用程序Cytoscape。随着Cytoscape的运行,您可以从Cytoscape应用程序商店安装每一个,只需单击一次:

如果您正在运行Cytoscape 3.7.0或更高版本,您可以简单地运行这些命令:

installApp('WikiPathways') installApp('CyTargetLinker') installApp('stringApp') installApp('浓缩铀地图')

2概述

在这个小插图中,我们将对差异基因表达数据集进行功能富集分析。该数据集比较了肺癌活组织检查与正常组织中的转录本表达。已经进行了差异表达分析,为每个基因生成log2foldchange和p值。富集分析将根据基因本体进行,作为对最常见类型的富集的介绍,通常被称为去分析.这将作为针对通路数据库进行更高级富集分析的基础路径分析

使用路径提供了独特的分析和可视化选项。我们将查询WikiPathways的相关内容,并将通路模型导入到Cytoscape中。在Cytoscape中,我们将执行数据叠加,添加药物相互作用并生成高质量的图像以供发表。

3.数据集

这个肺癌数据集的格式对于任何研究过差异基因表达结果的人来说都应该很熟悉。它包含基因标识符(Ensembl id)、基因符号、log2foldchange值、p值和调整后的p值。

肺。expr <- read.csv(system.file("extdata","data-lung-cancer.csv", package="rWikiPathways"),stringsAsFactors = FALSE) nrow(lung.expr) head(lung.expr)

现在让我们用一些传统的标准来准备上调和下调的基因列表。

向上基因<- lung.expr[lung. expr]expr$log2FC > 1 & lung.expr$adj.P。值< 0.05,1]dn。基因<- lung.expr[lung. expr]expr$log2FC < -1 & lung.expr$adj.P。值< 0.05,1]bkgd。基因<- lung.expr[,1]

4浓缩

有了我们的基因集,我们就可以进行富集分析了……嗯,差不多了。在任何生物信息学分析中,我们都需要知道我们正在处理哪些基因标识符。我们有Ensembl id,但我们要使用的包需要Entrez id。幸运的是,该包提供了自己的名为bitr.这是第一个函数clusterProfiler我们将使用的包:

up.genes.entrez <- clusterProfiler::bitr(up. genes.entrez)基因,fromType = "ENSEMBL",toType = "ENTREZID",OrgDb = org. hs . exe .db) cat("\n\n哪一列包含我的新Entrez id ?\n") head(up.genes.entrez)

注意,转换很少是100%完成的(例如,由于一对多映射),因此该工具报告它转换失败的内容。现在我们有了一个数据框架,其中有一个新的Entrez id列,与我们原始的Ensembl id列表配对。

下面是这个特定工具可以转换的标识符的完整列表。你必须准确地拼写这些字母,所有的字母都要大写bitr工作功能:

keytypes (org.Hs.eg.db)

让我们将其他列表转换为Entrez id:

dn.genes.entrez <- bitr(dn. genes.entrez)基因,fromType = "ENTREZID", toType = "ENTREZID",OrgDb = org. hs . gg .db) bkgd.genes.entrez <- bitr(bkgd. gene .entrez)基因,fromType = "ENTREZID", toType = "ENTREZID",OrgDb = org. hs . exe .db)

4.1基因本体论

好的。现在我们准备进行富集分析。让我们从基因本体开始。注意:这可能需要一分钟的时间来运行…因为有太多的GO术语!

egobp <- clusterProfiler:: enrichment go (gene = up.genes。Entrez [[2]], universe = bkgd.genes。entrez[[2]], OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "fdr", pvalueCutoff = 0.05, #p。一个djust cutoff (https://github.com/GuangchuangYu/clusterProfiler/issues/104) readable = TRUE) head(egobp,10)

在运行时,您可以检查参数及其含义……

这是完成了!格式和结果有意义吗?你明白这两个吗列?排名靠前的结果在生物学上有意义吗?

表格很好,但我们在R中是为了看图表。方便,clusterProfiler提供各种默认设置的图:

barplot(egobp, showCategory = 20) goplot(egobp, showCategory = 20)

请查看clusterProfiler装饰图案用于其他支持的函数和图。

为了进行更多的控制和定制,下面是一个使用ggplot是一样的enrichGO对象输出clusterProfiler...

ggplot(egobp[1:20], aes(x=reorder(Description, -pvalue), y=Count, fill=-p.adjust)) + geom_bar(stat =" identity") + coord_flip() + scale_fill_continuous(low="blue", high="red") + labs(x ="blue", y= "", fill= "p.adjust") + theme(axis.text=element_text(size=11)))

使用str (egobp)以更详细地探索数据结构,了解可以在绘图中使用什么。

以下4.4.1EnrichmentMap

我们可以使用Cytoscape中的浓缩铀地图应用程序,用返回的clusterProfiler结果创建一个浓缩地图。富集图是一种不同的网络。节点不是代表基因,而是代表路径或功能。这些通路或功能之间的边代表共享的基因或通路串扰。充实图是一种可视化充实结果的方法,可以帮助减少冗余并揭示主题。

来自clusterProfiler的数据需要格式化,以便与浓缩铀地图一起使用。注意,这会在您的工作目录中生成一个浓缩铀地图输入文件,该文件默认位于您运行这个Rmd的同一目录。

##从类型为result egobp.results.df的对象中提取一个包含结果的数据帧,该数据帧<- egobp@result ##从BgRatio egobp.results.df$term中创建一个新的列。size <- gsub("/(\\d+)", "", egobp.results.df$BgRatio) ##过滤条件大小只保留条件。Size => 3,基因计数>= 5,子集egobp.results.df <- egobp.results.df[which(egobp.results.df[,'term。Size '] >= 3 & egobp.results。df[,'Count'] >= 5),] egobp.results.df <- egobp.results.df。df[c("ID", "Description", "pvalue", "qvalue", "geneID")] ##格式化基因列表列egobp.results. df[c("ID", "Description", "pvalue", "qvalue", "geneID")]df$geneID <- gsub("/", ",", egobp.results.df$geneID) ##为表型添加egobp.results列。df <- cbind(egobp.results. df)Df,表型=1)egobp.results. Df <- egobp.results. Df。df[, c(1,2,3,4,6,5)] ##更改列头colnames(egobp.results.df) <- c("Name","Description", "pvalue","qvalue","phenotype", "genes") egobp.results.filename <-file.path(getwd(),paste("clusterprofiler_cluster_enr_results.txt",sep="_")) write.table(egobp.results.df,egobp.results.filename,col.name=TRUE,sep="\t",行。names=FALSE,quote=FALSE)
em_command = paste('enrichmentmap build analysisType="generic" ', 'pvalue=',"0.05", 'qvalue=',"0.05", 'similaritycutoff=',"0.25", ' coeffecents =',"JACCARD", 'enrichment dataset1 =',egobp.results. results. 'Filename, sep=" ") #enrichment map命令将返回新创建网络的suid。em_network_suid <- commandsRun(em_command) renameNetwork(" cluster1_enricmentmap_cp ", network=as.numeric(em_network_suid))

在Cytoscape中打开富集图网络后,可以使用控件中的控件对其进行过滤并更改样式EnrichmentMap面板中控制面板

4.2WikiPathways

这很好,但我们是来通路分析!到目前为止,一切都是基本的GO分析。在此基础上,让我们看看维基路径还能增加什么clusterProfiler包包含内置的支持维基路径的功能,enrichWP而且gseWP.详情请参阅他们的手册:https://yulab-smu.top/biomedical-knowledge-mining-book/wikipathways-analysis.html

这些函数将从WikiPathways检索最新的GMT文件。新版本在每个月的10号发布。他们采取了生物参数,该参数应来自受支持生物的列表get_wp_organisms ()

让我们使用enrichWP ()函数首先……

ewp。up <- clusterProfiler::浓缩铀(up.genes. up)。Entrez [[2]], universe = bkgd.genes。entrez[[2]],有机体= "智人",pAdjustMethod = "fdr", pvalueCutoff = 0.1, #p。调整截止;为演示目的而放松)head(ewp.up)

出于某种原因,浓缩器不会自动将基因符号添加到结果对象中,但在剂量做……

ewp。up <- DOSE::setReadable(ewp。up, org.Hs.eg.db, keyType = "ENTREZID") head(ewp.up)

而且,我们可以像以前一样访问所有相同的绘图函数……

barplot (ewp。up, showCategory = 20) dotplot(ewp。up, showCategory = 20)

在我们忘记之前,我们还可以对下调的基因进行同样的分析……

ewp。dn <- enrichment wp (dn.genes. cn)主菜[[2]],#universe = bkgd。基因[[2]],#提示:注释出来得到任何结果的演示生物= "智人",pAdjustMethod = "fdr", pvalueCutoff = 0.1, #p。调整截止;为演示目的而放松)ewp。dn <- setReadable(ewp. dn)dn, org.Hs.eg.db, keyType = "ENTREZID") head(ewp.dn) dotplot(ewp. dn)dn, showCategory = 20)

有趣的是,几乎是下调基因的两倍(641对383),但更少的重要通路。通路分析是一种比GO分析更有针对性的方法。它需要一组基因功能在已知途径机制的背景下相关。所以,基因集大小并不总是与结果大小相关。

奖金:我们刚才所做的也被称为过度表现分析(ORA)。另一种方法是基因集富集分析(GSEA)。GSEA的一个优点是您不必选择任意的log2FC截断来定义基因集。相反,您可以提供一个排序值的命名列表(例如,-log10(pvalue)*sign(FC)),然后让GSEA完成工作。下面是一些步骤,看看你能不能照着做:

肺。expr$fcsign <- sign(lung.expr$log2FC)expr$logfdr <- -log10(lung.expr$P.Value)Expr $sig <- lung. Expr $logfdr/lung。美元expr fcsign sig.lung.expr.entrez <合并(肺。bkgd.genes expr。entrez,。x = "GeneID", by。y = "ENSEMBL") gsea.sig.lung.expr <- sig.lung.expr。Entrez [,8] names(gsea.sig.lung.expr) <- as.character(sig.lung. express . Entrez [,9]) gsea.sig.lung.expr <- sort(gsea.sig.lung. expr)。gwp.sig.lung.expr <- clusterProfiler::gseWP(gsea.sig.lung. expr,递减= TRUE)expr, pAdjustMethod = "fdr", pvalueCutoff = 0.05, #p。一个djust cutoff organism = "Homo sapiens" ) gwp.sig.lung.expr.df = as.data.frame(gwp.sig.lung.expr) gwp.sig.lung.expr.df[which(gwp.sig.lung.expr.df$NES > 1),] #pathways enriched for upregulated lung cancer genes gwp.sig.lung.expr.df[which(gwp.sig.lung.expr.df$NES < -1),] #pathways enriched for downregulated lung cancer genes

途径分析的一个优点是路径模型已经构建并准备好进行数据覆盖。我们很快就会讲到可视化部分,但首先,让我们看看我们还能从WikiPathways中学到什么。

5探索

再次转向rWikiPathwaysPackage,让我们来探索一下内容和目前为止我们的一些路径。既然我们在这里研究肺癌,让我们从寻找相关的途径开始…

findPathwayNamesByText(“肺癌”)

哇,太多了,还有很多重复!?这个通用搜索包括“肺”和/或“癌症”的所有匹配项,并根据这两个词的最佳匹配项进行排序。它还包括所有物种的匹配,例如,除了人类之外,老鼠和大鼠。让我们更具体地说……

信用证。paths <- findPathwaysByText('"lung cancer"') #在查询中引用,需要两个术语human.lc. paths <- lc.path。途径%>% dplyr::filter(species == "智人")#只是人类肺癌途径。路径$name #显示路径标题

好吧,只有少数几种人类途径在标题或描述中明确提到了“肺癌”。这些都不是我们最喜欢的丰富内容,但在我们的探索性数据可视化过程中,我们可能想看看它们,对吧?所以,让我们暂时保留他们的wpid…

信用证。wpid <- human.lc。通路$ id lc.wpids

您还可以通过基因标识符、pubmed引用和本体术语来搜索路径。但我们已经知道了我们想要看到的主要途径,基于我们的途径富集分析。让我们确定它们的wpid……

wpid <- ewp.up.wpid。ID ewp.up.wpids美元

让我们来看看这些。例如,我们可以在浏览器中打开它们……

url <- getPathwayInfo("WP179")$url

您可以使用以下方法访问维基路径网站的所有信息rWikiPathways.您甚至可以查询特定路径的历史记录或整个站点的最近变化。毕竟这是一个维基!

但我们接下来真正想做的是查看这些路径上的数据。关于这一点,我们将转向CytoscapeRCy3包中。

6可视化

Cytoscape是一个流行的网络可视化和分析工具,具有强大的社区开发和脚本支持。由于路径只是一种特殊类型的网络,因此它非常适合为路径分析结果提供高质量的可视化。

我们有RCy3包裹已经装好了,但我们还得Cytoscape启动(参见步骤1。安装,如果你还没有安装的话)。一次Cytoscape是奔跑,是尝试它有这样的命令:

cytoscapePing ()

如果您已经加载并运行了所有内容,那么您所需要做的就是运行以下命令从WikiPathways导入路径到Cytoscape:

RCy3:: commandrun ('wikipathways import-as-path id=WP179')

它在那儿!该途径的最新批准版本,现在在Cytoscape中作为一个带有注释基因、蛋白质和代谢物的网络模型。出于性能考虑,Cytoscape设置了一个视图阈值,以便在缩小时隐藏细节(如节点标签)。如果你想覆盖这个,使用…

toggleGraphicsDetails ()

让我们加载我们在富集分析中使用的相同数据,这些数据首先向我们指出了这一途径。我们只需要告诉Cytoscape数据中的哪一列包含标识符(在本例中是Ensembl id),而Cytoscape节点表中的这一列包含相应的标识符。

loadTableData(肺。expr, data.key.column = "GeneID", table.key.column = "Ensembl")

注意:如果您得到一个错误,那么“Ensembl”列可能没有被自动添加。对于这个演示,你可以简单地参考“XrefId”列,如下所示:loadTableData(肺。expr, data.key.column = " GeneID ", table.key.column = " XrefId ")的所有情况都可以使用此修复loadTableData在下面。

现在我们可以定义可视化样式来可视化这个路径上的数据。首先,让我们设置节点填充颜色来显示log2折叠变化数据。

setNodeColorMapping("log2FC", colors=paletteColorBrewerRdBu, style.name = "WikiPathways")

你可以类似地将p值映射到边界颜色,等等。在节点和边缘上有几十个可视化属性可用于数据可视化!

脚本的力量在于将一件事重复做多次……所以,现在让我们将同样的数据和视觉风格应用到我们感兴趣的所有路径上。仅用两行代码…

拉普兰人(ewp.up。wpid, function (x) {commandrun (paste0('wikipathways import-as-path id=',x))expr, data.key.column = "GeneID", table.key.column = "Ensembl") toggleGraphicsDetails()})

福利:我们发现的那些肺癌途径呢?让我们来看看这些数据的叠加。

拉普兰人(lc。wpid, function (x){commandrun (paste0('wikipathways import-as-path id=',x))expr, data.key.column = "GeneID", table.key.column = "Ensembl") toggleGraphicsDetails()})

7扩展

现在我们的路径被加载到Cytoscape中,这就打开了大量潜在的分析和可视化选项!请查看Cytoscape手册而且应用程序商店首先,美国。您也可以浏览Cytoscape教程而且RCy3小插曲如果你想要实际的例子。

在这个小插图中,我们将使用CyTargetLinkerCytoscape的应用程序扩展了药物-靶点相互作用通路的网络表示。

首先,让我们重新导入路径作为一个网络使用稍微修改过的命令:

commandrun ('wikipathways import-as-network id=WP179')expr, data.key.column = "GeneID", table.key.column = "Ensembl")setNodeColorMapping("log2FC", data.values, node.colors, default.color = "#FFFFFF", style.name = "WikiPathways-As-Network")

看到区别了吗?相同的数据,相同的路径源,但不同的表示。当您想要添加更多节点、遍历路径、执行自动布局等时,路径的网络视图非常有用。

接下来,我们需要加载最新的药物目标数据库。支持的数据库CyTargetLinker被称为linksets并可从CyTargetLinker网站.我们已经提供了一个例子drugbank这个小插图的链接集,所以你不需要下载任何东西。

unzip(system.file("extdata","drugbank-5.1.0.xgmml.zip", package=" rwikipaths "), exdir = getwd()) drugbank <- file.path(getwd(), "drugbank-5.1.0.xgmml")

现在我们有了drugbank加载了CyTargetLinker后,我们可以运行CyTargetLinker命令:

commandrun (paste0('cytargetlinker extend idAttribute="Ensembl" linkSetFiles="', drugbank, '"')) commandrun ('cytargetlinker applyLayout network="current")

这将返回关于添加内容的信息。在Cytoscape中,您现在有了原始网络的副本,但现在有了额外的节点和边。来看看…

嗯,它们有点普通,很难看到。让我们使用Cytoscape可视化样式来解决这个问题!

我的。drugs <- selectNodes("drug", by。col = "CTL. "Type", preserve = FALSE)$nodes #通过列值收集节点suid的简单方法clearSelection() setNodeColorBypass(my。setNodeShapeBypass(my。毒品,“六边形”)毒品。标签<- getTableColumns(columns=c("SUID","CTL.label"))药物。标签<- na.省略(drug.labels) mapply(函数(x,y) setNodeLabelBypass(x,y),药物。标签SUID美元,drug.labels CTL.label美元)

现在,我们有了标记为紫色六边形的药物,它们与我们在肺癌数据集上的功能丰富分析中获得的维基路径的网络视图相互作用。太酷了!希望你现在可以想象,以其他方式扩展这个(或其他通路),例如,TF和miRNA相互作用。或者应用许多其他的Cytoscape应用程序来分析和可视化这个结果。

8保存

最后,但并非最不重要的是,确保在此过程中保存您的工作。以下是如何将肺癌数据集中的上下调控子集保存为易于读取和共享的R对象:

保存(ewp。save(ewp. up, file = "lung_cancer_ewp_up.Rdata")dn, file = "lung_cancer_ewp_down.Rdata")

会话文件保存了Cytoscape中的所有内容,包括路径、网络、数据和样式。与大多数项目软件一样,我们建议经常保存!

# .cys saveSession(“tutorial_session”)

注意:如果您没有指定完整的路径,文件将相对于您的Cytoscape安装目录保存,例如,/Applications/Cytoscape_v3.6.1/…或您可能没有写入权限的某个位置。

您可以导出极高分辨率的图像,包括矢量图形格式。

export ('tutorial_image2', type='PNG', zoom=200) #.png;使用缩放或宽度参数来增加大小/分辨率

由于涉及到如此多的库,在执行实际分析时跟踪版本信息是一个好主意,这样您(和其他人)就可以可靠地重现您的结果:

sessionInfo ()