我正在处理一组数据,并且我已经获得了一定的相关性(使用皮尔森的相关系数)。我被要求确定“相关性的质量”,并且我的主管意味着他想看看如果我尝试置换有序对的所有y值时相关性是什么,并比较获得的相关系数。有谁知道这样做的好方法?是否有matlab函数可以确定与数据随机排列之间的相关性相比有多好?
答案 0 :(得分:2)
首先,你必须检查你得到的相关系数是否与零显着不同。 corr
函数可以执行此操作(请参阅pval
)。
其次,如果它与零显着不同,那么你想从实际的角度来决定这种差异是否也很重要。在实践中,相关系数的平方(coefficient of determination)被认为是显着的,如果它大于0.5,这意味着其中一个相关参数的变化“解释”了至少50%的变化。其他。
第三,存在确定系数接近1的情况,但这不足以确定“相关性的好”。例如,如果使用两种不同的方法测量相同的变量,通常会得到非常相似的值,因此相关系数几乎为1.在这种情况下,您应该应用Bland-Altman analysis,这很容易实现在Matlab中,有自己的“善”参数(偏见和所谓的协议限制)。
答案 1 :(得分:2)
您可以将一个矢量标签置换N次并计算每次迭代的相关系数(cc)。然后,您可以将这些值的分布与实际相关性进行比较。
这样的事情:
%# random data
n = 20;
x = (1:n)';
y = x + randn(n,1)*3;
%# real correlation
cc = corr(x,y);
%# do permutations
n_iter = 100; %# number of permutations
cc_iter = zeros(n_iter,1); %# preallocate the vector
for k = 1:n_iter
ind = randperm(n); %# vector of random permutations
cc_iter(k) = corr(x,y(ind));
end
%# calculate statistics
cc_mean = mean(cc_iter);
cc_std = std(cc_iter);
zval = cc - cc_mean ./ cc_std;
%# probability that the real cc belongs to the same distribution as cc from permuted data
pv = 2 * normcdf(-abs(zval),cc_mean,cc_std);
%# plot
hist(cc_iter,20)
line([cc cc],ylim,'color','r') %# real value
此外,如果您计算与[cc pv] = corr(x,y)
的相关性,您将获得相关性与不相关性的差异的p值。该p值是根据您的矢量正常分布的假设计算出来的。但是,如果你计算的不是Pearson,而是Spearman或Kendall相关(非参数),那些p值将来自随机置换的数据:
[cc pv] = corr(x,y,'type','Spearman')