num4anova 0.0.1-java → 0.0.3-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: 89f91d9c210bb998f14a726f1c7147470cba19fba721724625b7ec87e4c88ad9
4
+ data.tar.gz: a79f6e3ca4adc650193065ae62037cfed0580e5f7b9c5e1d06109d74f17a05d6
5
5
  SHA512:
6
- metadata.gz: 756c787954a6c83b735781b4230b1f113bd3e944d7262e7dd2197cacf39bed1640555d5dfaa555552f6433f1b7905c2211948dc54ce5a1686520f23162316014
7
- data.tar.gz: 878cd5056eed4258da283789036ebd0b209fc19e215a9e4bc6ffdf2d657bccecff858db6f4e4ad643ec215597e902edc20592bc5704cb906e693b720fe343d50
6
+ metadata.gz: 97a1409dfb791766292e8d6c0a49502555911529632d45b72aa6c68bc6fda7e82ed813fff4c005c9c76745a2ad05fe79d1131e23879da18afcc88d0652617c29
7
+ data.tar.gz: 4cd28879971daf44d20ff8122120327e8a74519f658a22e052724af316387c057cfb315a6d1cb23324bbd08634c066c1045594d6c8804f1f87e12d31b6acd0fb
data/CHANGELOG.md CHANGED
@@ -2,13 +2,17 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
- ## [0.0.2] - 2023-12-12
5
+ ## [0.0.3] - 2024-01-26
6
6
 
7
- ### change
8
- - chg Q-QPlot and kstest
9
- - chg from one-side test to two side test.
7
+ ### add
8
+ - add function of dunnet_test.
10
9
 
11
- ## [0.0.1] - 2023-12-05
10
+ ## [0.0.2] - 2024-01-23
11
+
12
+ ### add
13
+ - add Multiple Comparisons function.
14
+
15
+ ## [0.0.1] - 2024-01-10
12
16
 
13
17
  ### Fixed
14
18
  - 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,367 @@
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
+ public boolean scheffe_test(double[][] xi, double a) {
27
+ return false;
28
+ }
29
+
30
+ public boolean[][] twosideTest(double[][] xi, double a) {
31
+ HypothesisTest hypoth = new TwoSideTest();
32
+ double[][] statistic = hypoth.calcTestStatistic(xi);
33
+
34
+ return hypoth.executeTest(statistic, a / 2.0);
35
+ }
36
+ public boolean[][] rightsideTest(double[][] xi, double a) {
37
+ HypothesisTest hypoth = new RightSideTest();
38
+ double[][] statistic = hypoth.calcTestStatistic(xi);
39
+
40
+ return hypoth.executeTest(statistic, a);
41
+ }
42
+ public boolean[][] leftsideTest(double[][] xi, double a) {
43
+ HypothesisTest hypoth = new LeftSideTest();
44
+ double[][] statistic = hypoth.calcTestStatistic(xi);
45
+
46
+ return hypoth.executeTest(statistic, a);
47
+ }
48
+ /*********************************/
49
+ /* interface define */
50
+ /*********************************/
51
+ private interface HypothesisTest {
52
+ double[][] calcTestStatistic(double[][] xi);
53
+ boolean[][] executeTest(double[][] statistic, double a);
54
+ }
55
+ /*********************************/
56
+ /* Class define */
57
+ /*********************************/
58
+ // turkey法
59
+ private class TurkeyTest implements HypothesisTest {
60
+ private int m = 0;
61
+ private int n = 0;
62
+ public double[][] calcTestStatistic(double[][] xi) {
63
+ n = xi.length; // a
64
+ m = xi[0].length; // n
65
+ double[][] statistic = new double[n][n];
66
+ double[] mean = calcStdMean(xi);
67
+ double ve = calcVe(xi);
68
+
69
+ for(int i = 0; i < n; i++) {
70
+ for(int j = i; j < n; j++) {
71
+ statistic[i][j] =
72
+ Math.abs(mean[i] - mean[j]) / Math.sqrt(ve / m);
73
+ }
74
+ }
75
+
76
+ return statistic;
77
+
78
+ }
79
+ public boolean[][] executeTest(double[][] statistic, double a) {
80
+ int v = n * (m - 1);
81
+ double q = qvalue(n, v, a);
82
+ boolean[][] ret = new boolean[n][n];
83
+
84
+ for(int i = 0; i < n; i++) {
85
+ for(int j = i; j < n; j++) {
86
+ ret[i][j] = (statistic[i][j] >= q) ? true : false;
87
+ }
88
+ }
89
+ return ret;
90
+ }
91
+
92
+ private double[] calcStdMean(double[][] xi) {
93
+ int n = xi.length;
94
+ double[] mean = new double[n];
95
+
96
+ for(int i = 0; i < n; i++) {
97
+ DescriptiveStatistics stat = new DescriptiveStatistics();
98
+ Arrays.stream(xi[i]).forEach(stat::addValue);
99
+
100
+ mean[i] = stat.getMean();
101
+ stat.clear();
102
+ }
103
+ return mean;
104
+ }
105
+ private double calcVe(double[][] xi) {
106
+ int n = xi.length;
107
+ int m = xi[0].length;
108
+ double na = n * (m - 1);
109
+ double sumSq = 0.0;
110
+
111
+ for(int i = 0; i < n; i++) {
112
+ DescriptiveStatistics stat = new DescriptiveStatistics();
113
+ Arrays.stream(xi[i]).forEach(stat::addValue);
114
+ double mean = stat.getMean();
115
+ for (int j = 0; j < m; j++) {
116
+ double diff = xi[i][j] - mean;
117
+ sumSq = sumSq + diff * diff;
118
+ }
119
+ stat.clear();
120
+ }
121
+ return sumSq / na;
122
+ }
123
+ // スチューデント化された範囲のa点
124
+ // v=120
125
+ // k=10 q= 4.5595 p2/a=0.016282 1/61.417516276
126
+ // k=8 q= 4.3630 p2/a=0.025263 1/39.583580731
127
+ // k=6 q= 4.0960 p2/a=0.044883 1/22.280150614
128
+ // k=5 q= 3.9169 p2/a=0.065040 1/15.375153752
129
+ // k=4 q= 3.6846 p2/a=0.103377 1/9.673331592
130
+ // k=3 q= 3.3561 p2/a=0.192270 1/5.2010194
131
+ // k=2 q= 2.8000 p2/a=0.500036 1/2
132
+ // v=14
133
+ // k=10 q= 5.2534 p2/a=0.023091 1/43.306916115
134
+ // k=8 q= 4.9903 p2/a=0.033394 1/29.945499191
135
+ // k=6 q= 4.6385 p2/a=0.054768 1/18.258837277
136
+ // k=5 q= 4.4066 p2/a=0.075883 1/13.178182202
137
+ // k=4 q= 4.1105 p2/a=0.114920 1/8.701705534
138
+ // k=3 q= 3.7014 p2/a=0.202830 1/4.930237144
139
+ // k=2 q= 3.0332 p2/a=0.499991 1/2.000036001
140
+ // v=12
141
+ // k=10 q= 5.3946 p2/a=0.024637 1/40.58935747
142
+ // k=8 q= 5.1187 p2/a=0.035180 1/28.425241615
143
+ // k=6 q= 4.7502 p2/a=0.056858 1/17.587674558
144
+ // k=5 q= 4.5077 p2/a=0.078128 1/12.799508499
145
+ // k=4 q= 4.1987 p2/a=0.117245 1/8.529148365
146
+ // k=3 q= 3.7729 p2/a=0.204923 1/4.879881712
147
+ // k=2 q= 3.0813 p2/a=0.500004 1/2
148
+ // v=10
149
+ // k=10 q= 5.5984 p2/a=0.026922 1/37.144342917
150
+ // k=8 q= 5.3042 p2/a=0.037799 1/26.455726342
151
+ // k=6 q= 4.9128 p2/a=0.059822 1/16.716258233
152
+ // k=5 q= 4.6543 p2/a=0.081351 1/12.292411894
153
+ // k=4 q= 4.3266 p2/a=0.120575 1/8.293593199
154
+ // k=3 q= 3.8768 p2/a=0.207859 1/4.810953579
155
+ // k=2 q= 3.1511 p2/a=0.499979 1/2
156
+ // v=9
157
+ // k=10 q= 5.7384 p2/a=0.028519 1/35.06434307
158
+ // k=8 q= 5.4312 p2/a=0.039639 1/25.22767981
159
+ // k=6 q= 5.0235 p2/a=0.061950 1/16.14205004
160
+ // k=5 q= 4.7554 p2/a=0.083549 1/11.969024165
161
+ // k=4 q= 4.4149 p2/a=0.122828 1/8.141466115
162
+ // k=3 q= 3.9485 p2/a=0.209848 1/4.76535397
163
+ // k=2 q= 3.1992 p2/a=0.499985 1/2
164
+ private double qvalue(int k, int v, double a) {
165
+ double den = (k-1) * (2 + k) / 2;
166
+ double p = 1.0 - a / den;
167
+ TDistribution tDist = new TDistribution(v);
168
+ double t =
169
+ tDist.inverseCumulativeProbability(p);
170
+ return Math.sqrt(2) * t;
171
+ }
172
+ }
173
+ // ボンフェロー法
174
+ private class BonferroniTest implements HypothesisTest {
175
+ private int k = 0;
176
+ private int n = 0;
177
+ private int m = 0;
178
+ public double[][] calcTestStatistic(double[][] xi) {
179
+ n = xi.length;
180
+ m = xi[0].length;
181
+ double[][] statistic = new double[n][n];
182
+ double[] mean = calcStdMean(xi);
183
+ Combinations c = new Combinations(n, 2);
184
+ List<int[]> al = new ArrayList<>();
185
+ for(int[] iterate : c) {
186
+ al.add(iterate);
187
+ }
188
+ k = al.size();
189
+ double ve = calcVe(xi);
190
+ for(int[] array : al) {
191
+ int i = array[0];
192
+ int j = array[1];
193
+ int n1 = xi[i].length;
194
+ int n2 = xi[j].length;
195
+
196
+ statistic[i][j] = Math.abs(mean[i] - mean[j])
197
+ / Math.sqrt((1.0 / n1 + 1.0 / n2) * ve);
198
+ }
199
+ return statistic;
200
+ }
201
+ public boolean[][] executeTest(double[][] statistic, double a) {
202
+ boolean[][] ret = new boolean[n][n];
203
+ double na = n * (m - 1);
204
+ TDistribution tDist = new TDistribution(na);
205
+
206
+ double t = tDist.inverseCumulativeProbability(1.0 - a / k);
207
+
208
+ for(int i = 0; i < n; i++) {
209
+ for(int j = i; j < n; j++) {
210
+ ret[i][j] = (statistic[i][j] >= t) ? true : false;
211
+ }
212
+ }
213
+ return ret;
214
+ }
215
+ private double[] calcStdMean(double[][] xi) {
216
+ double[] mean = new double[n];
217
+
218
+ for(int i = 0; i < n; i++) {
219
+ DescriptiveStatistics stat = new DescriptiveStatistics();
220
+ Arrays.stream(xi[i]).forEach(stat::addValue);
221
+
222
+ mean[i] = stat.getMean();
223
+ stat.clear();
224
+ }
225
+ return mean;
226
+ }
227
+ private double calcVe(double[][] xi) {
228
+ double na = n * (m - 1);
229
+ double sumSq = 0.0;
230
+
231
+ for(int i = 0; i < n; i++) {
232
+ DescriptiveStatistics stat = new DescriptiveStatistics();
233
+ Arrays.stream(xi[i]).forEach(stat::addValue);
234
+ double mean = stat.getMean();
235
+ for (int j = 0; j < m; j++) {
236
+ double diff = xi[i][j] - mean;
237
+ sumSq = sumSq + diff * diff;
238
+ }
239
+ stat.clear();
240
+ }
241
+ return sumSq / na;
242
+ }
243
+ }
244
+ // ダネット法
245
+ private class DunnetTest{
246
+ private int k = 0;
247
+ private int v = 0;
248
+ private double[] mean = null;
249
+ private double[] n = null;
250
+ protected int getK() { return k;}
251
+ protected int getV() { return v;}
252
+ public double[][] calcTestStatistic(double[][] xi) {
253
+ k = xi.length;
254
+ mean = new double[k];
255
+ n = new double[k];
256
+ double[][] statistic = new double[k][k];
257
+ double ve = calcVe(xi);
258
+
259
+ for(int i = 0; i < k; i++) {
260
+ for(int j = 0; j < k; j++) {
261
+ statistic[i][j] = (mean[j] - mean[i])
262
+ / Math.sqrt(ve * (1.0 / n[j] + 1.0 / n[i]));
263
+ }
264
+ }
265
+ return statistic;
266
+ }
267
+ private double calcVe(double[][] xi) {
268
+ double sumSq = 0.0;
269
+ int sumN = 0;
270
+ for(int i = 0; i < k; i++) {
271
+ DescriptiveStatistics stat = new DescriptiveStatistics();
272
+ Arrays.stream(xi[i]).forEach(stat::addValue);
273
+ mean[i] = stat.getMean();
274
+ n[i] = stat.getN();
275
+ sumSq += (n[i] - 1) * stat.getVariance();
276
+ sumN += n[i];
277
+ stat.clear();
278
+ }
279
+ v = sumN - k;
280
+ return sumSq / v;
281
+ }
282
+ }
283
+ private class TwoSideTest extends DunnetTest
284
+ implements HypothesisTest {
285
+ public boolean[][] executeTest(double[][] statistic, double a) {
286
+ int v = super.getV();
287
+ int k = super.getK();
288
+ double den = k - 1;
289
+ double p = 1.0 - a / den;
290
+ TDistribution tDist = new TDistribution(v);
291
+ double l_val = tDist.inverseCumulativeProbability(a / den);
292
+ double r_val = tDist.inverseCumulativeProbability(1.0 - a / den);
293
+ boolean[][] ret = new boolean[k][k];
294
+
295
+ for(int i = 0; i < k; i++) {
296
+ for(int j = 0; j < k; j++) {
297
+ ret[i][j] = evaluation(statistic[i][j], l_val, r_val );
298
+ }
299
+ }
300
+ return ret;
301
+ }
302
+ private boolean evaluation(double statistic, double l_val, double r_val) {
303
+ boolean ret = true;
304
+
305
+ if ((l_val < statistic) && (statistic < r_val)) {
306
+ ret = false;
307
+ }
308
+ return ret;
309
+ }
310
+ }
311
+ private class RightSideTest extends DunnetTest
312
+ implements HypothesisTest {
313
+ public boolean[][] executeTest(double[][] statistic, double a) {
314
+ int v = super.getV();
315
+ int k = super.getK();
316
+ double den = k - 1;
317
+ double p = 1.0 - a / den;
318
+ TDistribution tDist = new TDistribution(v);
319
+ double r_val = tDist.inverseCumulativeProbability(1.0 - a);
320
+ boolean[][] ret = new boolean[k][k];
321
+
322
+ for(int i = 0; i < k; i++) {
323
+ for(int j = 0; j < k; j++) {
324
+ ret[i][j] = evaluation(statistic[i][j], r_val );
325
+ }
326
+ }
327
+ return ret;
328
+ }
329
+ private boolean evaluation(double statistic, double r_val) {
330
+ boolean ret = true;
331
+
332
+ if (statistic < r_val) {
333
+ ret = false;
334
+ }
335
+ return ret;
336
+ }
337
+ }
338
+ private class LeftSideTest extends DunnetTest
339
+ implements HypothesisTest {
340
+ public boolean[][] executeTest(double[][] statistic, double a) {
341
+ int v = super.getV();
342
+ int k = super.getK();
343
+ double den = k - 1;
344
+ double p = a / den;
345
+ TDistribution tDist = new TDistribution(v);
346
+ double l_val = tDist.inverseCumulativeProbability(a);
347
+ boolean[][] ret = new boolean[k][k];
348
+
349
+ for(int i = 0; i < k; i++) {
350
+ for(int j = 0; j < k; j++) {
351
+ ret[i][j] = evaluation(statistic[i][j], l_val );
352
+ }
353
+ }
354
+ return ret;
355
+ }
356
+ private boolean evaluation(double statistic, double l_val) {
357
+ boolean ret = true;
358
+
359
+ if (l_val < statistic) {
360
+ ret = false;
361
+ }
362
+ return ret;
363
+ }
364
+ }
365
+ }
366
+ }
367
+
@@ -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/dunnet.rb ADDED
@@ -0,0 +1,89 @@
1
+ # Dunnet検定
2
+ # (Apache commoms math3使用)
3
+ module DunnetTestLib
4
+ # Dunnet検定の両側検定
5
+ #
6
+ # @overload twoside_test(xi, a)
7
+ # @param [array] xi データ(double[][])
8
+ # @param [double] a 有意水準
9
+ # @return [Array] 検定結果(boolean[][] true:棄却域内 false:棄却域外)
10
+ # @example
11
+ # xi = [
12
+ # [12.2, 18.8, 18.2],
13
+ # [22.2, 20.5, 14.6],
14
+ # [20.8, 19.5, 26.3],
15
+ # [26.4, 32.5, 31.3],
16
+ # [24.5, 21.2, 22.4],
17
+ # ]
18
+ # paraTest = MultiCompLib::ParametrixTestLib.new
19
+ # paraTest.twoside_test(xi, 0.05)
20
+ # =>
21
+ # res = [
22
+ # [false, false, false, true, false],
23
+ # [false, false, false, true, false],
24
+ # [false, false, false, false, false],
25
+ # [true, true, false, false, false],
26
+ # [false, false, false, false, false],
27
+ # ]
28
+ def twoside_test(xi, a)
29
+ ret = @paramTest.twosideTest(xi.to_java(Java::double[]), a)
30
+ return ret.to_a
31
+ end
32
+ # Dunnet検定の右側検定
33
+ #
34
+ # @overload rightside_test(xi, a)
35
+ # @param [array] xi データ(double[][])
36
+ # @param [double] a 有意水準
37
+ # @return [Array] 検定結果(boolean[][] true:棄却域内 false:棄却域外)
38
+ # @example
39
+ # xi = [
40
+ # [12.2, 18.8, 18.2],
41
+ # [22.2, 20.5, 14.6],
42
+ # [20.8, 19.5, 26.3],
43
+ # [26.4, 32.5, 31.3],
44
+ # [24.5, 21.2, 22.4],
45
+ # ]
46
+ # paraTest = MultiCompLib::ParametrixTestLib.new
47
+ # paraTest.rightside_test(xi, 0.05)
48
+ # =>
49
+ # res = [
50
+ # [false, false, true, true, true],
51
+ # [false, false, false, true, false],
52
+ # [false, false, false, true, false],
53
+ # [false, false, false, false, false],
54
+ # [false, false, false, true, false],
55
+ # ]
56
+ def rightside_test(xi, a)
57
+ ret = @paramTest.rightsideTest(xi.to_java(Java::double[]), a)
58
+ return ret.to_a
59
+ end
60
+ # Dunnet検定の左側検定
61
+ #
62
+ # @overload leftside_test(xi, a)
63
+ # @param [array] xi データ(double[][])
64
+ # @param [double] a 有意水準
65
+ # @return [Array] 検定結果(boolean[][] true:棄却域内 false:棄却域外)
66
+ # @example
67
+ # xi = [
68
+ # [12.2, 18.8, 18.2],
69
+ # [22.2, 20.5, 14.6],
70
+ # [20.8, 19.5, 26.3],
71
+ # [26.4, 32.5, 31.3],
72
+ # [24.5, 21.2, 22.4],
73
+ # ]
74
+ # paraTest = MultiCompLib::ParametrixTestLib.new
75
+ # paraTest.leftside_test(xi, 0.05)
76
+ # =>
77
+ # res = [
78
+ # [false, false, false, false, false],
79
+ # [false, false, false, false, false],
80
+ # [true, false, false, false, false],
81
+ # [true, true, true, false, true],
82
+ # [true, false, false, false, false],
83
+ # ]
84
+ def leftside_test(xi, a)
85
+ ret = @paramTest.leftsideTest(xi.to_java(Java::double[]), a)
86
+ return ret.to_a
87
+ end
88
+ end
89
+
data/lib/multicomp.rb ADDED
@@ -0,0 +1,78 @@
1
+ require 'java'
2
+ require 'num4anova.jar'
3
+ require 'jfreechart-1.5.4.jar'
4
+ require 'commons-math3-3.6.1.jar'
5
+
6
+ require_relative('dunnet')
7
+
8
+ java_import 'MultiComp'
9
+ # 多重比較を行う
10
+ # (Apache commoms math3使用)
11
+ module MultiCompLib
12
+ # パラメトリック検定
13
+ class ParametrixTestLib
14
+ include DunnetTestLib
15
+ def initialize
16
+ @paramTest = MultiComp::ParametrixTest.getInstance()
17
+ end
18
+ # turkeyの方法による多重比較
19
+ #
20
+ # @overload turkey_test(xi, a)
21
+ # @param [array] xi データ(double[][])
22
+ # @param [double] a 有意水準
23
+ # @return [Array] 検定結果(boolean[][] true:棄却域内 false:棄却域外)
24
+ # @example
25
+ # xi = [
26
+ # [12.2, 18.8, 18.2],
27
+ # [22.2, 20.5, 14.6],
28
+ # [20.8, 19.5, 26.3],
29
+ # [26.4, 32.5, 31.3],
30
+ # [24.5, 21.2, 22.4],
31
+ # ]
32
+ # paraTest = MultiCompLib::ParametrixTestLib.new
33
+ # paraTest.turkey_test(xi, 0.05)
34
+ # =>
35
+ # [
36
+ # [false, false, false, true, false],
37
+ # [false, false, false, true, false],
38
+ # [false, false, false, false, false],
39
+ # [false, false, false, false, false],
40
+ # [false, false, false, false, false],
41
+ # ]
42
+ def turkey_test(xi, a)
43
+ ret = @paramTest.turkeyTest(xi.to_java(Java::double[]), a)
44
+ return ret.to_a
45
+ end
46
+ # ボンフェロー二の不等式による多重比較
47
+ #
48
+ # @overload bonferrono_test(xi, a)
49
+ # @param [array] xi データ(double[][])
50
+ # @param [double] a 有意水準
51
+ # @return [Array] 検定結果(boolean[][] true:棄却域内 false:棄却域外)
52
+ # @example
53
+ # xi = [
54
+ # [12.2, 18.8, 18.2],
55
+ # [22.2, 20.5, 14.6],
56
+ # [20.8, 19.5, 26.3],
57
+ # [26.4, 32.5, 31.3],
58
+ # [24.5, 21.2, 22.4],
59
+ # ]
60
+ # paraTest = MultiCompLib::ParametrixTestLib.new
61
+ # paraTest.bonferrono_test(xi, 0.05)
62
+ # =>
63
+ # [
64
+ # [false, false, false, true, false],
65
+ # [false, false, false, true, false],
66
+ # [false, false, false, false, false],
67
+ # [false, false, false, false, false],
68
+ # [false, false, false, false, false],
69
+ # ]
70
+ def bonferrono_test(xi, a)
71
+ ret = @paramTest.bonferronoTest(xi.to_java(Java::double[]), a)
72
+ return ret.to_a
73
+ end
74
+ end
75
+ # ノンパラメトリック検定
76
+ class NonParametrixTestLib
77
+ end
78
+ 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.3
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-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -61,10 +61,13 @@ 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
67
+ - lib/dunnet.rb
66
68
  - lib/jcommon-1.0.23.jar
67
69
  - lib/jfreechart-1.5.4.jar
70
+ - lib/multicomp.rb
68
71
  - lib/num4anova.rb
69
72
  homepage: http://github.com/siranovel/num4varanly
70
73
  licenses: