利用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
相关推荐
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
简简单单做算法1 天前
基于GA遗传优化的Transformer-LSTM网络模型的时间序列预测算法matlab性能仿真
深度学习·matlab·lstm·transformer·时间序列预测·ga遗传优化·电池剩余寿命预测
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
LIST 的相关知识
数据结构·list
M--Y1 天前
Redis常用数据类型
数据结构·数据库·redis
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集