最近真是烦心啊,事事不顺,找个日子我要找大师算一卦。?
大家基本都会做富集分析,但有时候terms实在太多,读起来真是累,也搞不清到底谁是其中相对重要的。?
之前有一些R包通过计算基因集的overlap,进行term合并,效果也还可以。?
今天跟大家介绍的是simplifyEnrichment包,通过计算语义相似性矩阵来合并terms,效果也是要比计算基因overlap要好的多(这可不是我空口说的,这是原文比较的结果)。?
library(tidyverse)
library(simplifyEnrichment)
我们随便生成500个GO的term吧。
set.seed(111)
go_id <- random_GO(500)
head(go_id)

mat <- GO_similarity(go_id,
ont = c("BP", "CC", "MF"),
db = 'org.Hs.eg.db',
measure = "Rel",
remove_orphan_terms = F)
df <- simplifyGO(mat)

看看有多少个cluster。?
head(df)
sort(table(df$cluster))

split函数,分开查看。?
split(df, df$cluster)

如果你不需要出图,只要聚类,可以在simplifyGO()函数使用时将plot设置为F。
当然,你也可以使用binary_cut() 或cluster_terms()。?
binary_cut(mat)

cluster_terms(mat, method = "binary_cut")

可以瘦身的不仅仅是GO的富集结果,你也可以使用其他的,下面一些函数补充给大家:?
term_similarity_from_enrichResult();term_similarity_from_KEGG();term_similarity_from_Reactome();term_similarity_from_MSigDB();term_similarity_from_gmt();
我们经常会有好几个GO-ID的list,想要比较一下,找到有意义的terms,就需要用到simplifyGOFromMultipleLists()函数了。
这里我们用一下cola包的示例数据,生成3个list。?
library(cola)
data(golub_cola)
res <- golub_cola["ATC:skmeans"]
library(hu6800.db)
x <- hu6800ENTREZID
mapped_probes = mappedkeys(x)
id_mapping = unlist(as.list(x[mapped_probes]))
lt <- functional_enrichment(res, k = 3, id_mapping = id_mapping)

names(lt)

操作和常用的list操作是一样的。?
head(lt[[1]][, 1:7])

这里我们把padj_cutoff设置的小一点,以便节省时间。?
simplifyGOFromMultipleLists(lt, padj_cutoff = 0.001)

输入数据也可以是其他格式的,这里补充两个。?
1️⃣
lt2 <- lapply(lt, function(x) structure(x$p.adjust, names = x$ID))
simplifyGOFromMultipleLists(lt2, padj_cutoff = 0.001)

2️⃣
simplifyGOFromMultipleLists的输入数据一般有3种类型:?
adjusted p-values的向量列表,以GO-ID为名;data frame,包含go_id_column和padj_column列,GO-ID的字符向量列表,每个字符向量将被改变为一个数字向量,所有的值都为1,原来的GO- IDs被用作向量的名称。
lt3 <- lapply(lt, function(x) x$ID[x$p.adjust < 0.001])
simplifyGOFromMultipleLists(lt3)

?
Gu Z, Hübschmann D. Simplify enrichment: A bioconductor package for clustering and visualizing functional enrichment results [published online ahead of print, 2022 Jun 6]. Genomics Proteomics Bioinformatics. 2022;S1672-0229(22)00073-0. doi:10.1016/j.gpb.2022.04.008

<center>最后祝大家早日不卷!~</center>
点个在看吧各位~ ✐.ɴɪᴄᴇ ᴅᴀʏ 〰
<center> <b>? 往期精彩 <b> </center>
? <font size=1>? WGCNA | 值得你深入学习的生信分析方法!~</font>
? <font size=1>? ComplexHeatmap | 颜狗写的高颜值热图代码!</font>
? <font size=1>? ComplexHeatmap | 你的热图注释还挤在一起看不清吗!?</font>
? <font size=1>? Google | 谷歌翻译崩了我们怎么办!?(附完美解决方案)</font>
? <font size=1>? scRNA-seq | 吐血整理的单细胞入门教程</font>
? <font size=1>? NetworkD3 | 让我们一起画个动态的桑基图吧~</font>
? <font size=1>? RColorBrewer | 再多的配色也能轻松搞定!~</font>
? <font size=1>? rms | 批量完成你的线性回归</font>
? <font size=1>? CMplot | 完美复刻Nature上的曼哈顿图</font>
? <font size=1>? Network | 高颜值动态网络可视化工具</font>
? <font size=1>? boxjitter | 完美复刻Nature上的高颜值统计图</font>
? <font size=1>? linkET | 完美解决ggcor安装失败方案(附教程)</font>
? <font size=1>......</font>
本文由mdnice多平台发布
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
我正在尝试将我更新的gem推送到rubygems.com并得到以下结果。~/dev/V2/V2GPTI(master)$gembuildv2gpti.gemspecSuccessfullybuiltRubyGemName:v2gptiVersion:0.2File:v2gpti-0.2-universal-darwin-13.gem~/dev/V2/V2GPTI(master)$gempushv2gpti.gemspecERROR:Whileexecutinggem...(Gem::Package::FormatError)packagemetadataismissinginv2g
重新定义Float#/似乎没有效果:classFloatdef/(other)"magic!"endendputs10.0/2.0#=>5.0但是当另一个中缀运算符Float#*被重新定义时,Float#/突然采用了新的定义:classFloatdef/(other)"magic!"enddef*(other)"spooky"endendputs10.0/2.0#=>"magic!"我很想知道是否有人可以解释这种行为的来源,以及其他人是否得到相同的结果。ruby:ruby2.0.0p353(2013-11-22)[x64-mingw32]要快速确认错误,请运行thisscript.
我正在使用Rails4并遇到以下错误。RoutingErrorNoroutematches[POST]"/logs/1/meals/13/edit我正在使用:meal传递模型对象的form_for,并且编辑页面正确呈现。但是,Rails似乎并没有检查膳食对象是否已经保存,因此它一直尝试将表单发送到#create操作并尝试发出POST请求,而不是将表单发送到更新操作并进行当我点击提交时一个PUT请求。我如何让form_for识别我正在尝试更新现有对象并且需要PUT而不是POST?其他一切正常,我已经运行了所有迁移。我是Rails的新手,几乎一整天都在尝试自己解决这个问题。请帮忙!请注意,
我有三个属于同一个类的对象。一个是通过Item.new创建的,另外两个是从数据库(Mongoid)中提取的。我将这些对象中的一个/任何一个传递给另一个方法,并通过is_a?检查该方法中的类型:definitialize(item,attrs=nil,options=nil)super(attrs,options)raise'invaliditemobject'unlessitem.is_a?(Item)好吧,这次加薪被击中了。所以我在Rails控制台中检查类、is_a和instance_of。我得到相互矛盾的结果。为什么它们有相同的class但只有其中一个是那个class的instan
为什么当我打开irb并运行时放'A'.unpack("B8")我得到01000001但是当我运行放'A'.unpack("B4B4")我只得到0100而不是[0100,0001]?unpack的分辨率是不是只有一个完整的字节?一点都不差? 最佳答案 让我们做一些测试来理解行为:>'A'.unpack('B8')=>["01000001"]它返回char'A'的8个最高有效位(MSB)>'A'.unpack('B4')=>["0100"]它返回char'A'的4MSBs>'A'.unpack('B16')=>["01000001"]它
使用Ruby1.9.2,我在IRB中有以下Ruby代码:>r1=/^(?=.*[\d])(?=.*[\W]).{8,20}$/i>r2=/^(?=.*\d)(?=.*\W).{8,20}$/i>a=["password","1password","password1","pass1word","password1"]>a.each{|p|puts"r1:#{r1.match(p)?"+":"-"}\"#{p}\"".ljust(25)+"r2:#{r2.match(p)?"+":"-"}\"#{p}\""}这会产生以下输出:r1:-"password"r2:-"password"r1:
gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就
为什么下面的表达式会这样解析?括号的优先级应该高于换行符,不是吗?3-(1+1)#=>13-(1+1)#=>2省略加号也会让表达式计算为2:3-(11)#=>2如果我声明为连续的换行符(转义)或将加号移动到第一行,则会实现所需的行为:3-(1\+1)#=>13-(1+1)#=>1 最佳答案 这是因为Ruby将新行识别为表达式的结尾,除非表达式不完整。例如,(1+1)与相同(1;+1)这与+1相同,因为返回了括号内的最后一个表达式。这进一步与1相同。如果行尾有+,则表达式不完整,因此会继续到下一行。这使得:3-(1+1)被解释为3-(
Assets模型:searchabledotext:titletext:descriptiontime:created_atinteger:category_ids,:multiple=>true,:references=>CategoryendController:search=Asset.search()dokeywords(h(params[:query]),:fields=>[:title,:description])facet(:category_ids)order_by:created_atend我不想通过:count(点击次数)对我的方面:Category_ides进行排