forked from JetBrains/lets-plot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CorrelationTest.kt
100 lines (83 loc) · 3.29 KB
/
CorrelationTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
* Copyright (c) 2020. JetBrains s.r.o.
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
*/
package jetbrains.datalore.plot.base.stat
import jetbrains.datalore.base.math.ipow
import jetbrains.datalore.plot.base.DataFrame
import jetbrains.datalore.plot.base.stat.CorrelationUtil.correlation
import jetbrains.datalore.plot.base.stat.CorrelationUtil.correlationMatrix
import jetbrains.datalore.plot.base.stat.math3.correlationPearson
import kotlin.math.abs
import kotlin.test.*
class CorrelationTest {
val N = 10000
val EPS = 0.00001
@Test
fun argTest1() {
val xs = doubleArrayOf(0.0)
val ys = doubleArrayOf()
val ex = assertFailsWith<IllegalArgumentException> { correlationPearson(xs, ys) }
assertEquals("Two series must have the same size.", ex.message)
}
@Test
fun argTest2() {
val xs = doubleArrayOf()
val ys = doubleArrayOf(0.0)
val ex = assertFailsWith<IllegalArgumentException> { correlationPearson(xs, ys) }
assertEquals("Two series must have the same size.", ex.message)
}
@Test
fun zeroVarTest1() {
val xs = doubleArrayOf(10.0, 10.0)
val ys = doubleArrayOf(0.0, 0.0)
val ex = assertFailsWith<IllegalArgumentException> { correlationPearson(xs, ys) }
assertEquals("Correlation is not defined for sequences with zero variation.", ex.message)
}
@Test
fun corrOneTest1() {
val xs = DoubleArray(N) { 0.001 * it.toDouble() }
val ys = DoubleArray(N) { 15.0 + 0.1 * it.toDouble() }
val c = correlationPearson(xs, ys)
assertTrue(abs(1.0 - c) < EPS)
}
@Test
fun corrOneTest2() {
val xs = DoubleArray(N) { 0.013 * it.toDouble() }
val ys = DoubleArray(N) { 2.0 - 0.2 * it.toDouble() }
val c = correlationPearson(xs, ys)
assertTrue(abs(-1.0 - c) < EPS)
}
@Test
fun corrZeroTest1() {
val xs = doubleArrayOf(1.0, 1.0, 1.0, 0.0)
val ys = doubleArrayOf(0.0, 1.0, 2.0, 1.0)
val c = correlationPearson(xs, ys)
assertTrue(abs(c) < EPS)
}
@Test
@Suppress("UNCHECKED_CAST")
fun corrMatrixTest1() {
val a: ArrayList<Double> = arrayListOf(1.0, 2.0, 3.0)
val b: ArrayList<Double> = arrayListOf(1.0, 1.0, 2.0)
val c: ArrayList<Double> = arrayListOf(1.0, -1.0, 1.0)
val data = DataFrame.Builder()
.putNumeric(DataFrame.Variable("A"), a)
.putNumeric(DataFrame.Variable("B"), b)
.putNumeric(DataFrame.Variable("C"), c)
.build()
val labels2series = mapOf("A" to a, "B" to b, "C" to c)
val cm = correlationMatrix(data, CorrelationStat.Type.FULL, fillDiagonal = true, corrfn = ::correlationPearson)
assertEquals(cm.rowCount(), a.size.ipow(2).toInt())
val v1: List<String> = cm[Stats.X] as List<String>
val v2: List<String> = cm[Stats.Y] as List<String>
val cr: List<Double> = cm.getNumeric(Stats.CORR) as List<Double>
for ((v12, corr) in v1.zip(v2).zip(cr)) {
val s1 = labels2series[v12.first]
val s2 = labels2series[v12.second]
assertNotNull(s1)
assertNotNull(s2)
assertEquals(corr, correlation(s1, s2, ::correlationPearson))
}
}
}