利用matlab进行FDR校正的实现方式

方法一:

利用mafdr函数:(此方法较宽松)

matlab 复制代码
p = [0.0735,0.1096,0.7107,0.0265,0.3577,0.1863,0.9244,0.8474,0.0757,0.0426,0.0725,0.0734];
p_fdr = mafdr(p)

方法二:

利用fdr计算公式,对p值进行排序,然后计算:

matlab 复制代码
function [FDR] = fdr_code(p)
% FDR校正函数(Benjamini-Hochberg过程)
% 输入:
%   p: 原始p值向量(1×N 或 N×1)
% 输出:
%   FDR: 经FDR校正后的p值向量,与输入p顺序一致

% 示例数据(实际使用时应修改为需要校正的p值)
p = [0.000260371, 0.000545143, 0.00077793, 0.000834163, 0.000949469, 0.001094615];

% 确保p是行向量,便于后续处理
p = p(:)';  % 转为行向量

% 对p值从大到小排序,并记录原始索引
[sorted_p, sort_idx] = sort(p, 'descend');  % sorted_p: 降序排列的p值;sort_idx: 排序后每个元素在原数组中的位置

N = length(sorted_p);          % 总假设检验数量
rank = N:-1:1;                 % 对应每个p值的"排名"(最大p对应排名N,最小对应1)

% 计算初始的BH阈值:Q_i = (p_i * N) / i,其中i是从大到小的排名(即 rank)
Q = (sorted_p * N) ./ rank;    % 元素级运算,得到每个位置的未调整FDR阈值

% 从左到右(即从大p到小p)进行单调性约束:确保Q非增(即后面的不能比前面的大)
for i = 1:N-1
    if Q(i+1) > Q(i)
        Q(i+1) = Q(i);         % 强制保持非递增,满足BH过程要求
    end
end

% 将校正后的Q值按原始p值的顺序还原
FDR = zeros(1, N);             % 初始化输出向量
for i = 1:N
    original_pos = sort_idx(i);        % 当前排序后第i个元素在原始p中的位置
    FDR(original_pos) = Q(i);          % 将Q(i)放回原始位置
end

% 注意:此FDR是"校正后的阈值",通常用于与原始p比较判断显著性;
% 若需返回"adjusted p-values"(即最小的α使得该假设被拒绝),此实现是正确的。
end
相关推荐
wabs6668 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964138 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚8 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本9 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov10 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫10 小时前
特征工程处理
人工智能·算法·机器学习
z落落11 小时前
C#参数区别
java·算法·c#
c2385611 小时前
vector(下)
数据结构·算法
z落落11 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法
wyy1851007372811 小时前
双路并行:一套匹配算法如何解决中文制单的两大核心难题
算法·ai·crm·crm系统