我应该如何解释 Spearman 的等级相关显着性为零?
How should I interpret a Spearman's rank correlation significance of zero?
我正在使用 corr
计算两个向量之间的斯皮尔曼等级相关系数。
[rho, p] = corr(freq_type1, freq_type2, 'type', 'Spearman');
这些向量表示不同类型文档中术语的出现频率。例如,type1 可能是网页,type2 可能是报纸文章。所以每个向量 freq_type1
和 freq_type2
都是 1 by n
其中 n
是我词汇表中术语的数量。我计算排名相关性的原因是我想知道不同类型文档之间的词汇频率是否不同。我对每个向量进行归一化,以便排名对应于每个词汇术语出现的文档的百分比。
上面的调用 returns rho = .8879 和 p = 0
据我了解,当 p 很小时,相关性很显着,但这非常小,我有点担心。
我的第一个想法是,也许该函数没有 return Spearman 方法的 p 值。为了测试该方法,我尝试计算两个随机向量的相关性。
[rho, p] = corr(rand(5,1), rand(5,1), 'type', 'Spearman');
这个 returns rho = 0.80 和 p = 1.3,所以该函数似乎有效。
这是我的数据分布在对数对数图上的样子。
根据 Matlab documentation for corr
,Spearman 的 p 值是使用排列分布计算的。
以下是我对这种计算方式的理解,建立在关于 permutation testing 的维基百科文章的基础上。最初,相关系数计算为
"observed value of the test statistic, T(obs)"。
然后将两个输入集混合在一起,并测试混合数据点的所有可能重采样的相关系数。检验的单侧 p 值计算为相关性大于或等于 T(obs) 的采样排列的比例。检验的两侧 p 值是小于或等于 T(obs) 的比例。
因此,要获得零 p 值,我需要使采样排列的所有相关系数大于或全部小于 T(obs)。这似乎极不可能,因为我的数据点并不完全位于一条线上。
秩相关是否要求数据以均值为中心或其他一些约束?
这里有一个link to the data on Dropbox,如果你想看看是否得到相同的结果。
您必须到别处寻找深入的统计建议,但我可以展示 Octave(MATLAB 克隆)代码在做什么(顺便说一句 returns 与您观察到的结果完全相同)。这是用观察值注释的相关代码:
% --> from previous computations, R = 0.88786, NN=1540
% SIGNIFICANCE TEST
tmp = 1 - R.*R;
% --> tmp = 0.21171
t = R.*sqrt(max(NN-2,0)./tmp);
% --> t = 75.675
sig = tcdf(t,NN-2);
% --> sig = 1
sig = 2 * min(sig,1 - sig);
% --> sig = 0 (same as p which is reported)
同样,您可能想咨询更熟悉统计学的人以了解这些步骤,但我的结论是,是的,鉴于数据集的规模很大,毫无疑问存在显着(非零)相关性.
我同意 p=0 很奇怪。但对我来说,这是你的第二个例子,表明一切都不好。 "p = 1.3" 表示它没有给出标准 p 值,因为 p 是一个概率,因此必须介于 0 和 1 之间。您的 p>1!!
我用
cor.test(datafr$variable1, datafr$variable2, method="spearman")
这 returns 一个标准的 rho 和 p :但我从来没有用你描述的向量(而不仅仅是数据集)尝试过它。
我正在使用 corr
计算两个向量之间的斯皮尔曼等级相关系数。
[rho, p] = corr(freq_type1, freq_type2, 'type', 'Spearman');
这些向量表示不同类型文档中术语的出现频率。例如,type1 可能是网页,type2 可能是报纸文章。所以每个向量 freq_type1
和 freq_type2
都是 1 by n
其中 n
是我词汇表中术语的数量。我计算排名相关性的原因是我想知道不同类型文档之间的词汇频率是否不同。我对每个向量进行归一化,以便排名对应于每个词汇术语出现的文档的百分比。
上面的调用 returns rho = .8879 和 p = 0
据我了解,当 p 很小时,相关性很显着,但这非常小,我有点担心。
我的第一个想法是,也许该函数没有 return Spearman 方法的 p 值。为了测试该方法,我尝试计算两个随机向量的相关性。
[rho, p] = corr(rand(5,1), rand(5,1), 'type', 'Spearman');
这个 returns rho = 0.80 和 p = 1.3,所以该函数似乎有效。
这是我的数据分布在对数对数图上的样子。
根据 Matlab documentation for corr
,Spearman 的 p 值是使用排列分布计算的。
以下是我对这种计算方式的理解,建立在关于 permutation testing 的维基百科文章的基础上。最初,相关系数计算为 "observed value of the test statistic, T(obs)"。 然后将两个输入集混合在一起,并测试混合数据点的所有可能重采样的相关系数。检验的单侧 p 值计算为相关性大于或等于 T(obs) 的采样排列的比例。检验的两侧 p 值是小于或等于 T(obs) 的比例。
因此,要获得零 p 值,我需要使采样排列的所有相关系数大于或全部小于 T(obs)。这似乎极不可能,因为我的数据点并不完全位于一条线上。
秩相关是否要求数据以均值为中心或其他一些约束?
这里有一个link to the data on Dropbox,如果你想看看是否得到相同的结果。
您必须到别处寻找深入的统计建议,但我可以展示 Octave(MATLAB 克隆)代码在做什么(顺便说一句 returns 与您观察到的结果完全相同)。这是用观察值注释的相关代码:
% --> from previous computations, R = 0.88786, NN=1540
% SIGNIFICANCE TEST
tmp = 1 - R.*R;
% --> tmp = 0.21171
t = R.*sqrt(max(NN-2,0)./tmp);
% --> t = 75.675
sig = tcdf(t,NN-2);
% --> sig = 1
sig = 2 * min(sig,1 - sig);
% --> sig = 0 (same as p which is reported)
同样,您可能想咨询更熟悉统计学的人以了解这些步骤,但我的结论是,是的,鉴于数据集的规模很大,毫无疑问存在显着(非零)相关性.
我同意 p=0 很奇怪。但对我来说,这是你的第二个例子,表明一切都不好。 "p = 1.3" 表示它没有给出标准 p 值,因为 p 是一个概率,因此必须介于 0 和 1 之间。您的 p>1!!
我用
cor.test(datafr$variable1, datafr$variable2, method="spearman")
这 returns 一个标准的 rho 和 p :但我从来没有用你描述的向量(而不仅仅是数据集)尝试过它。