马修斯相关系数产生的值超出[-1,1]

时间:2014-08-08 17:40:09

标签: correlation c#

我使用维基百科上的公式来计算马修的相关系数。它在大多数情况下运行得相当好,但我在工具的实现中遇到问题,而且我没有看到问题。

MCC =((TP * TN) - (FP * FN))/ sqrt(((TP + FP)(TP + FN)(TN + FP)(TN + FN)))

其中TP,TN,FP和FN是相应字段的非负整数计数。 哪个应该只返回值$ \ epsilon $ [-1,1] 我的实现如下:

double ret;
if ((TruePositives + FalsePositives) == 0 || (TruePositives + FalseNegatives) == 0 ||
   ( TrueNegatives + FalsePositives) == 0 || (TrueNegatives + FalseNegatives) == 0)
//To avoid dividing by zero
    ret = (double)(TruePositives * TrueNegatives - 
                     FalsePositives * FalseNegatives);

else{
    double num = (double)(TruePositives * TrueNegatives - 
                           FalsePositives * FalseNegatives);

    double denom = (TruePositives + FalsePositives) * 
                   (TruePositives + FalseNegatives) * 
                   (TrueNegatives + FalsePositives) * 
                   (TrueNegatives + FalseNegatives);
    denom = Math.Sqrt(denom);
    ret = num / denom;
                }
return ret;

当我使用它时,正如我所说,它在大多数情况下都能正常工作,但是例如如果TP = 280,TN = 273,FP = 67和FN = 20,那么我们得到: MCC =(280 * 273) - (67 * 20)/ sqrt((347 * 300 * 340 * 293))= 75100 / 42196.06 =(约)1.78 这是Matthews Correlation Coefficient的正常行为吗?我是一名贸易程序员,所以统计数据不是我正式培训的一部分。此外,我已经用答案查看了问题,但没有人讨论这种行为。这是我的代码或公式本身的错误吗?

1 个答案:

答案 0 :(得分:3)

代码清晰,看起来正确。 (但是,你的眼睛总是可以欺骗。)

一个问题是关注输出是否保证介于-1和1之间。假设所有输入都是非负的,我们可以将分子向上和分母向下舍入< / em>,从而过高估计结果,将所有&#34; False *&#34;归零。术语,生产

TP*TN / Sqrt(TP*TN*TP*TN) = 1.

通过将所有&#34; True *&#34;归零来获得下限。条款。因此,除非出现无效输入,否则工作代码无法生成大于1的值。

因此,我建议设置一个警卫(例如Assert声明)以确保输入是非负的。 (显然,在前面的论证中,它们是否是不可变的是重要的。)放置另一个断言来检查输出是否在区间[-1,1]中。这些将共同检测(a)无效输入或(b)计算错误中的一个或两个。