大家好,欢迎来到IT知识分享网。
我录了一个讲解视频:https://www.bilibili.com/video/BV1Yz411z7j2?pop_share=1
一、理论概括介绍
显著性分析通常分为参数检验方法和非参数检验方法,参数检验法中常用的是t检验,但是t检验需要假定两组样本都服从正态分布,这样适用的情况有限。
秩和检验是一种非参数检验法,不需要对数据分布作特殊假设,因而能适用于更复杂的数据分布情况。秩和检验是通过推断总体的分布是否相同,进而判断两组样本之间的差异是否显著。
秩和检验的做法是:首先把两组样本混合,按照所检验的特征值大小对所有样本排序。在两类样本中分别计算所得排序序号之和T1 和T2,称作秩和 。秩和检验的基本思想是,如果一类样本的秩和显著地比另一类小(或大),则两类样本在所考察的特征上有显著差异。
假设检验的基本原理是小概率原理,即认为小概率事件在一次试验中实际上不可能发生。当同一研究问题下进行多次假设检验时,不再符合小概率原理所说的“一次试验”。如果在该研究问题下只要有检验是阳性的,就对该问题下阳性结论的话,对该问题的检验的犯一类错误的概率就会增大。
所以当一个数据集做了多次假设检验的时候,就需要进行校正,降低假阳性的概率。显著性用P值表示,一个数据集有多少个P值就意味进行了多少次假设检验,无论这个P值是不是描述同一个基因还是通道。
常见的多重比较情景:1.多组间比较 2.多个主要指标
P值校正方法:1.Bonferroni 称为“最简单严厉的方法”,直接改小显著性的阈值,阈值为:0.05/检验次或者矫正P值=P×检验次数2. FalseDiscovery Rate(FDR),有一些估算模型,常用的是BH方法,称为“温和的校正方法”,首先将各P值从小到大排序,生成顺序数排第k的矫正P值=P×n/k,(n是检验次数),另外要保证矫正后的各检验的P值大小顺序不发生变化。
二、具体实例演示
实际问题:有两组人,A组33人,B组30人,把每个人的大脑按照标准模板(AAL)分成90个脑区,通过某些方法得到每个脑区之间连通性的值,现在要比较这两组人有没有显著性差异,为后来的机器学习或者深度学习分类做可行性分析。
每个通道(90*90=8100)两组人比较显著性差异,用ranksum秩和检验得到8100个P值,用FDR(BH)进行校正。
MATLAB代码示意如下:
clear;
close all;
clc;
% 加载JME和NC到变量X和Y
JME_address = "D:\python\deep-learning\JME\JME bmp\JME\ICVF\*.mat";
jme_address = "D:\python\deep-learning\JME\JME bmp\JME\ICVF\";
JMEnamelist = dir(JME_address);
len = length(JMEnamelist);
for i = 1:len
file_name{i}=JMEnamelist(i).name;
x{i}= load(jme_address+file_name{i});
end
NC_address = "D:\python\deep-learning\JME\JME bmp\Normal\ICVF\*.mat";
nc_address = "D:\python\deep-learning\JME\JME bmp\Normal\ICVF\";
NCnamelist = dir(NC_address);
len = length(NCnamelist);
for i = 1:len
file_name{i}=NCnamelist(i).name;
y{i}= load(nc_address+file_name{i});
end
% 两组人的每个通道进行秩和检验
JME_ICVF=[];
NC_ICVF=[];
for i = 1:90 %行
for j = 1:90 %列
JME_ICVF=[];
NC_ICVF=[];
JME_number = 0;
NC_number = 0;
for jme = 1:33 %人数
j_ICVF = x{1,jme}.ICVF(i,j);
JME_number = JME_number + j_ICVF;
JME_ICVF = [JME_ICVF;j_ICVF];
end
for nc = 1:30 % 人数
n_ICVF = y{1,nc}.ICVF(i,j);
NC_number = NC_number + n_ICVF;
NC_ICVF = [NC_ICVF;n_ICVF];
end
JME_mean_number(i,j) = JME_number/33;
NC_mean_number(i,j) = NC_number/30;
[P_temp,H_temp]= ranksum(JME_ICVF,NC_ICVF);
P_result(i,j) = P_temp;
H_result(i,j) = H_temp;
end
end
P_result(isnan(P_result)) = 1; %只要一样数字的数目总数小于20就不会出现nan
P_result = reshape(P_result,1,8100);
FDR = mafdr(P_result,'BHFDR', true);
P_result = reshape(FDR,90,90);
mycolorbar=zeros(3,1000); %zeros(1,99)+1
% 颜色方案1
% mycolorbar(1,:)=zeros(1,100)+1;
% mycolorbar(3,:)=0:0.005:0.495;
% mycolorbar(2,:)=0:0.01:0.99;
% 颜色方案2
% mycolorbar(1,:)=zeros(1,1000)+1;
% mycolorbar(3,:)=0:0.001:0.999;
% mycolorbar(2,:)=0:0.001:0.999;
mycolorbar(1,:)=zeros(1,1000)+1;
mycolorbar(2,:)=[1:-0.0015:0,zeros(1,333)];
mycolorbar(3,:)=[1:-0.003:0,zeros(1,666)];
mycolor=mycolorbar';
% thr = 0.967; % 一共是0.0517, 0.05的阈值占其96%,要实现大于所以是97%
% col_th = 1000 * thr;
% for i=col_th:1000
% mycolor(i,:) = [1,1,1]; %将大于0.05的设置为白色
% end
H = figure(); % 建立图层
% figure(1);
% imagesc(P_result); % 把数字矩阵可视化图像
% figure(2);
imagesc(NC_mean_number);
% figure(3);
% imagesc(NC_mean_number);
daspect([1,1,1]); % 让图片等比例显示
colormap(H,mycolor);
% caxis([0,0.0517]); % 把colorbar的范围固定
% save_address = "C:\Users\85007\Desktop\";
% xlswrite(save_address + 'P_result.xlsx',P_result);
% xlswrite(save_address + 'H_result.xlsx',H_result);
% xlswrite(save_address + 'JME_mean_number.xlsx',JME_mean_number);
% xlswrite(save_address + 'NC_mean_number.xlsx',NC_mean_number);
三、结果可视化
未校正的P值(取前8*8):
FDR(BH)校正后的P值(取前8*8)
参考资料
清华大学张学工教授所著《模式识别》
知乎Willson Chou 的回答 https://www.zhihu.com/question/23950632
新云旧雨的简书https://www.jianshu.com/p/e13f535a3313
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/16036.html