单细胞之富集分析-7:Pseudobulk differential expression analysis


单细胞富集分析系列:


1. 数据准备

使用我们在hdWGCNA:单细胞WGCNA分析方法中使用的数据集。这个数据集包含了11个小鼠的样本。

seurat_obj <- readRDS('Zhou_2020.rds')
table(seurat_obj$Sample)

#   C1  C11  C12   C2   C3   C4   C5   C6   C7   C8   C9 
# 1788 3345 2333 1899 3002  711 6841 3320 2934 7618 2880 

##但是该数据集的11个样本都是同一个组,因此需要重新设置一下分组(仅做演示)
seurat_obj$Group <- seurat_obj$Sample
seurat_obj$Group <- recode(seurat_obj$Group,
                           C1='HC',
                           C2='HC',
                           C3='HC',
                           C4='HC',
                           C5='HC',
                           C6='HC',
                           C7='Treat',
                           C8='Treat',
                           C9='Treat',
                           C11='Treat',
                           C12='Treat')
table(seurat_obj$Group)

#    HC Treat 
# 17561 19110
2. Pseudobulk数据整合
2.1 数据整合

这一步的目的主要是为了得到Pseudobulk的矩阵

  • 方法1:提取矩阵出来做加和
bs = split(colnames(seurat_obj),seurat_obj$Sample)
ct = do.call(
  cbind,lapply(names(bs), function(x){ 
    # x=names(bs)[[1]]
    kp =colnames(seurat_obj) %in% bs[[x]]
    rowSums( as.matrix( seurat_obj@assays$RNA@counts[, kp]  ))
  })
)
colnames(ct) <- names(bs)
head(ct)
#              C1 C11 C12  C2  C3 C4  C5  C6  C7  C8  C9
# MIR1302-2HG   3  13  15   8  12  4   2   6   3  42   6
# FAM138A       0   0   0   0   0  0   0   0   0   0   0
# OR4F5         0   0   1   0   1  0   1  13   0   1   7
# AL627309.1  262 243 387 120 322 46 515 859 296 616 648
# AL627309.3    0   0   0   0   0  0   0   0   0   0   0
# AL627309.2    0   0   0   0   0  0   0   0   0   0   0
  • 方法2:使用AggregateExpression函数
Idents(seurat_obj) <- 'Sample'
ct <- round(AggregateExpression(seurat_obj)[[1]])
head(ct)
#              C1 C11 C12  C2  C3 C4  C5  C6  C7  C8  C9
# MIR1302-2HG   1   5   6   6   5  2   1   2  10  32   3
# FAM138A       0   0   0   0   0  0   0   0   0   0   0
# OR4F5         0   0   0   0   0  0   1   6   0   0   3
# AL627309.1  159 268 233 166 213 45 489 459 399 663 458
# AL627309.3    0   0   0   0   0  0   0   0   0   0   0
# AL627309.2    0   0   0   0   0  0   0   0   0   0   0
⚠️

呃...两个方法好像还是有差别的。
两种方法的差异可以参考:seurat-AverageExpression()源码解析

2.2 查看分组
phe = unique(seurat_obj@meta.data[,c('Sample','Group')])
phe
#                     Sample Group
# AGTCTTTGTTGATTCG-11     C1    HC
# CAGCTGGAGCCAGGAT-12    C11 Treat
# CACAAACAGTCATCCA-13    C12 Treat
# ACTGCTCGTACATGTC-14     C2    HC
# CAACTAGGTTGTGGAG-15     C3    HC
# CATGGCGGTTCTGTTT-16     C4    HC
# CCACCTAGTCTGCGGT-17     C5    HC
# AAACCTGGTGTGACGA-18     C6    HC
# GAGGTGAAGAAACGAG-19     C7 Treat
# TCTTTCCTCTCAACTT-20     C8 Treat
# CTTCTCTAGAGCTTCT-21     C9 Treat
2.3 测查数据并质控
group_list = phe[match(names(bs),phe$Sample),'Group']
table(group_list)    
# group_list
#    HC Treat 
#     6     5 
exprSet = ct
dim(exprSet) 
# [1] 36601    11

exprSet=exprSet[apply(exprSet,1, function(x) sum(x>1) > 1),]
dim(exprSet)  
# [1] 25684    11
table(group_list)
save(exprSet,group_list,file = 'input_for_deg.Rdata')
3. 差异分析

后续的分析可以参考3大差异分析r包:DESeq2、edgeR和limma

load(file = 'input_for_deg.Rdata')

library(edgeR) #以edgeR为例

dge <- DGEList(counts=exprSet,group=group_list) #输入表达矩阵和分组信息数据
dge$samples$lib.size <- colSums(dge$counts)
dge <- calcNormFactors(dge) 

design <- model.matrix(~0+group_list) #写不写0+是一样的
rownames(design)<-colnames(dge)
colnames(design)<-levels(group_list)

dge <- estimateGLMCommonDisp(dge, design)
dge <- estimateGLMTrendedDisp(dge, design)
dge <- estimateGLMTagwiseDisp(dge, design)

fit <- glmFit(dge, design)
fit2 <- glmLRT(fit, contrast=c(-1,1))  #这里的contrast和DESeq2有差别,这里只需要输入c(-1,1)就好,-1对应着normal,是对照组,1对应着tumor,是实验组。

DEG=topTags(fit2, n=nrow(exprSet))
DEG=as.data.frame(DEG) #转化为数据框
View(DEG)

这样就得到了差异分析结果,可以继续做通路富集了。


参考:

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容