Вы можете переставлять метки одного вектора 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 рассчитывается исходя из предположения, что ваш вектор распределен нормально. Однако, если вы вычисляете не корреляцию Пирсона, а корреляцию Спирмена или Кендалла (непараметрическую), эти p-значения будут получены из случайно переставленных данных:
[cc pv] = corr(x,y,'type','Spearman')