如何获得相关系数的P值

时间:2019-09-08 17:56:38

标签: go statistics correlation p-value

我正在尝试使用Go进行简单统计。

我正在使用this package来获取相关系数。

效果很好,但是没有给出相关性的P值。上面在同一页面上提供了此软件包中的其他功能:https://godoc.org/gonum.org/v1/gonum/stat

类似地,this package也具有相关函数,该函数返回系数但不返回P值。

如何使用这些软件包中的任何一个找到相关系数的P值?

编辑:我已经在交叉验证(stats.stackexchange.com)上发布了该问题,在那里有人提出这是一个编程问题。

1 个答案:

答案 0 :(得分:1)

您似乎需要手动计算,并且有多种方法可以执行此操作,具体取决于您可以对数据进行的假设。如果您真的走这条路,强烈建议您也对现有的实现进行测试-例如R's cor.test- 以确保您没有做错任何事情。

正常假设

如果观察到的值均接近正常值,则该值

enter image description here

其中r是计算出的相关系数,n是观察数,将遵循学生的 t 分布,自由度为n-2。因此,您可以使用Student's t distribution as implemented in GoNum来计算p值。这就是R中的cor.test的作用。

它应该类似于(请注意,我从未使用过Go):

import (
    "math"
    "gonum.org/v1/gonum/stat/distuv"
)

func twoSidedPValue(r float64, n float64) float64 {

    // compute the test stat
    ts := r * math.Sqrt((n - 2) / (1 - r*r))

    // make a Student's t with (n-2) d.f.
    t := distuv.StudentsT{0, 1, (n-2), nil}

    // compute the p-value
    pval := 2 * t.CDF(-math.Abs(testStat))

    return pval
}

针对R的cor.test进行的测试似乎匹配。

排列测试

如果采样变量不是每个法线,则可以使用置换检验。本质上,随机化数据并查看随机相关性匹配或超过观察到的次数的次数。如果您的测试是双向的(即,您没有关于关联结果的原则性假设),请使用关联的绝对值进行测试。


测试详细信息

Wikipedia条目"Pearson correlation coefficient"推断部分包含详细信息。