【发布时间】:2012-01-15 01:29:05
【问题描述】:
我正在处理一组数据,并且获得了一定的相关性(使用 pearson 相关系数)。我被要求确定“相关性的质量”,我的主管的意思是他想看看如果我尝试排列我的有序对的所有 y 值,并比较获得的相关系数,相关性会是什么。有谁知道这样做的好方法?与数据的随机排列之间的相关性相比,是否有一个 matlab 函数可以确定相关性有多好?
【问题讨论】:
标签: matlab statistics correlation
我正在处理一组数据,并且获得了一定的相关性(使用 pearson 相关系数)。我被要求确定“相关性的质量”,我的主管的意思是他想看看如果我尝试排列我的有序对的所有 y 值,并比较获得的相关系数,相关性会是什么。有谁知道这样做的好方法?与数据的随机排列之间的相关性相比,是否有一个 matlab 函数可以确定相关性有多好?
【问题讨论】:
标签: matlab statistics correlation
首先,你必须检查你得到的相关系数是否显着不同于零。 corr 函数可以做到这一点(参见pval)。
其次,如果它与零有显着差异,那么您想从实际角度确定这种差异是否也很显着。在实践中,相关系数的平方(coefficient of determination)被认为是显着的,如果它大于 0.5,这意味着相关参数之一的变化“解释”了另一个相关参数的至少 50% 的变化。
第三,有确定系数接近1的情况,但这不足以确定“相关性的好坏”。例如,如果您使用两种不同的方法测量同一个变量,通常会得到非常相似的值,因此相关系数几乎为 1。在这种情况下,您应该应用 Bland-Altman analysis,这在 Matlab 中很容易实现,并且有自己的“好”参数(偏差和所谓的一致性限制)。
【讨论】:
您可以将一个向量的标签置换 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')
【讨论】: