R二项分布检验与FDR校正

本文介绍了二项分布在生物领域的应用,特别是针对等位基因重组等现象。通过一个实例展示了如何在R中进行二项分布检验,并通过控制False Discovery Rate (FDR)来确定P值阈值,以确保统计学上的显著性水平。通过对候选基因的P值排序和计算,找到了控制FDR不超过给定值的方法,从而选择差异表达基因。

二项分布是重复n次的实验,且每次实验都是独立的,只有两种结果,并且相互对立的,生活中最常见的是投硬币~~~在生物领域内也有很多符合此类分布的,如二倍体动物等位基因,来源于父本和母本的重组等。具体公式什么的博主就不写了,写个关于ASE的例子吧。

# cat binom.r | R --slave --args <file>
args <- commandArgs()
fa <- read.table(args[4], header=FALSE, sep="\t")
n1 = fa$V8
n2 = fa$V12
len = length(n1)
pv = numeric(len)
for(i in 1:len){
pv[i] = 0
if(n1[i] > n2[i]) pv[i]=binom.test(n1[i], n1[i]+n2[i], p=1/2, alternative="greater")$p.value else pv[i]=binom.test(n2[i], n1[i]+n2[i], p=1/2, alternative="greater")$p.value
}
qv <- p.adjust(pv, method="fdr")#fdr校正
fa$pv = formatC(pv, digits=4)
fa$fdr = formatC(qv, digits=4)
write.table(fa, file=paste(args[4],".out",sep=""), sep="\t", col.names=FALSE, row.names=FALSE, quote=FALSE)

其实也不算是什么例子,就是把过程写下来熟悉一下写法而已。

通过控制FDR(False Discovery Rate)来决定P值的域值。假设你挑选了R个差异表达的基因,其中有S个是真正有差异表达的,另外有V个其实是没有差异表达的,是假阳性的。实践中希望错误比例Q=V/R平均而言不能超过某个预先设定的值(比如0.05),在统计学上,这也就等价于控制FDR不能超过5%。对所有候选基因的p值进行从小到大排序,则若想控制fdr不能超

<think> 我们参考了用户提供的三个引用,其中引用[1]提到了使用limma和edgeR进行差异分析的一般步骤,引用[2]提到了火山图以及差异分析中常用的两个统计量(logFC和校正后的p值),引用[3]则解释了FDR校正的概念。 用户当前的问题:查找R语言进行组间差异分析以及FDR校正的方法。 根据引用[1],使用limma和edgeR进行差异分析的基本步骤包括: 1. 安装及加载edgeR、limma包 2. 导入数据,设置分组,构建DGEList对象 3. 过滤低表达的基因,进行标准化处理 4. 估算离散值 5. 差异分析 在差异分析中,我们会得到每个基因的p值,但由于进行了多次检验(每个基因一次),因此需要进行多重检验校正FDR(False Discovery Rate)是常用的一种校正方法。 下面我们将详细说明如何使用R语言(主要是limma包)进行组间差异分析,并实施FDR校正。 步骤1:安装和加载包 ```r # 如果尚未安装,先安装包 if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install(c("limma", "edgeR")) # 加载包 library(limma) library(edgeR) ``` 步骤2:导入数据,构建DGEList对象 假设我们有一个表达矩阵(expr_matrix),行是基因,列是样本;还有一个分组向量(group),表示每个样本属于哪一组(比如突变组和非突变组)。 ```r # 假设expr_matrix是一个矩阵,行名为基因名,列名为样本名 # group是一个向量,长度等于样本数,例如:group <- c("mut", "mut", "wt", "wt") # 创建DGEList对象 dge <- DGEList(counts=expr_matrix, group=group) ``` 步骤3:过滤低表达基因,并进行标准化 ```r # 过滤低表达基因:保留在至少一些样本中表达的基因(例如,在至少两个样本中计数大于1) keep <- rowSums(dge$counts>1) >= 2 dge <- dge[keep, , keep.lib.sizes=FALSE] # 标准化(使用TMM方法) dge <- calcNormFactors(dge) ``` 步骤4:估算离散值(使用edgeR的estimateDisp或limma的voom) 这里我们展示两种方法,但要注意limma通常用于处理微阵列数据或经过voom转换的RNA-seq数据。 方法一:使用edgeR的精确检验(适用于RNA-seq计数数据) ```r # 估算离散度 dge <- estimateDisp(dge) # 进行精确检验 et <- exactTest(dge) # 提取结果 topTags(et) # 查看差异最显著的一些基因 results_edgeR <- topTags(et, n=Inf, sort.by="PValue")$table ``` 方法二:使用limma的voom(适用于RNA-seq计数数据)或直接处理连续数据 下面以voom为例: ```r # 设计矩阵 design <- model.matrix(~group) # 使用voom转换 v <- voom(dge, design, plot=TRUE) # 然后使用lmFit和eBayes fit <- lmFit(v, design) fit <- eBayes(fit) # 获取所有基因的结果 results_limma <- topTable(fit, coef=2, n=Inf, sort.by="P") ``` 在上述两种方法中,结果中都会包含每个基因的p值。 步骤5:FDR校正 实际上,在edgeR的exactTest和limma的eBayes中,已经对p值进行了多重检验校正(默认是Benjamini-Hochberg方法,即FDR校正)。例如: - 在edgeR的`topTags`函数返回的结果中,有一个列名为`FDR`的列,就是校正后的p值(即q值)。 - 在limma的`topTable`函数返回的结果中,有一个列名为`adj.P.Val`的列,也是校正后的p值(FDR校正)。 因此,我们无需额外进行校正,结果中已经包含校正后的p值。 但是,如果我们从其他分析中得到了原始的p值,我们也可以手动进行FDR校正: ```r # 假设p_values是一个包含所有基因原始p值的向量 fdr_values <- p.adjust(p_values, method="BH") ``` 总结: 1. 使用edgeR或limma进行差异分析时,它们的结果中已经提供了FDR校正后的p值(在edgeR中为FDR,在limma中为adj.P.Val)。 2. 如果我们需要手动校正,可以使用R中的`p.adjust`函数,指定method="BH"(即Benjamini-Hochberg方法)。 注意:在引用[3]中,FDR校正正是针对多重检验问题,以避免假阳性结果过多。 因此,用户可以直接从edgeR或limma的分析结果中获取FDR校正后的值,并根据校正后的p值(通常设定阈值如0.05)和logFC(通常设定阈值如|logFC|>1)来筛选差异表达基因。 下面我们用一个完整的limma流程(使用voom转换)来展示如何得到结果: 完整代码示例(假设数据已准备好): ```r library(limma) library(edgeR) # 1. 读入数据 # 表达矩阵(假设名为count_data) # 分组信息(假设名为groups,包含突变和非突变两组) # 2. 创建DGEList,过滤,标准化 dge <- DGEList(counts=count_data, group=groups) keep <- rowSums(cpm(dge)>1) >= 2 # 使用cpm值进行过滤 dge <- dge[keep, , keep.lib.sizes=FALSE] dge <- calcNormFactors(dge) # 3. 设计矩阵,voom转换,线性模型拟合 design <- model.matrix(~groups) # 注意groups是因子 v <- voom(dge, design, plot=TRUE) fit <- lmFit(v, design) fit <- eBayes(fit) # 4. 提取结果 results <- topTable(fit, coef=2, n=Inf, sort.by="P") # 结果中,logFC表示对数倍数变化,P.Value为原始p值,adj.P.Val为FDR校正后的p值 # 5. 根据adj.P.Val和logFC筛选差异基因 diff_genes <- subset(results, adj.P.Val < 0.05 & abs(logFC) > 1) ``` 这样,我们就得到了差异表达基因。 注意:上述示例是针对两组比较的情况。如果是多组比较,需要调整设计矩阵和对比矩阵。 希望这个回答对用户有帮助。 </think> ### R语言进行组间差异分析及FDR校正的方法 根据引用内容,使用R语言进行组间差异分析(如基因表达差异)和FDR校正的主要步骤如下: #### 1. **安装并加载所需包** ```r # 安装Bioconductor包 if (!require("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install(c("limma", "edgeR")) # 加载包 library(limma) library(edgeR) ``` #### 2. **数据导入预处理** ```r # 导入表达矩阵(行=基因,列=样本) expr_matrix <- read.csv("expression_data.csv", row.names=1) # 设置分组(例如:突变组vs非突变组) group <- factor(c(rep("Mutant", 10), rep("WildType", 10))) # 示例分组 # 构建DGEList对象 dge <- DGEList(counts=expr_matrix, group=group) ``` #### 3. **过滤低表达基因标准化** ```r # 过滤低表达基因(CPM>1的样本数至少2个) keep <- rowSums(cpm(dge) > 1) >= 2 dge <- dge[keep, , keep.lib.sizes=FALSE] # TMM标准化 dge <- calcNormFactors(dge) ``` #### 4. **差异分析(以limma为例)** ```r # 创建设计矩阵 design <- model.matrix(~0 + group) colnames(design) <- levels(group) # voom转换消除均值-方差趋势 v <- voom(dge, design, plot=TRUE) # 线性模型拟合 fit <- lmFit(v, design) cont.matrix <- makeContrasts(Mutant_vs_WT = Mutant - WildType, levels=design) fit2 <- contrasts.fit(fit, cont.matrix) fit2 <- eBayes(fit2) ``` #### 5. **FDR校正** ```r # 提取结果并自动进行FDR校正(Benjamini-Hochberg方法) results <- topTable(fit2, coef="Mutant_vs_WT", number=Inf, adjust.method="BH") # 查看校正后结果(adj.P.Val列即FDR值) head(results[order(results$adj.P.Val), ]) ``` 输出结果包含关键列: - `logFC`:对数倍数变化 - `P.Value`:原始p值 - `adj.P.Val`:FDR校正后的p值[^3] #### 6. **筛选显著差异基因** ```r # 筛选标准:|logFC|>1 & FDR<0.05 sig_genes <- subset(results, abs(logFC) > 1 & adj.P.Val < 0.05) ``` #### 关键说明: 1. **FDR校正原理**: 针对多重假设检验问题(如数万个基因),Benjamini-Hochberg方法控制假阳性率,比传统Bonferroni校正更灵活[^3]。 2. **结果解读**: - `logFC > 0`:上调基因 - `logFC < 0`:下调基因 - `adj.P.Val < 0.05`:差异显著(FDR<5%) 3. **可视化**: 可使用火山图展示结果(横轴=logFC,纵轴=-log10(adj.P.Val))[^2] ```r # 示例火山图代码 plot(results$logFC, -log10(results$adj.P.Val), xlab="log2(Fold Change)", ylab="-log10(FDR)", col=ifelse(results$adj.P.Val<0.05 & abs(results$logFC)>1, "red", "grey")) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值