那什么是多重比较,什么是FDR校正呢?多重比较是统计学中的术语。当我们进行多次统计检验后,假阳性的次数就会增多,所以要对假阳性进行校正。 那什么是FDR校正呢? 先解释三个指标: Vaa,Via, Da=Vaa+Via。这个三个指标表示的是在V(比如这里V指体素个数)次测试中,它们各自出现了多少次。 FDR公式如下: 或者,我们可以用中文表达该公式: (为什么是岳不群,而不是东方不败加日月神教=武林至尊,一统江湖? FDR和FWE的校正水平都设为0.05。那么FDR说的是在20000个激活的体素中,假阳性的体素不超过20000*0.05=1000个。 FWE比FDR严格(好气哦,FEW什么的最讨厌了啦,法海你不懂爱!),是因为FWE控制的是全脑中假阳性次数,FDR控制的是我们发现的激活(Declared active)的体素中假阳性次数。
FDR 我们往期有许多推文介绍了各种进行多重检验矫正的方法,其中就包括了如何计算FDR 一文了解P-value,多重比较,FDR和Q value的差别 转录组差异分析P值与FDR值区别有多大 p.value 和FDR 首先我们需亚了解差异表达分析的基本假设: H0:差别是由抽样误差所致; H1:差别不是由抽样误差所致,即并不来自同一总体 ###这里我用到哈佛大学统计的一个数据集 library(devtools and Hochberg(BH)) 错误发现率FDR= 0.05。 一种控制 FDR 的方法:让 k 成为最大的 i,使得p(i) <= (i/m) * alpha,(m 是比较次数)然后拒绝 H(i) for i =1, 2, …k 通过下面的图,可以更好理解 ## i <= alpha p_adjusted(i) = p(i) * (m/i),其中 p(i) 是原始的第 i 个 p 值,m 是的检验个数 sum( p.adjust(pvals, method="<em>fdr</em>
一、概述 M241 PLC 的工业以太网通讯接口作为Ethernet IP 主站与ATV340 进行通讯,所有的参数均通过M241 PLC 来进行配置,并且ATV340 支持FDR(Fast Device 设置给定通道与命令通道,均为内置以太网,如下: 19、在参数列表中,设置内置以太网的基本参数,如下: 20、在参数列表中,设置内置以太网的通讯协议参数,如下: 21、在参数列表中,设置内置以太网的FDR 提示如下: 23、下载参数至ATV340 完成,如下: 24、程序编写 Ethernet IP 通讯的库文件中PLCopen 功能块的前缀均为GIPLC,如下: 25、视图 六、ATV340 的FDR
本文,笔者对Bonferroni和False Discovery Rate(FDR)两种校正方法进行论述,特别是对于应用比较广的FDR校正方法,笔者用具体的例子详细阐述了其原理,并给出其Matlab程序 FDR 校正方法 这里,笔者主要对FDR校正方法的原理进行论述。FDR校正方法是Benjamini和Hochberg于1995年提出了一种多重比较校正的方法。 基于BH法的FDR校正过程: 第一步:将我们单独统计得到的一系列的p=[p1,p2,…,pn]从大到小进行重新排序,计为P=[P1,P2,…,Pn]; 第二步:按照以下公式计算每个P值所对应的校正前的FDR 最终得到Q值称之为校正后的FDR值。 第四步:按照重排序之前的顺序返回各个p值对应的校正后的FDR值。 值为:FDR=[ 0.0500, 0.0467, 0.0420, 0.0420, 0.0420, 0.0350, 0.0350]; 最后,转换成原来的顺序:FDR=[0.0350, 0.0350, 0.0420
FDR会记录些什么? 没有FDR,或者找不到FDR,基本上客机失事就会成为一个永远的谜团。 下图展示了FDR在飞机上的位置,以及数据的收集: ? 而越来越复杂的软件系统也有这样的问题。 这时候,我们就要求助于软件系统中的FDR了。 最典型,也是最原始的FDR是log。几乎所有的软件都有log。 网上关于软件系统中的FDR的信息还很少,除了我了解的systemtap的flight record mode(FRM)外,就是Java中对FDR的支持了。我们先看Java FDR。 Java FDR是建立在JVM中的,所以只要JVM使能了FDR,所有运行在其上的application都将受益(这又是indirection好处的一大佐证)。
东航MU5735“黑匣子”——FDR和CVR 东航MU5735航班型号是波音737 800NG,里面搭载两个“黑匣子”,一个是飞行数据记录器FDR,在发动机启动时记录,记录时长约25小时、参数约1000 霍尼韦尔官网上介绍的FDR和CVR都只有一款,分别是HFR5-V CVR和HFR5-D FDR,适配机型只写了波音737系列。 对比事故现场找到的CVR“黑匣子”,应该就是这一款。 FDR——还原事故真相的核心 FDR不同于CVR,CVR中的录音只代表机组人员对事故的判断,结合一些数据信息,可以进行事故原因的推断。 但是FDR记录了整个飞行的数据,能为界定此次事故的直接原因提供详细的数据支持,所以,FDR和CVR两者的数据是互补的,缺一不可,相互佐证的。 FDR的记录时间也是在发动机启动时开始记录,发动机停车后停止记录,所以这次航班的飞行信息,没有意外的话也全部被FDR记录下来。 找到“黑匣子”之后,得出结论还要多久?
(mean(as.numeric(dt_Con[i,])))) } library(dplyr) library(tidyr) library(tibble) # 对p value进行FDR 校正 fdr=p.adjust(Pvalue, "BH") # 在原文件后面加入log2FC,p value和FDR,共3列; out<- as.data.frame(cbind(log2_FC,Pvalue ,fdr)) out$gene <- rownames(dt_Con) # out <- out %>% # dplyr::filter(log2_FC > 0.5 & Pvalue < 0.05) 校正 fdr=p.adjust(Pvalue, "BH") # 在原文件后面加入log2FC,p value和FDR,共3列; out<- as.data.frame(cbind(log2_FC,Pvalue 校正 fdr=p.adjust(Pvalue, "BH") # 在原文件后面加入log2FC,p value和FDR,共3列; out<- as.data.frame(cbind(log2_FC,Pvalue
<- deseq_res_df %>% dplyr::filter(padj < 0.05) dim(fdr_deseq) ## [1] 5 6 head(fdr_deseq) ## = 0.05) fdr_corncob <- corn_da$significant_taxa dim(data.frame(fdr_corncob)) ## [1] 28 1 head(sort <- mas_res_df %>% dplyr::filter(qval < 0.05) dim(fdr_mas) ## [1] 27 10 head(fdr_mas) ## 不同方法结果之间的 overlap x <- list(limma = fdr_limma$Species, deseq2 = fdr_deseq$Species, corncob = fdr_corncob, maaslin2 = fdr_mas$feature, ancom = fdr_ancom$Species)
3 FDR NES确定后,判断其中可能包含的错误阳性发现率。FDR=25%意味着对此NES的确定,4次可能错 1次。GSEA结果中,高亮显示FDR<25%的富集set。 大多数情况下,选FDR<25%是合适的,但是,假如分析的芯片data set较少,选择的是探针随机组合而不是表型组合,若p不严格,那么应该选FDR<5%。 一般而言,NES绝对值越大,FDR值就越小,说明富集程度高,结果可靠。 以上4个参数中,只有FDR进行了功能gene子集大小和多重假设检验矫正,而p值没有,因此,如果结果中有一个高度富集的功能gene子集,而其有很小的名义p-value和大的FDR意味着富集并不显著。 我的一个具体结果解读: 92/681 gene sets are upregulated in PH 0 gene sets are significantly enriched at FDR<25%
输出参数 名称 类型 默认显示 描述 date str Y - FR001 float Y 注意单位: % FR007 float Y 注意单位: % FR014 float Y 注意单位: % FDR001 float Y 注意单位: % FDR007 float Y 注意单位: % FDR014 float Y 注意单位: % 接口示例 import akshare as ak repo_rate_hist_df 20200930", end_date="20201029") print(repo_rate_hist_df) 数据示例 date FR001 FR007 FR014 FDR001 FDR007 FDR014 0 2020-10-29 2.1500 3.1500 2.9500 2.1200 2.4900 2.9000 1 2020-10-28 2.4800
between projection scores on cytokine-treated cells and projection scores on PBS-treated cells, and an FDR The effect size and FDR-adjusted P value for each of the 86 cytokines can then be visualized using a <- p.adjust(p_values, method = "<em>fdr</em>") return(fdr_p_values) } 进行统计检验和FDR校正 # 进行统计检验和FDR校正 sample_info <- perform_statistical_tests(scores, group_labels) print(fdr_p_values) # 6.443092e-16 1.781591e-01 (FDR < 0.05, Score, 0)) %>% select(State, Score) %>% pivot_wider(names_from = State, values_from
校正 fdr=p.adjust(Pvalue, "BH") # 在原文件后面加入log2FC,p value和FDR,共3列; out<- as.data.frame(cbind(log2_FC,Pvalue ,fdr)) out$gene <- rownames(dt_Con) # out <- out %>% # dplyr::filter(log2_FC > 0.5 & Pvalue < 0.05) 校正 fdr=p.adjust(Pvalue, "BH") # 在原文件后面加入log2FC,p value和FDR,共3列; out<- as.data.frame(cbind(log2_FC,Pvalue ,fdr)) out$gene <- rownames(dt_Con) # out <- out %>% # dplyr::filter(log2_FC > 0.5 & Pvalue < 0.05) 校正 fdr=p.adjust(Pvalue, "BH") # 在原文件后面加入log2FC,p value和FDR,共3列; out<- as.data.frame(cbind(log2_FC,Pvalue
<- deg.all geneList$threshold <- c() geneList$threshold[geneList$logFC > log(fc, 2) & geneList$FDR >= pval] <- 2 geneList$threshold[geneList$logFC < -log(fc, 2) & geneList$FDR < volcano <- ggplot(data = geneList, aes(x = logFC, y = -log10(FDR threshold), alpha = 1, size = 0.8) + xlab("log2(Fold Change)") + ylab("-log10(FDR <- deg.all geneList$threshold <- c() geneList$threshold[geneList$logFC > log(fc, 2) & geneList$FDR
edgeR 在默认情况下,执行TMM标准化程序以考虑样本之间的不同测序深度,通过Benjamini-Hochberg用于控制FDR 。 Limma包基于线性模型建模。 默认情况下,Benjamini-Hochberg程序用于估计FDR 。 DESeq使用类似于edgeR的负二项式模型,与edgeR类似,执行缩放因子归一化以考虑不同样本的变化的测序深度,并且Benjamini-Hochberg用于控制FDR。 et) ordered_tags <- topTags(et, n=100000) allDiff=ordered_tags$table allDiff=allDiff[is.na(allDiff$FDR diff$logFC<(-foldChange))),] write.csv(diffSig, file="edger_diffSig.csv") # # diffUp = diff[(diff$FDR
4.meta分析结果整理 res <- bind_cols(dat, res) %>% mutate( FDR = p.adjust(Meta_Pval, method = "BH") ) %>% filter(is.finite(Pooled_ES), is.finite(Meta_Pval), is.finite(FDR)) %>% # 防止FDR极小被数值舍入到0,导致 -log10(FDR) = Inf mutate(FDR_plot = pmax(FDR, 1e-300)) head(res) ## Symbol logFC_dat1 SE_dat1 <- 0.05 cutoff_es <- 0.585 # 约等于1.5倍 res <- res %>% mutate( group = case_when( FDR < cutoff_fdr & Pooled_ES > cutoff_es ~ "Up", FDR < cutoff_fdr & Pooled_ES < -cutoff_es ~ "Down",
针对这样的问题,Benjaminiand Hochberg(1995) 提出了FDR校正方法。 四、FDR校正 Bonferroni校正关注的是,所有检验中的第一类错误检验(被错误拒绝的检验),而FDR的关注的是,所有拒绝掉的检验中,错误拒绝的检验,如果觉得绕口的话可以看下面的图: ? FDR(Falsely Discovery Rate)的定义为: ? 实际上,FDR也就是错误拒绝的检验个数,占所有拒绝的检验个数的比例。 至此,完成FDR的校正。 举个例子吧,加入我们做个20个检验,每个检验有一个P值,那么我们分别用Bonferroni校正和FDR校正,得到的结果如下: ? 可以看出Bonferroni校正的结果要严格很多,FDR则比较中肯。
然后是绘图,先对数据做一下处理: table(diff_sc$Group) diff_sc <- diff_sc[abs(diff_sc$avg_log2FC)>0.58, ] diff_sc$log10fdr <- -log10(diff_sc$p_val_adj) # 处理一下极大值 diff_sc$log10fdr[diff_sc$log10fdr=="Inf"] <- max(diff_sc$log10fdr [diff_sc$log10fdr! "#f66464") 开始绘图: # 基础火山图 p <- ggplot() + geom_point(data = diff_sc, aes(x = avg_log2FC, y = log10fdr 加粗分面标题 ) # 添加基因symbol p + geom_text_repel( data = top10, aes(x = avg_log2FC, y = log10fdr
/data/science.adk0775_data_s1.csv" ) head(group1) # 提取FDR值和FC值 group1 <- group1[,c("external_gene_name ","logFC","FDR" )] group1 <- group1[group1$external_gene_name! rownames(group1) <- group1$external_gene_name head(group1) # external_gene_name logFC FDR group2) <- group2$external_gene_name head(group2) # external_gene_name ERKi_24_hr.logFC ERKi_24_hr.FDR < 0.01 ] <- "up" group2$g2[group2$ERKi_24_hr.logFC < -0.5 & group2$ERKi_24_hr.FDR < 0.01 ] <- "down"
, qvalue=0.05 ) end_time <- Sys.time() end_time - start_time # 1] "4435 significantly DE genes (FDR <0.05)." # [1] "3268 significantly DE genes (FDR<0.01)." # Time difference of 1.796054 mins 我们最后保留的也就是 4435 significantly DE genes (FDR<0.05). ", sep="")) print(paste(nrow(sig_genes_0.01), " significantly DE genes (FDR<0.01). groups = groups , B = 1000 , K = 500 , seed = 1234) summary_pop1<-data.frame(summary(results_pop1, fdr
使用p.adjust函数进行FDR校正(这是一个典型的向量化操作) # "fdr" 是校正方法,也可以是 "bonferroni", "BH" 等 adjusted_p_values <- p.adjust (raw_p_values, method = "<em>fdr</em>") print("FDR校正后的P值:") print(adjusted_p_values) # 思考:如果raw_p_values中混入了字符型数据 场景: 我们得到了一份包含基因ID、log2FC和FDR值的差异表达分析结果。 # 1. 添加一列 -log10(FDR),用于火山图Y轴,数值越大表示越显著 diff_expression_df$neglog10FDR <- -log10(diff_expression_df$FDR) print ("添加-log10(FDR)列后的数据框:") print(diff_expression_df) # 3.