利用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
相关推荐
野蛮人6号1 小时前
力扣热题100道之31下一个排列
算法·leetcode·职场和发展
子一!!1 小时前
哈希桶,元素插入逻辑实现
算法·哈希算法
敲代码的嘎仔1 小时前
LeetCode面试HOT100——160. 相交链表
java·学习·算法·leetcode·链表·面试·职场和发展
吃着火锅x唱着歌1 小时前
LeetCode 454.四数相加II
算法·leetcode·职场和发展
敲代码的嘎仔1 小时前
LeetCode面试HOT100—— 206. 反转链表
java·数据结构·学习·算法·leetcode·链表·面试
自然语1 小时前
深度学习时代结束了,2025年开始只剩下轮廓
数据结构·人工智能·深度学习·学习·算法
海天一色y1 小时前
Leetcode07-整数反转
算法
im_AMBER1 小时前
Leetcode 66 几乎唯一子数组的最大和
数据结构·笔记·学习·算法·leetcode
Aspect of twilight1 小时前
华为华为AI岗实习面试算法题
算法·华为·面试