方法一:
利用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