如何得到相关系数的P值

How to get P value of correlation coefficient

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

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

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

类似地,this package也有returns系数而不是P值的相关函数。

我怎样才能找到这些软件包的相关系数的 P 值?

编辑:我在交叉验证 (stats.stackexchange.com) 上发布了这个问题,有人认为这是一个编程问题。

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

正态性假设

如果每个观测值都近似正常,则值

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

它应该是这样的(请注意我从未使用过 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 似乎匹配。

排列测试

如果你的采样变量不是每个都正常,那么你可以使用排列测试。从本质上讲,随机化您的数据并查看随机相关性匹配或超过您观察到的相关性的次数。如果您的测试是双侧的(即,您对相关结果没有原则性假设),请使用相关性的绝对值进行测试。


测试详情

维基百科条目 "Pearson correlation coefficient" 推论 部分有详细信息。