matlab做fdr的代码
时间: 2023-08-24 20:19:41 浏览: 787
MATLAB 中可以使用 `mafdr` 函数来进行 FDR 校正。下面是一个简单的示例代码:
```matlab
% 生成一些假设检验的 p 值
p = rand(1, 100);
% 对 p 值进行 FDR 校正
[q, crit_p] = mafdr(p, 'BHFDR', true);
% 打印校正后的 p 值和拒绝阈值
disp('FDR-adjusted p-values:');
disp(q);
disp('FDR-corrected critical p-value:');
disp(crit_p);
```
在这个示例中,我们生成了一个长度为 100 的随机 p 值向量,然后使用 `mafdr` 函数对其进行 FDR 校正。校正后的 p 值和拒绝阈值分别存储在 `q` 和 `crit_p` 变量中,并通过 `disp` 函数进行输出。需要注意的是,在使用 `mafdr` 函数之前,需要确保 MATLAB 安装了 Statistics and Machine Learning Toolbox。
相关问题
matlab做FDR矫正
FDR(False Discovery Rate)矫正是一种常用的多重比较校正方法,用于控制在多次假设检验中产生的假阳性率。在MATLAB中,您可以使用以下步骤执行FDR校正:
1. 首先,您需要进行多个假设检验并计算每个检验的p值。
2. 然后,将p值按升序排序,并计算每个p值的门槛值(或阈值)。这可以通过将p值乘以总测试数除以该p值的排名来完成。
3. 接下来,将门槛值与每个p值进行比较。如果p值小于或等于门槛值,则将其视为显着性发现,否则将其视为非显着性发现。
在MATLAB中,您可以使用fdr_bh函数执行FDR矫正。该函数需要一个包含未校正p值的向量,并返回一个包含经过FDR校正的调整p值的向量。
以下是一个使用fdr_bh函数执行FDR校正的示例代码:
```
% 生成一些随机的未校正p值
p_values = rand(1,100);
% 使用fdr_bh函数执行FDR校正
[~, adjusted_p_values] = fdr_bh(p_values);
% 打印未校正和已校正的p值
disp('未校正的p值:');
disp(p_values);
disp('已校正的p值:');
disp(adjusted_p_values);
```
请注意,fdr_bh函数还可以接受一个可选参数alpha,该参数指定期望的FDR水平。如果未指定此参数,则默认为0.05。
fdr矫正 matlab
### 在 MATLAB 中实现 FDR 校正
#### 使用内置函数 `mafdr`
MATLAB 提供了一个名为 `mafdr` 的内置函数来执行 FDR 控制。此函数主要用于微阵列数据分析,但也适用于其他类型的多假设检验场景[^3]。
```matlab
% 假设 pvals 是一个包含多个p值的向量
[pFDR, qValues] = mafdr(pvals);
```
上述代码返回两个变量:
- `pFDR`: 经过 FDR 校正后的 p 值。
- `qValues`: 对应于每个原始 p 值的 Q 值 (即最小的 FDR 阈值,在该阈值下原假设可以被拒绝)。
#### 手动实现 Benjamini-Hochberg 方法
如果希望更灵活地控制过程或理解内部机制,则可以通过手动编写 BH 法来进行 FDR 校正:
```matlab
function [fdr_corrected_pvalues] = bh_fdr_correction(p_values, alpha)
% Sort the p-values and keep track of original indices.
[~, idx] = sort(p_values);
sorted_p_values = p_values(idx);
n = length(sorted_p_values);
% Calculate critical values based on rank position.
ranks = 1:n;
crit_vals = (ranks / n) * alpha;
% Find largest i such that P(i)<=i/m*alpha where m is total number of tests.
max_i = find(sorted_p_values <= crit_vals, 1, 'last');
if isempty(max_i)
fdr_corrected_pvalues = ones(size(p_values)); % No significant results found.
else
threshold = sorted_p_values(max_i);
% Apply correction to all p-values.
corrected_sorted_p_values = min([sorted_p_values ./ ((1:n)' / n), ones(n, 1)], [], 2);
% Restore order according to input vector.
[~, inv_idx] = sort(idx);
fdr_corrected_pvalues = corrected_sorted_p_values(inv_idx);
end
end
```
这段自定义代码实现了经典的 Benjamini 和 Hochberg 提出的线性逐步方法用于控制错误发现率[FDR][^2]。
阅读全文