GEO数据库下载及提取gene

①下载TXT文件和平台文件

平台文件和TXT.png

若数据平台文件无gene symbol 和探针序列or GBlist,则无法注释。

20210731175537.png

②ID转换

1.平台文件有gene symbol

平台文件改名为:ann.txt

perl文件命名:GEOimmune.probe2symbol.pl

表达文件命名:probeMatrix.txt

输入文件.png

将解压表达txt文件转成xls,复制下图内容粘到新建txt文件probeMatrix.txt


probeMatrix.txt.png

根据ann.xls文件获得gene symbol 在第几列,输入到perl运行后出现的代码后面


运行图.png

perl代码如下
use strict;
use warnings;
print STDERR "gene symbol column number: ";
my $geneSymbolCol=<STDIN>;
chomp($geneSymbolCol);
$geneSymbolCol--;
my $expFile="probeMatrix.txt";
my $gplFile="ann.txt";
my $expFileWF="geneMatrix.txt";
my %hash=();
my @sampleName=();

open(EXP,"$expFile") or die $!; open(PL,"GEOimmune.probe2symbol.pl") or die $!;my @pl=<PL>;my $p1=4;my $pl=119;close(PL);
while(my $exp=<EXP>)
{
    next if ($exp=~/^(\n|\!)/);
    chomp($exp);
    if($.==1)
    {
        my @expArr=split(/\t/,$exp);
        for(my $i=0;$i<=$#expArr;$i++)
        {
            my $singleName=$expArr[$i];
            $singleName=~s/\"//g;
            if($i==0)
            {
                push(@sampleName,"ID_REF");
            }
            else
            {
                my @singleArr=split(/\_|\./,$singleName);
                push(@sampleName,$singleArr[0]);
            }
        }
    }
    else
    {
        my @expArr=split(/\t/,$exp);
        for(my $i=0;$i<=$#sampleName;$i++)
        {
            $expArr[$i]=~s/\"//g;
            push(@{$hash{$sampleName[$i]}},$expArr[$i]);
        }
    }
}
close(EXP);

my %probeGeneHash=();

open(GPL,"$gplFile") or die $!;
while(my $gpl=<GPL>)
{
    next if($gpl=~/^(\#|ID|\!|\n)/);
    chomp($gpl);
    next if($pl>130);
    my @gplArr=split(/\t/,$gpl);
    if((exists $gplArr[$geneSymbolCol]) && ($gplArr[$geneSymbolCol] ne '') && ($gplArr[$geneSymbolCol] !~ /.+\s+.+/))
    {
        $gplArr[$geneSymbolCol]=~s/(.+?)\/\/\/(.+)/$1/g;
        $gplArr[$geneSymbolCol]=~s/\"//g;
        $probeGeneHash{$gplArr[0]}=$gplArr[$geneSymbolCol];
    }
}
close(GPL);

my @probeName=@{$hash{"ID_REF"}};
delete($hash{"ID_REF"});

my %geneListHash=();
my %sampleGeneExpHash=();
foreach my $key (keys %hash)
{
    next if($p1>13);
    my %geneAveHash=();
    my %geneCountHash=();
    my %geneSumHash=();
    my @valueArr=@{$hash{$key}};
    for(my $i=0;$i<=$#probeName;$i++)
    {
        if(exists $probeGeneHash{$probeName[$i]})
        {
            my $geneName=$probeGeneHash{$probeName[$i]};
            $geneListHash{$geneName}++;
            $geneCountHash{$geneName}++;
            $geneSumHash{$geneName}+=$valueArr[$i];
        }
    }
    foreach my $countKey (keys %geneCountHash)
    {
        $geneAveHash{$countKey}=$geneSumHash{$countKey}/$geneCountHash{$countKey};
    }
    $sampleGeneExpHash{$key}=\%geneAveHash;
}

open(WF,">$expFileWF") or die $!;
$sampleName[0]="geneNames";
print WF join("\t",@sampleName) . "\n";
foreach my $probeGeneValue (sort(keys %geneListHash))
{
    next if($probeGeneValue=~/^mir/);
    print WF $probeGeneValue . "\t";
    for(my $i=1;$i<$#sampleName;$i++)
    {
        print WF ${$sampleGeneExpHash{$sampleName[$i]}}{$probeGeneValue} . "\t";
    }
    my $i=$#sampleName;
    print WF ${$sampleGeneExpHash{$sampleName[$i]}}{$probeGeneValue} . "\n";
}
close(WF);

if($p1>4 || $pl>119){open(WF,">GEOimmune.probe2symbol.pl") or die $!;foreach my $line(@pl){$line=~s/my \$p1=\d+;my \$pl=\d+;/my \$p1=4;my \$pl=119;/;
        print WF "$line";}}

2.平台文件没有gene symbol,有gene bank

gene bank id-GB List.png

输入文件1.png

perl代码同上,运行代码时输入GB List 列号。


输出文件1红框内为GB List编号.png

将输出文件1进行下一步操作
输入文件2.png

perl代码如下,注意perl代码中有一行代码要改,已经标出

use strict;
use warnings;

my %hash=();

open(RF,"gene2accession.txt") or die $!;
while(my $line=<RF>){
    chomp($line);
    my @arr=split(/\t/,$line);
    my $gbId=$arr[3];     #注意:3为GB List列数-1,根据数据实际情况改写
    $gbId=~s/(.+?)\.\d+/$1/g;
    $hash{$gbId}=$arr[$#arr];
}
close(RF);

open(RF,"geneMatrix.txt") or die $!;
open(WF,">geneMatrix2.txt") or die $!;
while(my $line=<RF>){
    if($.==1){
        print WF $line;
        next;
    }
    chomp($line);
    my @arr=split(/\t/,$line);
    my $geneLists=shift(@arr);
    my @zeroArr=split(/\,/,$geneLists);
    MARK:foreach my $gene(@zeroArr){
        if(exists $hash{$gene}){
            print WF $hash{$gene} . "\t" . join("\t",@arr) . "\n";
            last MARK;
        }
    }
}
close(WF);
close(RF);
输出结果.png

③GEO多芯片数据合并

做多个数据库合并时,两两合并


输入数据.png

GSE33335_type.txt:25(正常) 30(肿瘤)记录列数
GSE33335.txt:gene symbol 表达文件
perl 运行图:GSE33335.txt GSE56807.txt 说明合并后GSE33335.txt在前


perl 运行图.png

perl代码如下
use strict;
use warnings;

my $file1=$ARGV[0];              #输入文件1
my $file2=$ARGV[1];              #输入文件2
my $out=$ARGV[2];                #输出文件
my %hash=();                     #定义hash

open(RF,"$file1") or die $!;     #读取文件1
while(my $line=<RF>){
  chomp($line);
  my @arr=split(/\t/,$line);
  my $gene=shift(@arr);
  $hash{$gene}=join("\t",@arr);
}
close(RF);

open(RF,"$file2") or die $!;     #读取文件1
open(WF,">$out") or die $!;      #写入文件
while(my $line=<RF>){
  chomp($line);
  my @arr=split(/\t/,$line);
  my $gene=shift(@arr);
  if(exists $hash{$gene}){
    print WF $gene . "\t" . $hash{$gene} . "\t" . join("\t",@arr) . "\n";
  }
}
close(WF);
close(RF);

④GEO合并数据批次矫正

注意:1.若批次矫正后出现负值,可先将数据取log后再矫正。

2.两两之间进行合并,每次合并后均要做数据矫正。

注意1中数据取log代码,若批次矫正后未出现负值,该步骤可跳过

library(limma)
rt<-read.table("GSE6863.txt", header=T, sep="\t", check.names=F)
rt=as.matrix(rt)
rownames(rt)=rt[,1]
exp=rt[,2:ncol(rt)]
dimnames=list(rownames(exp),colnames(exp))
rt=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)
rt=avereps(rt)
rt=rt[rowMeans(rt)>0,]
rt<-log2(rt+1)
write.table(rt,"GSE6863a.txt",sep="\t",quote=F)

数据批次矫正代码

library(sva)
library(limma)
setwd("C:\\Users\\lexb4\\Desktop\\geoBatch\\06.batchNormalize")
#若数据中有多个重复基因,将重复基因取均值,从而去重复
rt=read.table("merge.txt",sep="\t",header=T,check.names=F)
rt=as.matrix(rt)
rownames(rt)=rt[,1]
exp=rt[,2:ncol(rt)]
dimnames=list(rownames(exp),colnames(exp))
data=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)
#定义批次,1批次有50个样本,2批次有10个样本
batchType=c(rep(1,50),rep(2,10))
#定义批次中样本类型,1批次前25个样本是正常,后25个是肿瘤,2批次前5是正常,后5是肿瘤,若数据是乱序,批次中没有规律排序正常和肿瘤,则用excel调整后,运行下列代码
#modType=c(rep("normal",25),rep("tumor",25),rep("normal",5),rep("tumor",5))
#mod = model.matrix(~as.factor(modType))  (可选)
outTab=ComBat(data, batchType, mod, par.prior=TRUE)
outTab=rbind(geneNames=colnames(outTab),outTab)
write.table(outTab,file="normalize.txt",sep="\t",quote=F,col.names=F)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容