利用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的算法实验室12 小时前
2024年IEEE TAES SCI2区,一种改进人工电场算法用于机器人路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
gugugu.12 小时前
算法:N皇后问题
算法
先生沉默先12 小时前
c#Socket学习,使用Socket创建一个在线聊天,需求分析与创建项目,数据结构创建(1)
数据结构·学习·c#
Bdygsl12 小时前
数据结构 —— 顺序表
数据结构·链表
lLinkl12 小时前
LeetCode-1.两数之和
算法·leetcode·散列表
(❁´◡`❁)Jimmy(❁´◡`❁)12 小时前
F - Manhattan Christmas Tree 2
数据结构·算法
wxdlfkj12 小时前
从算法溯源到硬件极限:解决微小球面小角度拟合与中心定位的技术路径
人工智能·算法·机器学习
高洁0112 小时前
基于Tensorflow库的RNN模型预测实战
人工智能·python·算法·机器学习·django
一起养小猫12 小时前
LeetCode100天Day5-最小长度子数组与三数之和
算法·leetcode·职场和发展
良木生香12 小时前
【数据结构-初阶】顺序表相关习题
数据结构