第9章 单通道实验设计

9.1 背景介绍

与早期的微阵列不同,大多数数据现在都是单通道类型。单通道数据来自流行的微阵列技术,如Affymetrix,Illumina或Agilent。RNA-Seq的新技术也会生成单通道数据,因此本章中的所有内容都可以在使用voom函数预处理数据后应用于RNA-Seq分析[15]。单通道数据可能与普通单变量线性模型或方差分析非常相似。微阵列数据的差异在于几乎总是需要提取特定的感兴趣的对比,因此为R中的因子提供的标准参数通常不足。

我们将在这里假设示例数据已被适当地预处理标准化并且可用作名为esetExpressionSetEList对象。这样的对象会有一个位置包含可以使用exprs(eset)提取的每个阵列上每个基因的对数表达值。

9.2 两组

最简单的单通道实验是比较两组。假设我们希望比较两个野生型(Wt)小鼠与三个突变型(Mu)小鼠:

FileName Target
File1 WT
File2 WT
File3 Mu
File4 Mu
File5 Mu

形成设计矩阵有两种不同的方式。我们可以二选一:
1.创建一个设计矩阵,其中包括突变型与野生型差异的系数,
2.创建一个设计矩阵,其中包括野生型和突变型小鼠分别的系数,然后将其作为对比。
对于第一种方法,实验-对照参数化,设计矩阵应该如下:

> design
        WT  MUvsWT
Array1   1       0
Array2   1       0
Array3   1       1
Array4   1       1
Array5   1       1

这里第一个系数估计野生型小鼠的平均对数表达值,并充当了截距。第二个系数估计突变型和野生型之间的差异。可以通过下面的命令发现差异表达基因

> fit <- lmFit(eset, design)
> fit <- eBayes(fit)
> topTable(fit, coef="MUvsWT", adjust="BH")

其中eset是包含表达值对数的ExpressionSetmatrix对象。第二种方法,设计矩阵应该是

> design
        WT      MU
Array1   1       0
Array2   1       0
Array3   0       1
Array4   0       1
Array5   0       1

可以通过下面的命令发现差异表达基因

> fit <- lmFit(eset, design)
> cont.matrix <- makeContrasts(MUvsWT=MU-WT, levels=design)
> fit2 <- contrasts.fit(fit, cont.matrix)
> fit2 <- eBayes(fit2)
> topTable(fit2, adjust="BH")

对于第一种方法,实验-对照参数化,设计矩阵可以通过下面的命令计算

> design <- cbind(WT=1,MUvsWT=c(0,0,1,1,1))

或者通过

> Group <- factor(targets$Target, levels=c("WT","Mu"))
> design <- model.matrix(~Group)
> colnames(design) <- c("WT","MUvsWT")

对于第二种方法,分组参数化,设计矩阵可以通过下面的命令计算

> design <- cbind(WT=c(1,1,0,0,0),MU=c(0,0,1,1,1))

或者通过

> design <- model.matrix(~0+Group)
> colnames(design) <- c("WT","MU")

9.3 若干组

上述分为两组的方法很容易扩展到任何数量的组。假设有三个RNA靶标进行比较,这三个目标称为 “RNA1”,“RNA2” 和 “RNA3”,并且targets$Target列表示哪一个RNA与每个阵列进行杂交。可以使用下面的命令创建适当的设计矩阵

> f <- factor(targets$Target, levels=c("RNA1","RNA2","RNA3"))
> design <- model.matrix(~0+f)
> colnames(design) <- c("RNA1","RNA2","RNA3")

为了使三组之间的所有成对比较都可以进行,需要运行

> fit <- lmFit(eset, design)
> contrast.matrix <- makeContrasts(RNA2-RNA1, RNA3-RNA2, RNA3-RNA1,
+ levels=design)
> fit2 <- contrasts.fit(fit, contrast.matrix)
> fit2 <- eBayes(fit2)

RNA2与RNA1的差异基因列表可以通过下面的命令获得

> topTable(fit2, coef=1, adjust="BH")

每个假设检验的结果可以这样获得

> results <- decideTests(fit2)

每个比较中显著基因数目的维恩图可以通过下面的命令获得

> vennDiagram(results)

统计量fit2$F和相应的fit2$F.p.value将三对成对的比较整合到一次F检验中。这相当于每个基因的单向ANOVA分析,除了基因间的平均残差平方和已被调节。以任何方式寻找在三种RNA之间变化的基因,需要找到p值小的基因。找出排名前30的基因:

> topTableF(fit2, number=30)

9.4 其他模型和区块化

9.4.1 配对样本

配对样本通常出现在当我们比较两种实验条件时发生,每个样品给予一种处理,这样就与给定另一种处理的特定样品自然配对。这是具有两个区块的区块化的一个特殊情况。与这种情况相关的经典测试是配对t检验。

假设进行一个实验以比较新的实验处理(T)与对照(C)。来自三个血亲关系的六条狗被作为实验材料使用。对于每个同胞对,一条狗被给予实验处理,而另一条狗作为对照。这生成了目标框架:

FileName SibShip Treatment
File1 1 C
File2 1 T
File3 2 C
File4 2 T
File5 3 C
File6 3 T

可以通过在线性模型中允许同胞对效应来计算适中配对t检验:

> SibShip <- factor(targets$SibShip)
> Treat <- factor(targets$Treatment, levels=c("C","T"))
> design <- model.matrix(~SibShip+Treat)
> fit <- lmFit(eset, design)
> fit <- eBayes(fit)
> topTable(fit, coef="TreatT")

9.4.2 区块化

上述用于配对样品的方法可以应用于有批次效应的实验或进行区块化实验的任何情况。实验处理可以通过使用以下形式的模型公式来区分块之间的差异进行调整:

> design <- model.matrix(~Block+Treatment)

在这种类型的分析中,仅在每个区块内进行比较实验处理。

9.5 互动模型:2×2因子设计

9.5.1 感兴趣的问题

因子设计是那些不止一个不同的实验维度和各种实验条件的组合。假设从野生型和突变型小鼠提取细胞,这些细胞或者被刺激(S)或者未刺激(U)。来自被处理细胞的RNA被提取后与微阵列杂交。我们将简单地假设阵列是单色阵列,如Affymetrix。考虑以下目标框架:

FileName Strain Treatment
File1 WT U
File2 WT S
File3 Mu U
File4 Mu S
File5 Mu S

这里的两个实验尺度或因素是种系和实验处理。种系指定提取细胞的小鼠的基因型,实验处理指定细胞是否被刺激。观察到所有四种种系和实验处理的组合,所以这是一个因子设计。使用下面的命令将种系/实验处理组合收集到一个矢量中很方便:

> TS <- paste(targets$Strain, targets$Treatment, sep=".")
> TS
[1] "WT.U" "WT.S" "Mu.U" "Mu.S" "Mu.S"

使用因子设计来决定感兴趣的对比是特别重要的。我们在这里假设实验者对下面几点感兴趣:
1.哪些基因在野生型细胞对刺激作出反应,
2.哪些基因在突变型细胞对刺激作出反应,
3.哪些基因在突变型细胞中与野生型细胞相比反应程度不同。
因为这些是在分子生物学背景下最通常相关的问题。第一个问题与WT.SvsWT.U的比较有关,第二个与Mu.SvsMu.U相关,第三个涉及到差异之间的不同,即(Mu.S-Mu.U) - (WT.S-WT.U),术语被称为相互作用。

9.5.2 单因素分析

我们首先描述了使用limma命令分析这个实验的简单方法,与两个样本设计分析类似。然后我们将继续描述更经典的使用因子模型公式的统计方法。所有考虑的方法是等同的,并产生相同的基本结果。最基本的方法是用一个有效的模型系数拟合四因子组合中的每一个,然后提取感兴趣的比较作为对比:

> TS <- factor(TS, levels=c("WT.U","WT.S","Mu.U","Mu.S"))
> design <- model.matrix(~0+TS)
> colnames(design) <- levels(TS)
> fit <- lmFit(eset, design)

这是一个具有对应于WT.UWT.SMuUMuS的四个系数的模型。我们可以提取三种感兴趣的对比

> cont.matrix <- makeContrasts(
+ SvsUinWT=WT.S-WT.U,
+ SvsUinMu=Mu.S-Mu.U,
+ Diff=(Mu.S-Mu.U)-(WT.S-WT.U),
+ levels=design)
> fit2 <- contrasts.fit(fit, cont.matrix)
> fit2 <- eBayes(fit2)

我们可以使用topTable()函数来查看三个对比中的每一个的差异表达基因的列表,或者

> results <- decideTests(fit2)
> vennDiagram(results)

同时查看所有三个对比。

对于大多数用户而言,建议使用此方法,因为正在测试的比较是明确形成的。

9.5.3 嵌套互动公式

R中的模型公式是非常灵活的,并提供许多可能的快捷键用于设置设计矩阵。不过,他们也需要高水平的统计知识来可靠地使用,并且它们并没有在主要的R文档中完整地描述。如果我们只是想测试上述前两个问题,一个设置设计矩阵的简单方法是使用一个嵌套相互作用:

> Strain <- factor(targets$Strain, levels=c("WT","Mu"))
> Treatment <- factor(targets$Treatment, levels=c("U","S"))
> design <- model.matrix(~Strain+Strain:Treatment)
> colnames(design)
[1] "(Intercept)"  "StrainMu"  "StrainWT:TreatmentS"  "StrainMu:TreatmentS"

模型公式中的第一项是种系效应。这引入了截距列到设计矩阵,用来估计野生型未刺激细胞的平均对数表达水平,种系列估计未刺激状态下突变型与野生型的差异。模型公式中的第二项表示刺激和种系之间的相互作用。因为模型中的实验处理没有主效应,相互作用是嵌套到。它引入了第三和第四列到设计矩阵中,分别代表野生型和突变型小鼠的刺激效应,与之前定义的SvsUinWTSvsUinMu的对比完全一样。

> fit <- lmFit(eset, design)
> fit <- eBayes(fit)
> topTable(fit, coef=3)

会发现野生型小鼠响应刺激的相关基因,

> topTable(fit, coef=4)

会发现突变型小鼠响应刺激的相关基因。最后,我们可以提取上面考虑的相互作用对比Diff

> fit2 <- contrasts.fit(fit, c(0,0,-1,1))
> fit2 <- eBayes(fit2)
> topTable(fit2)

这会发现突变型和野生型小鼠刺激后差异反应的基因。

9.5.4 经典交互模型

对因子设计的分析在统计学中有悠久的历史,一个因子模型公式体系被开发用来促进复杂设计的分析。重要的是要了解上述三个分子生物学问题与任何一个用于因子设计的统计经典参数化都没有关系。所以我们一般推荐上面已经考虑过的用于微阵列分析的方法。

假设我们以通常的统计方式进行,

> design <- model.matrix(~Strain*Treatment)

这创建了一个符合以下解释的四个系数的设计矩阵:

Coeffcient Comparison Interpretation
Intercept WT.U Baseline level of unstimulated WT
StrainMu Mu.U-WT.U Difference between unstimulated strains
TreatmentS WT.S-WT.U Stimulation effect for WT
StrainMu:TreatmentS (Mu.S-Mu.U)-(WT.S-WT.U) Interaction

这被称为实验-对照参数化。请注意,我们感兴趣的一个比较,Mu.S-Mu.U,没有体现,而Mu.U-WT.U的比较却包括在内,这可能不是我们直接感兴趣的。我们需要使用对比来提取所有感兴趣的比较:

> fit <- lmFit(eset, design)
> cont.matrix <- cbind(SvsUinWT=c(0,0,1,0),SvsUinMu=c(0,0,1,1),Diff=c(0,0,0,1))
> fit2 <- contrasts.fit(fit, cont.matrix)
> fit2 <- eBayes(fit2)

提取了WT刺激效应作为第三系数,相互作用作为第四系数。突变刺激效应被提取为原始模型第三和第四系数的总和。该分析产生的结果与之前的分析完全相同。

对于阶乘实验,更经典的统计学方法是使用至零求和参数化。在R中是这样实现的

> contrasts(Strain) <- contr.sum(2)
> contrasts(Treatment) <- contr.sum(2)
> design <- model.matrix(~Strain*Treatment)

以下解释定义了四个系数:

Coeffcient Comparison Interpretation
Intercept (WT.U+WT.S+Mu.U+Mu.S)/4 Grand mean
Strain1 (WT.U+WT.S-Mu.U-Mu.S)/4 Strain main effect
Treatment1 (WT.U-WT.S+Mu.U-Mu.S)/4 Treatment main effect
Strain1:Treatment1 (WT.U-WT.S-Mu.U+Mu.S)/4 Interaction

该参数化具有许多吸引人的数学特性,是经典的参数化,用于很多实验设计理论中的因子设计。但是它只定义了我们直接感兴趣的一个系数,即相互作用。三个我们感兴趣的对比可以使用下面命令提取

> fit <- lmFit(eset, design)
> cont.matrix <- cbind(SvsUinWT=c(0,0,-2,-2),SvsUinMu=c(0,0,-2,2),Diff=c(0,0,0,4))
> fit2 <- contrasts.fit(fit, cont.matrix)
> fit2 <- eBayes(fit2)

结果与前三种方法相同。

这里描述的解决2×2因子问题的各种方法是等价的,不同仅存在于线性模型的参数化选择中。拟合的模型对象fit仅在coefficients和相关组件中有所不同。剩余标准差fit$sigma,剩余自由度fit$df.residualfit2的所有组件都是相同的,即使使用了不同的参数化。由于方法是等效的,用户可以自由选择哪一个最直观或最方便。

9.6 时间过程实验

9.6.1 重复时间点

时间过程实验是在一些实验处理或刺激开始以后的几个时间点提取RNA的实验。分析时间过程实验的最佳方法取决于实验的性质,特别是不同时间点的数量。我们首先考虑具有相对较少重复时间点的实验。简单的这种类型的时间过程实验与9.3节中涉及的多组实验相似。

例如,我们这里考虑一个双向实验,其中将要进行两种基因型的时间流程分析比较。考虑下列目标框架

FileName Target
File1 wt.0hr
File2 wt.0hr
File3 wt.6hr
File4 wt.24hr
File5 mu.0hr
File6 mu.0hr
File7 mu.6hr
File8 mu.24hr

目标是在0,6和24小时时间点从野生型和突变型动物收集的RNA样品。这可以被看作是一个因子实验,但是更简单的方法是使用群体平均参数化。

> lev <- c("wt.0hr","wt.6hr","wt.24hr","mu.0hr","mu.6hr","mu.24hr")
> f <- factor(targets$Target, levels=lev)
> design <- model.matrix(~0+f)
> colnames(design) <- lev
> fit <- lmFit(eset, design)

野生型的哪些基因在6小时或24小时内响应?我们可以通过提取野生型时间之间的对比找到这些基因。

> cont.wt <- makeContrasts(
+ "wt.6hr-wt.0hr",
+ "wt.24hr-wt.6hr",
+ levels=design)
> fit2 <- contrasts.fit(fit, cont.wt)
> fit2 <- eBayes(fit2)
> topTableF(fit2, adjust="BH")

三个时间点之间的任何两个对比将产生相同的结果。例如,相同的基因列表将通过“wt.24hr-wt.0hr”得到而不是“wt.24hr-wt.6hr”

哪些基因在突变型中响应(即随时间发生变化)?

> cont.mu <- makeContrasts(
+ "mu.6hr-mu.0hr",
+ "mu.24hr-mu.6hr",
+ levels=design)
> fit2 <- contrasts.fit(fit, cont.mu)
> fit2 <- eBayes(fit2)
> topTableF(fit2, adjust="BH")

相对于野生型,突变型中哪些基因随时间推移响应不同?

> cont.dif <- makeContrasts(
+ Dif6hr =(mu.6hr-mu.0hr)-(wt.6hr-wt.0hr),
+ Dif24hr=(mu.24hr-mu.6hr)-(wt.24hr-wt.6hr),
+ levels=design)
> fit2 <- contrasts.fit(fit, cont.dif)
> fit2 <- eBayes(fit2)
> topTableF(fit2, adjust="BH")

本节中描述的分析方法用于组蛋白脱乙酰酶抑制剂六点时间过程实验[25]。

9.6.2 多时间点

现在我们考虑一个每组有很多时间点的例子。当有很多时间点时,假设表达随着时间平滑地变化而不是从一个时间点到另一个时间点的离散式变化是合理的。这种类型的时间过程可以通过使用回归样条或多项式拟合时间趋势来分析。

考虑以下32行目标框架:

FileName Group Time
File1 Control 1
File2 Control 2
. . .
. . .
. . .
File16 Control 16
File17 Treat 1
File18 Treat 2
. . .
. . .
. . .
File32 Treat 16

利用适量节点的三次样条曲线表示特定条件下特定基因的时间过程可能是合理的。选择有效的自由度在范围3-5内是合理的。为自然回归样条设置基础:

> library(splines)
> X <- ns(targets$Time, df=5)

然后为对照组和实验组单独拟合曲线:

> Group <- factor(targets$Group)
> design <- model.matrix(~Group*X)
> fit <- lmFit(y, design)
> fit <- eBayes(fit)

创建了一个具有12个参数的模型,最后5个对应于相互作用,也就是组间曲线的差异。检测对照组和实验组不同时间趋势的基因:

> topTable(fit, coef=8:12)

对5 df上的每个基因进行了一个调节F检验,可以检测出非常普遍的实验和对照曲线之间的差异。

注意,对于这种分析没有必要进行重复,也没有必要在相同的时间点观察两个实验组。

9.7 多层次实验

我们考虑了配对比较,考虑了两个独立组的比较。然而,有实验结合了这两种类型的比较。

考虑使用以下目标框架的单通道实验:

FileName Subject Condition Tissue
File01 1 Diseased A
File02 1 Diseased B
File03 2 Diseased A
File04 2 Diseased B
File05 3 Diseased A
File06 3 Diseased B
File07 4 Normal A
File08 4 Normal B
File09 5 Normal A
File10 5 Normal B
File11 6 Normal A
File12 6 Normal B

该实验涉及6名受试者,其中3名患有该疾病的患者和3名正常受试者。每个受试者,我们有两种组织类型的表达谱,A和B。

在分析本实验时,我们要比较两种组织类型。这个比较可以在受试者内进行,因为每个受试者都会产生两种组织的值。我们也想比较患病对象和正常受试者,但这种比较是受试者之间的。

如果我们只想比较两种组织类型,我们可以做一个配对的样本比较。如果我们只想比较生病的和正常的受试者,我们可以做一个普通的两组比较。由于我们需要在受试者本身和之间进行比较,因此需要把患者作为随机效应。可以使用duplicateCorrelation函数在limma中完成。

两个实验因素条件和组织可以以多种方式处理。在这里,我们假设将两者合并成一个组合因素是方便的:

> Treat <- factor(paste(targets$Condition,targets$Tissue,sep="."))
> design <- model.matrix(~0+Treat)
> colnames(design) <- levels(Treat)

然后我们估计同一受试者的测量数据之间的相关性:

> corfit <- duplicateCorrelation(eset,design,block=targets$Subject)
> corfit$consensus

然后将该对象内相关性输入到线性模型拟合中:

> fit <- lmFit(eset,design,block=targets$Subject,correlation=corfit$consensus)

现在我们可以通过常规方式对实验条件进行比较,例如:

> cm <- makeContrasts(
+ DiseasedvsNormalForTissueA = Diseased.A-Normal.A,
+ DiseasedvsNormalForTissueB = Diseased.B-Normal.B,
+ TissueAvsTissueBForNormal = Normal.B-Normal.A,
+ TissueAvsTissueBForDiseased = Diseased.B-Diseased.A,
+ levels=design)

然后计算这些对比和缓和t检验:

> fit2 <- contrasts.fit(fit, cm)
> fit2 <- eBayes(fit2)

然后

> topTable(fit2, coef="DiseasedvsNormalForTissueA")

将找到在A组织类型中正常和患病受试者之间差异表达的那些基因,等等。
这个实验有两个级别的差异性。首先,人与人之间存在差异,我们称之为受试者之间的层次。那么同一受试者重复测量的可变性称为受试者内层次。受试者间层次通常认为大于受试者内层次,因为后者被调整为受试者之间的基线差异。在这里,组织类型之间的比较可以在受试者内进行,因此应该比病人和正常人之间的比较要精确得多。

你可能感兴趣的:(第9章 单通道实验设计)