利用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
相关推荐
扶摇接北海1761 分钟前
洛谷:P5732 【深基5.习7】杨辉三角
数据结构·c++·算法
2301_776508723 分钟前
C++中的中介者模式
开发语言·c++·算法
handler0114 分钟前
算法:Trie树(字典树)
c语言·数据结构·c++·笔记·算法·深度优先
ZPC821016 分钟前
PPO (Proximal Policy Optimization) 算法模块详细拆解
人工智能·pytorch·算法·机器人
6+h19 分钟前
【Redis】数据结构讲解
数据结构·数据库·redis
阿Y加油吧19 分钟前
力扣打卡day06——滑动窗口最大值、最小覆盖子串
数据结构·算法·leetcode
沉鱼.4420 分钟前
日期题目集
数据结构·算法
Book思议-28 分钟前
【数据结构考研真题】链表题
c语言·数据结构·算法·链表·408·计算机考研
lifallen28 分钟前
从零推导一个现代 ReAct Agent框架
人工智能·算法·语言模型
⁤⁢初遇29 分钟前
数据结构---排序
数据结构·算法·排序算法