我正在使用corr
计算两个向量之间的Spearman等级相关系数。
[rho, p] = corr(freq_type1, freq_type2, 'type', 'Spearman');
这些向量表示不同类型文档中术语的频率。例如,type1可能是一个网页,type2可能是一篇报纸文章。因此,每个向量freq_type1
和freq_type2
都是n
的1,其中n
是我词汇表中的术语数。我计算等级相关性的原因是我想能够说出不同类型的文档之间词汇的频率是否不同。我规范化每个向量,使得等级对应于每个词汇术语出现的文档的百分比。
上面的调用返回rho = .8879和p = 0
据我了解,当p很小时,相关性很大,但这是非常小的,我有点担心。
我的第一个想法是,函数可能没有返回Spearman方法的p值。为了测试该方法,我尝试计算两个随机向量的相关性。
[rho, p] = corr(rand(5,1), rand(5,1), 'type', 'Spearman');
这返回rho = 0.80和p = 1.3,所以函数似乎正常工作。
这就是我在loglog情节中的数据分布。
从Matlab documentation for corr
开始,使用置换分布计算Spearman的p值。
以下是我对维基百科有关permutation testing的文章的理解。最初,相关系数计算为 “观测值的测试统计,T(obs)”。 然后将两个输入集混合在一起,并且针对相关系数测试混合数据点的所有可能的重新采样。测试的单侧p值计算为相关性大于或等于T(obs)的采样排列的比例。测试的双边p值是小于或等于T(obs)的比例。
因此,为了使p值为零,我需要使采样排列的所有相关系数大于或全部小于T(obs)。这似乎极不可能,因为我的数据点并不完全在一条线上。
排名相关性是否要求数据为中心或其他约束?
如果你想看看是否得到相同的结果,这是一个link to the data on Dropbox。
答案 0 :(得分:1)
你必须在别处寻找深入的统计建议,但我可以展示Octave(MATLAB克隆)代码正在做什么(哪个btw返回的结果与您观察到的结果完全相同)。以下是使用观察值评论的相关代码:
% --> 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)
同样,您可能希望咨询更熟悉统计数据的人,以了解这些步骤,但我的结论是,是的,鉴于数据集的大小,毫无疑问存在显着(非零)相关性。
答案 1 :(得分:0)
我同意p = 0很奇怪。但对我来说,这是你的第二个例子,表明一切都不顺利。 “p = 1.3”表示它没有给出标准p值,因为p是概率因此必须介于0和1之间。你的p> 1 !!
我用
cor.test(datafr $ variable1,datafr $ variable2,method =“spearman”)
这会返回一个标准的rho和p:但是我从未尝试过使用你描述的矢量(而不仅仅是数据集)。