mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
113 lines
2.9 KiB
C++
113 lines
2.9 KiB
C++
#pragma once
|
||
//
|
||
// FILE: GST.h
|
||
// VERSION: 0.1.0
|
||
// PURPOSE: Arduino library for Gold Standard Test metrics
|
||
// URL: https://github.com/RobTillaart/GST
|
||
// https://en.wikipedia.org/wiki/Sensitivity_and_specificity
|
||
// https://en.wikipedia.org/wiki/Confusion_matrix
|
||
//
|
||
// formula's based upon wikipedia.
|
||
|
||
|
||
#define GST_LIB_VERSION (F("0.1.0"))
|
||
|
||
|
||
class GST
|
||
{
|
||
public:
|
||
GST() {};
|
||
|
||
// These 4 need to be filled in.
|
||
void setTruePositive(float v) { TP = v; P = TP + FN; };
|
||
void setTrueNegative(float v) { TN = v; N = TN + FP; };
|
||
void setFalsePositive(float v) { FP = v; N = TN + FP; };
|
||
void setFalseNegative(float v) { FN = v; P = TP + FN; };
|
||
|
||
float getTruePositive() { return TP; };
|
||
float getTrueNegative() { return TN; };
|
||
float getFalsePositive() { return FP; };
|
||
float getFalseNegative() { return FN; };
|
||
|
||
float getTotal() { return P + N; };
|
||
float getActualPositive() { return P; };
|
||
float getActualNegative() { return N; };
|
||
float getTestedPositive() { return TP + FP; };
|
||
float getTestedNegative() { return TN + FN; };
|
||
|
||
float sensitivity() { return TPR(); };
|
||
float specificity() { return TNR(); };
|
||
|
||
|
||
|
||
// true positive rate
|
||
float TPR() { return TP / P; };
|
||
// true negative rate
|
||
float TNR() { return TN / N; };
|
||
|
||
// false negative rate
|
||
float FNR() { return FN / (FN + TP); };
|
||
// false positive rate
|
||
float FPR() { return FP / (FP + TN); };
|
||
|
||
|
||
|
||
// positive predictive value
|
||
float PPV() { return TP / (TP + FP); };
|
||
// negative predictive value
|
||
float NPV() { return TN / (TN + FN); };
|
||
|
||
// false discovery rate
|
||
float FDR() { return FP / (FP + TP); };
|
||
// false omission rate
|
||
float FOR() { return FN / (FN + TN); };
|
||
|
||
|
||
|
||
// positive likelihood ratio
|
||
float LRplus() { return TPR() / FPR(); };
|
||
// negative likelihood ratio
|
||
float LRminus() { return FNR() / TNR(); };
|
||
|
||
|
||
|
||
float prevalenceThreshold() { return sqrt(FPR()) / (sqrt(TPR()) + sqrt(FPR())); };
|
||
float threatScore() { return TP / (TP + FN + FP); };
|
||
float criticalSuccessIndex() { return threatScore(); };
|
||
|
||
|
||
|
||
float prevalence() { return P / (P + N); };
|
||
float accuracy() { return (TP + TN) / (P + N); };
|
||
float balancedAccuracy() { return (TPR() + TNR()) / 2; };
|
||
float F1Score() { return (2 * TP)/(2 * TP + FP + FN); };
|
||
|
||
|
||
|
||
// Matthews correlation coefficient
|
||
float MCC() { return (TP*TN-FP*FN)/sqrt((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN)); };
|
||
float phi() { return MCC(); };
|
||
// Fowlkes–Mallows index
|
||
float FM() { return sqrt(PPV()*TPR()); };
|
||
// Bookmaker informedness
|
||
float BM() { return TPR() + TNR() - 1; };
|
||
// markedness
|
||
float MK() { return PPV() + NPV() - 1; };
|
||
float deltaP() { return MK(); };
|
||
// diagnostic odds ratio
|
||
float DOR() { return LRplus() / LRminus(); };
|
||
|
||
|
||
private:
|
||
float P = 0;
|
||
float N = 0;
|
||
float TP = 0;
|
||
float TN = 0;
|
||
float FP = 0;
|
||
float FN = 0;
|
||
};
|
||
|
||
|
||
// -- END OF FILE --
|
||
|