limma中coef的含义及两种差异分析代码结果不一致的原因咨询
coef含义与两段代码差异的解析 嘿,我来帮你拆解这个limma里的问题,先从coef参数的含义说起,再对比那两段代码的核心差异~
1. limma中coef参数的含义
在limma里,coef的作用是指定你要检验的设计矩阵中的某一列对应的回归系数。简单来说,设计矩阵的每一列都对应模型里的一个效应(比如分组差异、交互效应),coef=N就是告诉limma:我要检验第N列的这个系数是否显著不等于0,也就是这个效应是否存在统计学意义。
拿你给出的设计矩阵例子来看:
colnames(design) [1] "(Intercept)" "StrainMu" "StrainWT:TreatmentS" "StrainMu:TreatmentS"
这里coef=4对应的就是第4列的StrainMu:TreatmentS系数,检验的是Mu菌株中,S处理组相对于U处理组的表达差异是否显著不等于0(结合模型结构,这个系数直接对应Mu菌株内处理的差异)。
2. 两段代码结果不同的核心原因
这两段代码本质上是在做完全不同的假设检验,结果自然不一样,咱们逐段拆解:
第一段代码:直接检验第4个系数
fit <- eBayes(fit); topTable(fit, coef=4)
这段代码是在原模型的基础上,直接对第4列的StrainMu:TreatmentS系数做显著性检验,对应的假设是:
H0:
StrainMu:TreatmentS系数 = 0(即Mu菌株中S处理和U处理没有表达差异)
H1:该系数 ≠ 0(即Mu菌株中两种处理存在显著差异)
第二段代码:自定义对比检验
fit <- contrasts.fit(fit, c(-1,0,0,1)); fit <- eBayes(fit); topTable(fit)
这里的关键是contrasts.fit函数,你传入的对比向量c(-1,0,0,1)是对设计矩阵的所有系数做线性组合,对应到模型里的假设是:
H0:(-1)Intercept + 0StrainMu + 0StrainWT:TreatmentS + 1StrainMu:TreatmentS = 0
也就是:StrainMu:TreatmentS系数 = Intercept系数
而Intercept在你的模型里代表的是WT菌株未刺激(U组)的平均对数表达水平,所以这段代码检验的是:Mu菌株中S处理相对于U处理的表达差异,是否等于WT菌株U组的平均表达水平——这和第一段检验“差异是否为0”的假设完全不是一回事,结果自然会不同。
内容的提问来源于stack exchange,提问作者jkd

