num4anova 0.0.1-java → 0.0.2-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 61d4380d19135d9bb9973755730f34794d2f4741882d494433086922de5fecbc
4
- data.tar.gz: eed7345a3482c955c3537954fd6d053d2898f53bfc4807aa39926e23c407e3e2
3
+ metadata.gz: 3987057ab3576c0da8a66256901cf7548ad7bf4bef7aaafccf128b083655333d
4
+ data.tar.gz: 4b35674f595de9f05b4056ec6c20d671549341aad88083e5dfd928a881de5c7a
5
5
  SHA512:
6
- metadata.gz: 756c787954a6c83b735781b4230b1f113bd3e944d7262e7dd2197cacf39bed1640555d5dfaa555552f6433f1b7905c2211948dc54ce5a1686520f23162316014
7
- data.tar.gz: 878cd5056eed4258da283789036ebd0b209fc19e215a9e4bc6ffdf2d657bccecff858db6f4e4ad643ec215597e902edc20592bc5704cb906e693b720fe343d50
6
+ metadata.gz: 75fd29b81f0c79fa4f72520ced191bccc543d1cf86875425f9408a7c25aeeb8dc0b3417a3af3838bbc2dadee641da79f1fd43b46dc3a02f7e920ffafc1f6e1e7
7
+ data.tar.gz: 4a9226cc5d20f86fda993eecc91048edc77a7157da8b2d44c305fdcbf9849aeb0c2c6d4c270b623d62a061daee67aff8864e039280282fc8c2a415453f8e8334
data/CHANGELOG.md CHANGED
@@ -2,13 +2,12 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
- ## [0.0.2] - 2023-12-12
5
+ ## [0.0.2] - 2024-01-23
6
6
 
7
- ### change
8
- - chg Q-QPlot and kstest
9
- - chg from one-side test to two side test.
7
+ ### add
8
+ - add Multiple Comparisons function.
10
9
 
11
- ## [0.0.1] - 2023-12-05
10
+ ## [0.0.1] - 2024-01-10
12
11
 
13
12
  ### Fixed
14
13
  - fix first fixed.
data/Rakefile CHANGED
@@ -6,3 +6,5 @@ Rake::JavaExtensionTask.new(name='num4anova') do | ext |
6
6
  ext.classpath = jars.map { |x| File.expand_path x }.join ":"
7
7
  end
8
8
  task :default => [:compile]
9
+
10
+
@@ -0,0 +1,225 @@
1
+ import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
2
+ import java.util.Arrays;
3
+ import java.util.List;
4
+ import java.util.ArrayList;
5
+ import org.apache.commons.math3.distribution.TDistribution;
6
+
7
+ import org.apache.commons.math3.util.Combinations;
8
+ public class MultiComp {
9
+ public static class ParametrixTest {
10
+ private static ParametrixTest paramTest = new ParametrixTest();
11
+ public static ParametrixTest getInstance() {
12
+ return paramTest;
13
+ }
14
+ public boolean[][] turkeyTest(double[][] xi, double a) {
15
+ HypothesisTest hypoth = new TurkeyTest();
16
+
17
+ double[][] statistic = hypoth.calcTestStatistic(xi);
18
+ return hypoth.executeTest(statistic, a);
19
+ }
20
+ public boolean[][] bonferronoTest(double[][] xi, double a) {
21
+ HypothesisTest hypoth = new BonferroniTest();
22
+
23
+ double[][] statistic = hypoth.calcTestStatistic(xi);
24
+ return hypoth.executeTest(statistic, a * 0.5);
25
+ }
26
+ /*********************************/
27
+ /* interface define */
28
+ /*********************************/
29
+ private interface HypothesisTest {
30
+ double[][] calcTestStatistic(double[][] xi);
31
+ boolean[][] executeTest(double[][] statistic, double a);
32
+ }
33
+ /*********************************/
34
+ /* Class define */
35
+ /*********************************/
36
+ // turkey法
37
+ private class TurkeyTest implements HypothesisTest {
38
+ private int m = 0;
39
+ private int n = 0;
40
+ public double[][] calcTestStatistic(double[][] xi) {
41
+ n = xi.length; // a
42
+ m = xi[0].length; // n
43
+ double[][] statistic = new double[n][n];
44
+ double[] mean = calcStdMean(xi);
45
+ double ve = calcVe(xi);
46
+
47
+ for(int i = 0; i < n; i++) {
48
+ for(int j = i; j < n; j++) {
49
+ statistic[i][j] =
50
+ Math.abs(mean[i] - mean[j]) / Math.sqrt(ve / m);
51
+ }
52
+ }
53
+
54
+ return statistic;
55
+
56
+ }
57
+ public boolean[][] executeTest(double[][] statistic, double a) {
58
+ int v = n * (m - 1);
59
+ double q = qvalue(n, v, a);
60
+ boolean[][] ret = new boolean[n][n];
61
+
62
+ for(int i = 0; i < n; i++) {
63
+ for(int j = i; j < n; j++) {
64
+ ret[i][j] = (statistic[i][j] >= q) ? true : false;
65
+ }
66
+ }
67
+ return ret;
68
+ }
69
+
70
+ private double[] calcStdMean(double[][] xi) {
71
+ int n = xi.length;
72
+ double[] mean = new double[n];
73
+
74
+ for(int i = 0; i < n; i++) {
75
+ DescriptiveStatistics stat = new DescriptiveStatistics();
76
+ Arrays.stream(xi[i]).forEach(stat::addValue);
77
+
78
+ mean[i] = stat.getMean();
79
+ stat.clear();
80
+ }
81
+ return mean;
82
+ }
83
+ private double calcVe(double[][] xi) {
84
+ int n = xi.length;
85
+ int m = xi[0].length;
86
+ double na = n * (m - 1);
87
+ double sumSq = 0.0;
88
+
89
+ for(int i = 0; i < n; i++) {
90
+ DescriptiveStatistics stat = new DescriptiveStatistics();
91
+ Arrays.stream(xi[i]).forEach(stat::addValue);
92
+ double mean = stat.getMean();
93
+ for (int j = 0; j < m; j++) {
94
+ double diff = xi[i][j] - mean;
95
+ sumSq = sumSq + diff * diff;
96
+ }
97
+ stat.clear();
98
+ }
99
+ return sumSq / na;
100
+ }
101
+ // スチューデント化された範囲のa点
102
+ // v=120
103
+ // k=10 q= 4.5595 p2/a=0.016282 1/61.417516276
104
+ // k=8 q= 4.3630 p2/a=0.025263 1/39.583580731
105
+ // k=6 q= 4.0960 p2/a=0.044883 1/22.280150614
106
+ // k=5 q= 3.9169 p2/a=0.065040 1/15.375153752
107
+ // k=4 q= 3.6846 p2/a=0.103377 1/9.673331592
108
+ // k=3 q= 3.3561 p2/a=0.192270 1/5.2010194
109
+ // k=2 q= 2.8000 p2/a=0.500036 1/2
110
+ // v=14
111
+ // k=10 q= 5.2534 p2/a=0.023091 1/43.306916115
112
+ // k=8 q= 4.9903 p2/a=0.033394 1/29.945499191
113
+ // k=6 q= 4.6385 p2/a=0.054768 1/18.258837277
114
+ // k=5 q= 4.4066 p2/a=0.075883 1/13.178182202
115
+ // k=4 q= 4.1105 p2/a=0.114920 1/8.701705534
116
+ // k=3 q= 3.7014 p2/a=0.202830 1/4.930237144
117
+ // k=2 q= 3.0332 p2/a=0.499991 1/2.000036001
118
+ // v=12
119
+ // k=10 q= 5.3946 p2/a=0.024637 1/40.58935747
120
+ // k=8 q= 5.1187 p2/a=0.035180 1/28.425241615
121
+ // k=6 q= 4.7502 p2/a=0.056858 1/17.587674558
122
+ // k=5 q= 4.5077 p2/a=0.078128 1/12.799508499
123
+ // k=4 q= 4.1987 p2/a=0.117245 1/8.529148365
124
+ // k=3 q= 3.7729 p2/a=0.204923 1/4.879881712
125
+ // k=2 q= 3.0813 p2/a=0.500004 1/2
126
+ // v=10
127
+ // k=10 q= 5.5984 p2/a=0.026922 1/37.144342917
128
+ // k=8 q= 5.3042 p2/a=0.037799 1/26.455726342
129
+ // k=6 q= 4.9128 p2/a=0.059822 1/16.716258233
130
+ // k=5 q= 4.6543 p2/a=0.081351 1/12.292411894
131
+ // k=4 q= 4.3266 p2/a=0.120575 1/8.293593199
132
+ // k=3 q= 3.8768 p2/a=0.207859 1/4.810953579
133
+ // k=2 q= 3.1511 p2/a=0.499979 1/2
134
+ // v=9
135
+ // k=10 q= 5.7384 p2/a=0.028519 1/35.06434307
136
+ // k=8 q= 5.4312 p2/a=0.039639 1/25.22767981
137
+ // k=6 q= 5.0235 p2/a=0.061950 1/16.14205004
138
+ // k=5 q= 4.7554 p2/a=0.083549 1/11.969024165
139
+ // k=4 q= 4.4149 p2/a=0.122828 1/8.141466115
140
+ // k=3 q= 3.9485 p2/a=0.209848 1/4.76535397
141
+ // k=2 q= 3.1992 p2/a=0.499985 1/2
142
+ private double qvalue(int k, int v, double a) {
143
+ double den = (k-1) * (2 + k) / 2;
144
+ double p = 1.0 - a / den;
145
+ TDistribution tDist = new TDistribution(v);
146
+ double t =
147
+ tDist.inverseCumulativeProbability(p);
148
+
149
+ return Math.sqrt(2) * t;
150
+ }
151
+ }
152
+ // ボンフェロー法
153
+ private class BonferroniTest implements HypothesisTest {
154
+ private int k = 0;
155
+ private int n = 0;
156
+ private int m = 0;
157
+ public double[][] calcTestStatistic(double[][] xi) {
158
+ n = xi.length;
159
+ m = xi[0].length;
160
+ double[][] statistic = new double[n][n];
161
+ double[] mean = calcStdMean(xi);
162
+ Combinations c = new Combinations(n, 2);
163
+ List<int[]> al = new ArrayList<>();
164
+ for(int[] iterate : c) {
165
+ al.add(iterate);
166
+ }
167
+ k = al.size();
168
+ double ve = calcVe(xi);
169
+ for(int[] array : al) {
170
+ int i = array[0];
171
+ int j = array[1];
172
+ int n1 = xi[i].length;
173
+ int n2 = xi[j].length;
174
+
175
+ statistic[i][j] = Math.abs(mean[i] - mean[j])
176
+ / Math.sqrt((1.0 / n1 + 1.0 / n2) * ve);
177
+ }
178
+ return statistic;
179
+ }
180
+ public boolean[][] executeTest(double[][] statistic, double a) {
181
+ boolean[][] ret = new boolean[n][n];
182
+ double na = n * (m - 1);
183
+ TDistribution tDist = new TDistribution(na);
184
+
185
+ double t = tDist.inverseCumulativeProbability(1.0 - a / k);
186
+
187
+ for(int i = 0; i < n; i++) {
188
+ for(int j = i; j < n; j++) {
189
+ ret[i][j] = (statistic[i][j] >= t) ? true : false;
190
+ }
191
+ }
192
+ return ret;
193
+ }
194
+ private double[] calcStdMean(double[][] xi) {
195
+ double[] mean = new double[n];
196
+
197
+ for(int i = 0; i < n; i++) {
198
+ DescriptiveStatistics stat = new DescriptiveStatistics();
199
+ Arrays.stream(xi[i]).forEach(stat::addValue);
200
+
201
+ mean[i] = stat.getMean();
202
+ stat.clear();
203
+ }
204
+ return mean;
205
+ }
206
+ private double calcVe(double[][] xi) {
207
+ double na = n * (m - 1);
208
+ double sumSq = 0.0;
209
+
210
+ for(int i = 0; i < n; i++) {
211
+ DescriptiveStatistics stat = new DescriptiveStatistics();
212
+ Arrays.stream(xi[i]).forEach(stat::addValue);
213
+ double mean = stat.getMean();
214
+ for (int j = 0; j < m; j++) {
215
+ double diff = xi[i][j] - mean;
216
+ sumSq = sumSq + diff * diff;
217
+ }
218
+ stat.clear();
219
+ }
220
+ return sumSq / na;
221
+ }
222
+ }
223
+ }
224
+ }
225
+
@@ -17,7 +17,6 @@ import org.jfree.chart.axis.CategoryAxis;
17
17
  import org.jfree.chart.axis.NumberAxis;
18
18
  import org.jfree.chart.renderer.category.LineAndShapeRenderer;
19
19
  import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
20
- import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
21
20
 
22
21
  import org.jfree.chart.ChartUtils;
23
22
  import java.io.File;
data/lib/multicomp.rb ADDED
@@ -0,0 +1,73 @@
1
+ require 'java'
2
+ require 'num4anova.jar'
3
+ require 'jfreechart-1.5.4.jar'
4
+ require 'commons-math3-3.6.1.jar'
5
+
6
+ java_import 'MultiComp'
7
+ # 多重比較を行う
8
+ # (Apache commoms math3使用)
9
+ module MultiCompLib
10
+ # パラメトリック検定
11
+ class ParametrixTestLib
12
+ def initialize
13
+ @paramTest = MultiComp::ParametrixTest.getInstance()
14
+ end
15
+ # turkeyの方法による多重比較
16
+ #
17
+ # @overload turkey_test(xi, a)
18
+ # @param [array] xi データ(double[][])
19
+ # @param [double] a 有意水準
20
+ # @return [Array] 検定結果(boolean[][] true:棄却域内 false:棄却域外)
21
+ # @example
22
+ # xi = [
23
+ # [12.2, 18.8, 18.2],
24
+ # [22.2, 20.5, 14.6],
25
+ # [20.8, 19.5, 26.3],
26
+ # [26.4, 32.5, 31.3],
27
+ # [24.5, 21.2, 22.4],
28
+ # ]
29
+ # paraTest.turkey_test(xi, a)
30
+ # =>
31
+ # [
32
+ # [false, false, false, true, false],
33
+ # [false, false, false, true, false],
34
+ # [false, false, false, false, false],
35
+ # [false, false, false, false, false],
36
+ # [false, false, false, false, false],
37
+ # ]
38
+ def turkey_test(xi, a)
39
+ ret = @paramTest.turkeyTest(xi.to_java(Java::double[]), a)
40
+ return ret.to_a
41
+ end
42
+ # ボンフェロー二の不等式による多重比較
43
+ #
44
+ # @overload bonferrono_test(xi, a)
45
+ # @param [array] xi データ(double[][])
46
+ # @param [double] a 有意水準
47
+ # @return [Array] 検定結果(boolean[][] true:棄却域内 false:棄却域外)
48
+ # @example
49
+ # xi = [
50
+ # [12.2, 18.8, 18.2],
51
+ # [22.2, 20.5, 14.6],
52
+ # [20.8, 19.5, 26.3],
53
+ # [26.4, 32.5, 31.3],
54
+ # [24.5, 21.2, 22.4],
55
+ # ]
56
+ # paraTest.bonferrono_test(xi, a)
57
+ # =>
58
+ # [
59
+ # [false, false, false, true, false],
60
+ # [false, false, false, true, false],
61
+ # [false, false, false, false, false],
62
+ # [false, false, false, false, false],
63
+ # [false, false, false, false, false],
64
+ # ]
65
+ def bonferrono_test(xi, a)
66
+ ret = @paramTest.bonferronoTest(xi.to_java(Java::double[]), a)
67
+ return ret.to_a
68
+ end
69
+ end
70
+ # ノンパラメトリック検定
71
+ class NonParametrixTestLib
72
+ end
73
+ end
data/lib/num4anova.rb CHANGED
@@ -5,7 +5,8 @@ require 'commons-math3-3.6.1.jar'
5
5
 
6
6
  java_import 'OneWayLayout'
7
7
  java_import 'java.util.HashMap'
8
- # 数値計算による分散分析を行う
8
+ # 分散分析を行う
9
+ # (Apache commoms math3使用)
9
10
  module Num4AnovaLib
10
11
  # 一元配置の分散分析
11
12
  class OneWayLayoutLib
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: num4anova
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: java
6
6
  authors:
7
7
  - siranovel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-09 00:00:00.000000000 Z
11
+ date: 2024-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -61,10 +61,12 @@ files:
61
61
  - Gemfile
62
62
  - LICENSE
63
63
  - Rakefile
64
+ - ext/num4anova/MultiComp.java
64
65
  - ext/num4anova/OneWayLayout.java
65
66
  - lib/commons-math3-3.6.1.jar
66
67
  - lib/jcommon-1.0.23.jar
67
68
  - lib/jfreechart-1.5.4.jar
69
+ - lib/multicomp.rb
68
70
  - lib/num4anova.rb
69
71
  homepage: http://github.com/siranovel/num4varanly
70
72
  licenses: