生信喵 发表于 2025-5-31 23:19:22

GEO提取lncRNA、mRNA、miRNA的表达矩阵

<h1>背景</h1>
<p>从GEO下载芯片数据,从基因表达矩阵分别提取lncRNA、mRNA、miRNA的表达矩阵</p>
<p>这套代码使用三个相对独立的模块来解决上述需求,可根据自己的实际需要,灵活使用这三个模块:</p>
<p>【模块一】从GEO下载microarray数据,不包括测序数据。</p>
<p>【模块二】根据Ensembl的BioMart对基因的biotype注释,识别出哪些基因是lncRNA、哪些是mRNA、哪些是miRNA。</p>
<p>不仅限于芯片数据,只要有gene symbol或Ensembl ID就能识别。</p>
<p>如果没有gene symbol或Ensembl ID,或其他任何跟BioMart共有的ID,就需要做序列比对,本套代码不包含序列比对功能。</p>
<p>【模块三】根据基因名提取对应的表达矩阵。</p>
<p>不仅限于GEO数据,还适用于从TCGA下载的数据、你自己的测序数据。只要提供一个基因列表和一个表达矩阵文件。</p>
<p>**注:**如果想要miRNA成熟体的表达矩阵,最好的方式去找miRNA芯片数据,例如GSE113596,用【模块一】下载即可。如果用【模块二】和【模块三】从普通芯片数据里提取miRNA,那其实是miRNA前体的杂交信号。</p>
<h1>应用场景</h1>
<p>场景一:想计算lncRNA、miRNA、mRNA间的相关性,用来找miRNA、lncRNA的靶基因,或者用功能已知的mRNA推测lncRNA的功能,首先就要获得lncRNA、miRNA跟mRNA的表达矩阵。需要从GEO下载芯片数据,就从【模块一】开始;以TCGA表达矩阵作为输入,就从【模块二】开始。</p>
<p>场景二:打算做RNA-seq,正在设计实验,不知道该做哪种处理、选什么时间点。那就先看看别人的实验设计获得的数据效果如何,用【模块一】下载GEO的芯片数据。</p>
<p>场景三:TCGA里感兴趣的癌症类型样本量太少或没有,或者想拿多个来源的数据验证,就用【模块一】下载GEO的芯片数据。</p>
<blockquote>
<p>这篇为了兼顾特殊情况,文字越写越多。如果你的数据属于大多数,就不用看那么多文字,只把GSE和GPL或者“easy_input.csv”文件替换成你自己的数据,运行代码就好。</p>
</blockquote>
<h1>环境设置</h1>
<pre><code class="language-r">#使用国内镜像安装包
#options(&quot;repos&quot;= c(CRAN=&quot;https://mirrors.tuna.tsinghua.edu.cn/CRAN/&quot;))
#options(BioC_mirror=&quot;http://mirrors.ustc.edu.cn/bioc/&quot;)
install.packages(&quot;BiocManager&quot;)
library(BiocManager)
install(&quot;GEOquery&quot;)
install(&quot;biomaRt&quot;)
</code></pre>
<pre><code class="language-{r}">library(Biobase)
library(GEOquery)
library(biomaRt)

Sys.setenv(LANGUAGE = &quot;en&quot;) #显示英文报错信息
options(stringsAsFactors = FALSE) #禁止chr转成factor
</code></pre>
<h1>【模块一】从GEO下载基于microarray的基因表达矩阵。</h1>
<p>如果你获得了TCGA的基因表达矩阵,已经保存为 <code>easy_input.csv</code>的格式,不需要从GEO下载表达矩阵,就跳过这步,直接进入【模块二】。</p>
<ul>
<li>第一步:到NCBI的GEO数据库查询你感兴趣的数据,https://www.ncbi.nlm.nih.gov/geo/</li>
<li>第二步:借助GEOquery,提取表达数据。</li>
</ul>
<p>**注意:**把GSE替换成你想用的数据,切记同时替换成这套数据所用的GPL(哪个芯片平台),才能获得正确的探针组注释信息。**GPL去哪里找?**在https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE36895页面搜platform,它右边就是GPL。</p>
<pre><code class="language-{r,message=FALSE}">gset &lt;- getGEO(&quot;GSE36895&quot;, GSEMatrix =TRUE, getGPL = TRUE, AnnotGPL = TRUE)
#如果提示没有GPL***.anno.gz文件,就用下面这句
#gset &lt;- getGEO(&quot;GSE36895&quot;, GSEMatrix =TRUE, getGPL = TRUE)

if (length(gset) &gt; 1) idx &lt;- grep(&quot;GPL570&quot;, attr(gset, &quot;names&quot;)) else idx &lt;- 1
gset &lt;- gset[]

#查看gset里的丰富信息
#str(gset)
#如果gset里没有gene symbol或其他任何跟ensembl共有的ID,就需要用序列比对的方式去找这段探针组所对应的基因名,才能提取lncRNA。

#提取表达矩阵
exprdf&lt;-data.frame(exprs(gset))
dim(exprdf)

#默认样品名是geo_accession,例如GSM904985
#还可以提取title作为样品名,例如Normal cortex of patient 14
#colnames(exprdf)&lt;-gset@phenoData@data$title

#保存到文件
#write.csv(exprdf,&quot;not_easy_input.csv&quot;,quote = F)
</code></pre>
<p>现在你就获得了这套芯片的表达矩阵</p>
<p>这时,行名是探针组的名字,不好用,我们需要给它加上基因名。</p>
<p>你可能会遇到三种情况:</p>
<ol>
<li>像示例所用的芯片注释文件提供了gene symbol,我们就提取gene symbol。</li>
<li>如果你用的芯片连gene symbol都没有,就去gset和【模块二】的listAttributes里找它俩共有的ID,然后替换下面的Gene symbol。</li>
<li>如果没有任何共有ID,就需要你自己通过序列比对去给芯片做注释,找到序列对应的基因名,【模块一】对于你来说,到这里就暂停了。</li>
</ol>
<pre><code class="language-{r}">exprdf$gsym&lt;-gset@featureData@data$`Gene symbol`
#有时要用下面这行
#exprdf$gsym&lt;-gset@featureData@data$GENE_SYMBOL

#删除没有gene symbol的探针组
exprdf&lt;-exprdf
dim(exprdf) # 45118

#有的探针组对应多个基因,用“///”分隔基因名,删掉这样的行
exprdf&lt;-exprdf[!grepl(&quot;///&quot;, exprdf$gsym),]
dim(exprdf) # 42904

#有多个探针组对应同一个基因,取中值
#如果想取平均值,就把median改为mean
exprdf_uniq&lt;-aggregate(.~gsym,exprdf,median)
dim(exprdf_uniq) # 20848

#现在就可以用gene symbol作为行名了
rownames(exprdf_uniq)&lt;-exprdf_uniq$gsym
#删除gene symbol列
exprdf_uniq&lt;-subset(exprdf_uniq,select = -gsym)

#保存所有基因的表达矩阵到文件
#write.csv(exprdf_uniq,file=&quot;gene_exp.csv&quot;,row.names = T,quote = F)
#此处仅保存前4个sample
write.csv(exprdf_uniq[,1:4],file=&quot;easy_input.csv&quot;,row.names = T,quote = F)
</code></pre>
<p><strong>题外话:<strong>以“GSE36895”为例,在https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE36895页面底部有个“Analyze with GEO2R”按钮,点击按钮,就进入了GEO2R界面,https://www.ncbi.nlm.nih.gov/geo/geo2r/,点击Define groups,输入分组信息,然后就能做</strong>简单的差异基因筛选和画图</strong>。其实都是用R实现的,点击选项卡里的R script,就能看到R代码。</p>
<h1>【模块二】用Ensembl的biomaRt,识别出哪些基因是lncRNA、哪些是mRNA、哪些是miRNA。</h1>
<h2>输入文件</h2>
<p>用【模块一】获得的 <code>easy_input.csv</code>作为输入,基因名是gene symbol;<br />
有的文件基因名是ensembl ID;</p>
<p>或者你自己写的基因列表,至少包含第一列:基因名,可以是gene symbol,或者ensembl ID。</p>
<p>第二列开始是表达量,非必须。</p>
<pre><code class="language-{r}">exprdf_uniq&lt;-read.csv(&quot;easy_input.csv&quot;,header = T,row.names = 1)
rownames(exprdf_uniq)
</code></pre>
<h2>从biomaRt提取gene biotype</h2>
<p>这里用到biomaRt包,来自ensembl。</p>
<ul>
<li>第一步,选择你要用的基因组版本。</li>
</ul>
<p>此处用人类ensembl最新版本,如果想用旧的基因组版本或其他物种,需要按照注释修改host = 后面的参数,</p>
<p>点击链接,http://asia.ensembl.org/info/website/archives/assembly.html,查看genome assembly跟ensembl版本的对应关系</p>
<pre><code class="language-{r}">#用下面这行查看ensembl基因组版本跟host的对应关系
#listEnsemblArchives()

#运行下面两行,查看基因组
#mart = useMart('ensembl')
#listDatasets(mart)
#你需要哪个物种,就复制它在dataset列里的词,放在下面这行的`dataset = `参数里
ensembl &lt;- useMart(biomart = &quot;ENSEMBL_MART_ENSEMBL&quot;,
                   dataset = &quot;hsapiens_gene_ensembl&quot;, #人
                   #dataset = &quot;mmusculus_gene_ensembl&quot;, #小鼠
                   #dataset = &quot;rnorvegicus_gene_ensembl&quot;, #大鼠
                   #dataset = &quot;dmelanogaster_gene_ensembl&quot;, #果蝇
                   host = &quot;https://www.ensembl.org&quot;)
</code></pre>
<pre><code class="language-r">#植物用下面三行,以拟南芥为例
mart &lt;- useMart(biomart = 'plants_mart', host = &quot;https://plants.ensembl.org&quot;)
listDatasets(mart)
ensembl &lt;- useMart(biomart = &quot;plants_mart&quot;,
                   dataset = &quot;athaliana_eg_gene&quot;,
                   host = &quot;https://plants.ensembl.org&quot;)
</code></pre>

生信喵 发表于 2025-5-31 23:21:32

<ul>
<li>第二步,提取biotype</li>
</ul>
<p>我们需要用gene symbol或ensembl ID来提取gene_biotype</p>
<p>然后用gene biotype区分lncRNA、miRNA和mRNA</p>
<pre><code class="language-{r,message=FALSE}">#查看Filters和Attributes提供了哪些信息
#listFilters(ensembl)
#listAttributes(ensembl)
#看到基因名gene symbol在第64行
listAttributes(ensembl)
#下面的“filters = ”要用到这个name

feature_info &lt;- getBM(attributes = c(&quot;gene_biotype&quot;,
                                     #&quot;transcript_biotype&quot;,#还可以提取transcript_biotype
                                     #如果基因名是gene symbol,就运行下面这行
                                     &quot;hgnc_symbol&quot;),
                                     #如果基因名是ensembl ID,就运行下面这行
                                     #&quot;ensembl_gene_id&quot;),
                      #如果基因名是gene symbol,就运行下面这行
                      filters = &quot;hgnc_symbol&quot;, #小鼠是mgi_symbol,大鼠是mgi_symbol
                      #如果基因名是ensembl ID,就运行下面这行
                      #filters = &quot;ensembl_gene_id&quot;,
                      values = rownames(exprdf_uniq), mart = ensembl)

#有些芯片注释的gene symbol跟最新版本ensembl的基因名不一致,需要返回上一步,换比较老的版本。
#TCGA数据的ensembl ID跟最新版ensembl一致
if (nrow(exprdf_uniq) != nrow(feature_info)){
#查看哪些基因名不一致
library(dplyr)
diffName&lt;-setdiff(rownames(exprdf_uniq),feature_info[,2])
length(diffName)
head(diffName)
}

length(unique(feature_info$hgnc_symbol))
#有些gene symbol对应多个ensembl id,因此会有多个biotype,例如
feature_info
#TCGA数据不会遇到这个问题,因为ensembl id跟gene_biotype是一一对应的关系

#把基因的biotype保存到文件
write.csv(feature_info[,c(2,1)],&quot;gene_biotype.csv&quot;,quote = F,row.names = F)
</code></pre>
<h2>识别lncRNA、mRNA和miRNA</h2>
<p>对lncRNA的定义,可参考Vega的标准:<br />
http://vega.archive.ensembl.org/info/about/gene_and_transcript_types.html</p>
<pre><code class="language-{r}">#查看gene biotype的类型
unique(feature_info$gene_biotype)

#此处定义protein_coding作为mRNA
mRNA &lt;-&quot;protein_coding&quot;
#根据实际研究目的,调整定义为lncRNA的gene_biotype,此处根据Vega定义如下8种biotype为lncRNA
lncRNA &lt;- paste(&quot;non_coding&quot;,&quot;3prime_overlapping_ncRNA&quot;,&quot;antisense&quot;,&quot;lincRNA&quot;,&quot;sense_intronic&quot;,&quot;sense_overlapping&quot;,&quot;macro_lncRNA&quot;,&quot;bidirectional_promoter_lncRNA&quot;,sep = &quot;|&quot;)
#还可以定义miRNA
miRNA &lt;-&quot;miRNA&quot;

#下面就是表达矩阵里的mRNA、lncRNA、miRNA及其数量,把每类基因的基因名保存到相应的文件里。
mRNA.list&lt;-feature_info
write.table(mRNA.list,&quot;mRNA.list.txt&quot;,quote = F,row.names = F, col.names = F)
nrow(mRNA.list)

lncRNA.list&lt;-feature_info
write.table(lncRNA.list,&quot;lncRNA.list.txt&quot;,quote = F,row.names = F, col.names = F)
nrow(lncRNA.list)

miRNA.list&lt;-feature_info
write.table(miRNA.list,&quot;miRNA.list.txt&quot;,quote = F,row.names = F, col.names = F)
nrow(miRNA.list)
</code></pre>
<h1>【模块三】根据基因名提取对应的表达矩阵</h1>
<h2>输入文件</h2>
<p>两个输入文件:</p>
<ul>
<li>表达矩阵:easy_input.csv。第一列:基因名。可以是gene symbol(【模块一】的输出文件),或者ensembl_gene_id。第二列开始是表达量。每行一个基因,每列一个sample。</li>
<li>基因列表:mRNA.list.txt。【模块二】的输出文件。包含一列基因名,可以是gene symbol,或者ensembl_gene_id,要跟表达矩阵的基因名一致。</li>
</ul>
<pre><code class="language-{r}">exprdf_uniq&lt;-read.csv(&quot;easy_input.csv&quot;,header = T,row.names = 1)
head(exprdf_uniq)

#以miRNA基因列表为例
miRNA.list&lt;-read.table(&quot;miRNA.list.txt&quot;)
head(miRNA.list)
</code></pre>
<h3>提取表达矩阵,保存到文件</h3>
<pre><code class="language-{r}">mRNA_expr &lt;- exprdf_uniq),]
write.csv(mRNA_expr,&quot;mRNA_expr.csv&quot;,quote = F,row.names = T)
head(mRNA_expr)

lncRNA_expr &lt;- exprdf_uniq),]
write.csv(lncRNA_expr,&quot;lncRNA_expr.csv&quot;,quote = F,row.names = T)
head(lncRNA_expr)

miRNA_expr &lt;- exprdf_uniq),]
write.csv(miRNA_expr,&quot;miRNA_expr.csv&quot;,quote = F,row.names = T)
head(miRNA_expr)
</code></pre>
页: [1]
查看完整版本: GEO提取lncRNA、mRNA、miRNA的表达矩阵