num4anova 0.0.1-java → 0.0.2-java

Sign up to get free protection for your applications and to get access to all the features.
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: