num4anova 0.0.2-java → 0.0.4-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: 3987057ab3576c0da8a66256901cf7548ad7bf4bef7aaafccf128b083655333d
4
- data.tar.gz: 4b35674f595de9f05b4056ec6c20d671549341aad88083e5dfd928a881de5c7a
3
+ metadata.gz: ca0164a7092861bfca67f257129332375e90bfae762365194ced78ef75a293a7
4
+ data.tar.gz: 16f17fb717e3d92c27c4c651e034704cd81609a3adc293555eac54f9209884be
5
5
  SHA512:
6
- metadata.gz: 75fd29b81f0c79fa4f72520ced191bccc543d1cf86875425f9408a7c25aeeb8dc0b3417a3af3838bbc2dadee641da79f1fd43b46dc3a02f7e920ffafc1f6e1e7
7
- data.tar.gz: 4a9226cc5d20f86fda993eecc91048edc77a7157da8b2d44c305fdcbf9849aeb0c2c6d4c270b623d62a061daee67aff8864e039280282fc8c2a415453f8e8334
6
+ metadata.gz: e14efb373cde03fc5872f3dfb1d4186e5d2263b0b7597970d1629c562cfb6696ecf2cdbfc3325aa2d732e252241de093c156b7d9da21b51a8ea305f3e24e0e0f
7
+ data.tar.gz: c9b7f310d00d060d1c6fee3e8e9f5c43fce812a65d51b192315c72a378de7e2bc775e1118346373a93047c1cd8880240d03d52309ec0d8f567481923f14e31b4
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.0.4] - 2024-01-30
6
+ ### add
7
+ - add function of replicate_plot
8
+ - add function of replicate_test
9
+
10
+ ## [0.0.3] - 2024-01-26
11
+
12
+ ### add
13
+ - add function of dunnet_test
14
+
5
15
  ## [0.0.2] - 2024-01-23
6
16
 
7
17
  ### add
@@ -23,6 +23,28 @@ public class MultiComp {
23
23
  double[][] statistic = hypoth.calcTestStatistic(xi);
24
24
  return hypoth.executeTest(statistic, a * 0.5);
25
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
+ }
26
48
  /*********************************/
27
49
  /* interface define */
28
50
  /*********************************/
@@ -145,7 +167,6 @@ public class MultiComp {
145
167
  TDistribution tDist = new TDistribution(v);
146
168
  double t =
147
169
  tDist.inverseCumulativeProbability(p);
148
-
149
170
  return Math.sqrt(2) * t;
150
171
  }
151
172
  }
@@ -220,6 +241,130 @@ public class MultiComp {
220
241
  return sumSq / na;
221
242
  }
222
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
+
253
+ public double[][] calcTestStatistic(double[][] xi) {
254
+ k = xi.length;
255
+ mean = new double[k];
256
+ n = new double[k];
257
+ double[][] statistic = new double[k][k];
258
+ double ve = calcVe(xi);
259
+
260
+ for(int i = 0; i < k; i++) {
261
+ for(int j = 0; j < k; j++) {
262
+ statistic[i][j] = (mean[j] - mean[i])
263
+ / Math.sqrt(ve * (1.0 / n[j] + 1.0 / n[i]));
264
+ }
265
+ }
266
+ return statistic;
267
+ }
268
+ private double calcVe(double[][] xi) {
269
+ double sumSq = 0.0;
270
+ int sumN = 0;
271
+
272
+ for(int i = 0; i < k; i++) {
273
+ DescriptiveStatistics stat = new DescriptiveStatistics();
274
+
275
+ Arrays.stream(xi[i]).forEach(stat::addValue);
276
+ mean[i] = stat.getMean();
277
+ n[i] = stat.getN();
278
+ sumSq += (n[i] - 1) * stat.getVariance();
279
+ sumN += n[i];
280
+ stat.clear();
281
+ }
282
+ v = sumN - k;
283
+ return sumSq / v;
284
+ }
285
+ }
286
+ private class TwoSideTest extends DunnetTest
287
+ implements HypothesisTest {
288
+ public boolean[][] executeTest(double[][] statistic, double a) {
289
+ int v = super.getV();
290
+ int k = super.getK();
291
+ double den = k - 1;
292
+
293
+ TDistribution tDist = new TDistribution(v);
294
+ double l_val = tDist.inverseCumulativeProbability(a / den);
295
+ double r_val = tDist.inverseCumulativeProbability(1.0 - a / den);
296
+ boolean[][] ret = new boolean[k][k];
297
+
298
+ for(int i = 0; i < k; i++) {
299
+ for(int j = 0; j < k; j++) {
300
+ ret[i][j] = evaluation(statistic[i][j], l_val, r_val );
301
+ }
302
+ }
303
+ return ret;
304
+ }
305
+ private boolean evaluation(double statistic, double l_val, double r_val) {
306
+ boolean ret = true;
307
+
308
+ if ((l_val < statistic) && (statistic < r_val)) {
309
+ ret = false;
310
+ }
311
+ return ret;
312
+ }
313
+ }
314
+ private class RightSideTest extends DunnetTest
315
+ implements HypothesisTest {
316
+ public boolean[][] executeTest(double[][] statistic, double a) {
317
+ int v = super.getV();
318
+ int k = super.getK();
319
+ double den = k - 1;
320
+ double p = 1.0 - a / den;
321
+ TDistribution tDist = new TDistribution(v);
322
+ double r_val = tDist.inverseCumulativeProbability(1.0 - a);
323
+ boolean[][] ret = new boolean[k][k];
324
+
325
+ for(int i = 0; i < k; i++) {
326
+ for(int j = 0; j < k; j++) {
327
+ ret[i][j] = evaluation(statistic[i][j], r_val );
328
+ }
329
+ }
330
+ return ret;
331
+ }
332
+ private boolean evaluation(double statistic, double r_val) {
333
+ boolean ret = true;
334
+
335
+ if (statistic < r_val) {
336
+ ret = false;
337
+ }
338
+ return ret;
339
+ }
340
+ }
341
+ private class LeftSideTest extends DunnetTest
342
+ implements HypothesisTest {
343
+ public boolean[][] executeTest(double[][] statistic, double a) {
344
+ int v = super.getV();
345
+ int k = super.getK();
346
+ double den = k - 1;
347
+ double p = a / den;
348
+ TDistribution tDist = new TDistribution(v);
349
+ double l_val = tDist.inverseCumulativeProbability(a);
350
+ boolean[][] ret = new boolean[k][k];
351
+
352
+ for(int i = 0; i < k; i++) {
353
+ for(int j = 0; j < k; j++) {
354
+ ret[i][j] = evaluation(statistic[i][j], l_val );
355
+ }
356
+ }
357
+ return ret;
358
+ }
359
+ private boolean evaluation(double statistic, double l_val) {
360
+ boolean ret = true;
361
+
362
+ if (l_val < statistic) {
363
+ ret = false;
364
+ }
365
+ return ret;
366
+ }
367
+ }
223
368
  }
224
369
  }
225
370
 
@@ -28,6 +28,7 @@ import java.util.ArrayList;
28
28
  import org.apache.commons.math3.stat.inference.OneWayAnova;
29
29
  import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
30
30
  import org.apache.commons.math3.distribution.ChiSquaredDistribution;
31
+ import org.apache.commons.math3.distribution.FDistribution;
31
32
  import java.util.Map;
32
33
  public class OneWayLayout {
33
34
  private static OneWayLayout oneWay = new OneWayLayout();
@@ -59,6 +60,18 @@ public class OneWayLayout {
59
60
  double statistic = oneway.calcTestStatistic(xi);
60
61
  return oneway.test(statistic, a);
61
62
  }
63
+ public void replicatePlot(String dname, Map<String, double[]> vals) {
64
+ ChartPlot plot = new ReplicateChartPlot();
65
+
66
+ JFreeChart chart = plot.createChart("反復測定", dname, vals);
67
+ plot.writeJPEG("replicate.jpeg", chart, 800, 500);
68
+ }
69
+ public boolean replicateTest(double[][] xi, double a) {
70
+ OneWayAnovaTest oneway = new ReplicateTest();
71
+
72
+ double statistic = oneway.calcTestStatistic(xi);
73
+ return oneway.test(statistic, a);
74
+ }
62
75
  /*********************************/
63
76
  /* interface define */
64
77
  /*********************************/
@@ -196,6 +209,7 @@ public class OneWayLayout {
196
209
  }
197
210
  }
198
211
  }
212
+ // バートレット検定
199
213
  private class BartletTest implements OneWayAnovaTest {
200
214
  private int n = 0;
201
215
  public double calcTestStatistic(double[][] xi) {
@@ -226,6 +240,7 @@ public class OneWayLayout {
226
240
  double invSumN = 0.0;
227
241
  int sumN = 0;
228
242
  DescriptiveStatistics stat = new DescriptiveStatistics();
243
+
229
244
  for(int i = 0; i < n; i++) {
230
245
  Arrays.stream(xi[i]).forEach(stat::addValue);
231
246
  invSumN += 1.0 / (stat.getN() - 1.0);
@@ -243,5 +258,127 @@ public class OneWayLayout {
243
258
  return (r_val < statistic) ? true : false;
244
259
  }
245
260
  }
261
+ // 反復測定Plot
262
+ private class ReplicateChartPlot implements ChartPlot {
263
+ public JFreeChart createChart(String title, String dname, Map<String, double[]> vals) {
264
+ CategoryPlot plot = createPlot(dname, vals);
265
+ ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
266
+ JFreeChart chart = new JFreeChart(title, plot);
267
+
268
+ ChartUtils.applyCurrentTheme(chart);
269
+ return chart;
270
+ }
271
+ private CategoryPlot createPlot( String dname, Map<String, double[]> vals) {
272
+ CreatePlot plotImpl = new ReplicatePlot();
273
+
274
+ return plotImpl.createPlot(dname, vals);
275
+ }
276
+ private class ReplicatePlot implements CreatePlot {
277
+ public CategoryPlot createPlot(String dname, Map<String, double[]> vals) {
278
+ LineAndShapeRenderer renderer = new LineAndShapeRenderer(true, true);
279
+
280
+ renderer.setDefaultToolTipGenerator(
281
+ new StandardCategoryToolTipGenerator()
282
+ );
283
+ CategoryPlot plot = new CategoryPlot();
284
+
285
+ plot.setOrientation(PlotOrientation.VERTICAL);
286
+ plot.mapDatasetToRangeAxis(0,0);
287
+ plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
288
+
289
+ /*--- 横軸 ---*/
290
+ CategoryAxis categoryAxis = new CategoryAxis("因子");
291
+ plot.setDomainAxis(categoryAxis);
292
+
293
+ /*--- 縦軸 ---*/
294
+ NumberAxis valueAxis0 = new NumberAxis("推定周辺平均");
295
+ plot.setRangeAxis(valueAxis0);
296
+
297
+ plot.setRenderer(0, renderer);
298
+ plot.setDataset(0, createDataset(dname, vals));
299
+ return plot;
300
+ }
301
+ private CategoryDataset createDataset(String dname, Map<String, double[]> vals) {
302
+ DefaultCategoryDataset data = new DefaultCategoryDataset();
303
+ DescriptiveStatistics stat = new DescriptiveStatistics();
304
+
305
+ for(Map.Entry<String, double[]> entry : vals.entrySet()) {
306
+ double[] v = entry.getValue();
307
+
308
+ Arrays.stream(v).forEach(stat::addValue);
309
+ data.addValue(stat.getMean(), dname, entry.getKey());
310
+ stat.clear();
311
+ }
312
+ return data;
313
+ }
314
+ }
315
+ }
316
+ private class ReplicateTest implements OneWayAnovaTest {
317
+ private int a1 = 0;
318
+ private int b1 = 0;
319
+ public double calcTestStatistic(double[][] xi) {
320
+ b1 = xi[0].length;
321
+ a1 = xi.length;
322
+ double st = calcSt(xi, a1, b1);
323
+ double sa = calcSa(xi, a1, b1);
324
+ double sb = calcSb(xi, a1, b1);
325
+ double se = st - sa - sb;
326
+ double meanSa = sa / (a1 - 1);
327
+ double meanSe = se / ((a1 - 1) * (b1 - 1));
328
+
329
+ return meanSa / meanSe ;
330
+ }
331
+ private double calcSt(double[][] xi, int a, int b) {
332
+ DescriptiveStatistics stat = new DescriptiveStatistics();
333
+ double sumSt1 = 0.0;
334
+ double sumSt2 = 0.0;
335
+
336
+ for(int i = 0; i < a; i++) {
337
+ Arrays.stream(xi[i]).forEach(stat::addValue);
338
+ sumSt1 += stat.getSumsq();
339
+ sumSt2 += stat.getSum();
340
+ stat.clear();
341
+ }
342
+ return sumSt1 - sumSt2 * sumSt2 / (a * b);
343
+ }
344
+ private double calcSa(double[][] xi, int a, int b) {
345
+ double sumSa1 = 0.0;
346
+ double sumSa2 = 0.0;
347
+ double[] an = new double[a];
348
+
349
+ for(int i = 0; i < a; i++) {
350
+ for(int j = 0; j < b; j++) {
351
+ an[i] += xi[i][j];
352
+ sumSa2 += xi[i][j];
353
+ }
354
+ }
355
+ DescriptiveStatistics stat = new DescriptiveStatistics();
356
+ Arrays.stream(an).forEach(stat::addValue);
357
+ sumSa1 = stat.getSumsq() / b;
358
+ return sumSa1 - sumSa2 * sumSa2 / (a * b);
359
+ }
360
+ private double calcSb(double[][] xi, int a, int b) {
361
+ double[] bn = new double[b];
362
+ double sumSb1 = 0.0;
363
+ double sumSb2 = 0.0;
364
+
365
+ for(int i = 0; i < a; i++) {
366
+ for(int j = 0; j < b; j++) {
367
+ bn[j] += xi[i][j];
368
+ sumSb2 += xi[i][j];
369
+ }
370
+ }
371
+ DescriptiveStatistics stat = new DescriptiveStatistics();
372
+ Arrays.stream(bn).forEach(stat::addValue);
373
+ sumSb1 = stat.getSumsq() / a;
374
+ return sumSb1 - sumSb2 * sumSb2 / (a * b);
375
+ }
376
+ public boolean test(double statistic, double a) {
377
+ FDistribution fDist = new FDistribution(a1 - 1, (a1 - 1) * (b1 - 1));
378
+ double f = fDist.inverseCumulativeProbability(1.0 - a);
379
+
380
+ return (statistic >= f) ? true : false;
381
+ }
382
+ }
246
383
  }
247
384
 
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 CHANGED
@@ -3,12 +3,15 @@ require 'num4anova.jar'
3
3
  require 'jfreechart-1.5.4.jar'
4
4
  require 'commons-math3-3.6.1.jar'
5
5
 
6
+ require_relative('dunnet')
7
+
6
8
  java_import 'MultiComp'
7
9
  # 多重比較を行う
8
10
  # (Apache commoms math3使用)
9
11
  module MultiCompLib
10
12
  # パラメトリック検定
11
13
  class ParametrixTestLib
14
+ include DunnetTestLib
12
15
  def initialize
13
16
  @paramTest = MultiComp::ParametrixTest.getInstance()
14
17
  end
@@ -26,7 +29,8 @@ module MultiCompLib
26
29
  # [26.4, 32.5, 31.3],
27
30
  # [24.5, 21.2, 22.4],
28
31
  # ]
29
- # paraTest.turkey_test(xi, a)
32
+ # paraTest = MultiCompLib::ParametrixTestLib.new
33
+ # paraTest.turkey_test(xi, 0.05)
30
34
  # =>
31
35
  # [
32
36
  # [false, false, false, true, false],
@@ -53,7 +57,8 @@ module MultiCompLib
53
57
  # [26.4, 32.5, 31.3],
54
58
  # [24.5, 21.2, 22.4],
55
59
  # ]
56
- # paraTest.bonferrono_test(xi, a)
60
+ # paraTest = MultiCompLib::ParametrixTestLib.new
61
+ # paraTest.bonferrono_test(xi, 0.05)
57
62
  # =>
58
63
  # [
59
64
  # [false, false, false, true, false],
data/lib/num4anova.rb CHANGED
@@ -72,13 +72,13 @@ module Num4AnovaLib
72
72
  # @param [double] a 有意水準
73
73
  # @return [boolean] 検定結果(true:棄却域内 false:棄却域外)
74
74
  # @example
75
- # xi = [
76
- # [12.2, 18.8, 18.2],
77
- # [22.2, 20.5, 14.6],
78
- # [20.8, 19.5, 26.3],
79
- # [26.4, 32.5, 31.3],
80
- # [24.5, 21.2, 22.4],
81
- # ]
75
+ # xi = [
76
+ # [12.2, 18.8, 18.2],
77
+ # [22.2, 20.5, 14.6],
78
+ # [20.8, 19.5, 26.3],
79
+ # [26.4, 32.5, 31.3],
80
+ # [24.5, 21.2, 22.4],
81
+ # ]
82
82
  # oneWay = Num4AnovaLib::OneWayLayoutLib.new
83
83
  # oneWay.oneWay.oneway_anova(xi, 0.05)
84
84
  # => true
@@ -92,19 +92,63 @@ module Num4AnovaLib
92
92
  # @param [double] a 有意水準
93
93
  # @return [boolean] 検定結果(true:棄却域内 false:棄却域外)
94
94
  # @example
95
- # xi = [
96
- # [12.2, 18.8, 18.2],
97
- # [22.2, 20.5, 14.6],
98
- # [20.8, 19.5, 26.3],
99
- # [26.4, 32.5, 31.3],
100
- # [24.5, 21.2, 22.4],
101
- # ]
95
+ # xi = [
96
+ # [12.2, 18.8, 18.2],
97
+ # [22.2, 20.5, 14.6],
98
+ # [20.8, 19.5, 26.3],
99
+ # [26.4, 32.5, 31.3],
100
+ # [24.5, 21.2, 22.4],
101
+ # ]
102
102
  # oneWay = Num4AnovaLib::OneWayLayoutLib.new
103
103
  # oneWay.bartlet(xi, 0.05)
104
104
  # => true
105
105
  def bartlet(xi, a)
106
106
  return @oneWay.bartletTest(xi.to_java(Java::double[]), a)
107
107
  end
108
+ # 反復測定Plot
109
+ #
110
+ # @overload replicate_plot(dname, vals)
111
+ # @param [String] dname データ名
112
+ # @param [Hash] vals Hash(String, double[])
113
+ # @return [void] replicate.jpegファイルを出力
114
+ # @example
115
+ # vals = {
116
+ # "stageA1" => [27, 52, 18, 21, 32],
117
+ # "stageA2" => [52, 72, 31, 50, 45],
118
+ # "stageA3" => [47, 54, 29, 43, 32],
119
+ # "stageA4" => [28, 50, 22, 26, 29],
120
+ # }
121
+ # oneWay = Num4AnovaLib::OneWayLayoutLib.new
122
+ # oneWay.replicate_plot("LDH", vals)
123
+ # => replicate.jpeg
124
+ # @note
125
+ # グラフは、jfreechartを使用
126
+ def replicate_plot(dname, vals)
127
+ o = HashMap.new
128
+ vals.each{|k, v|
129
+ o[k] = v.to_java(Java::double)
130
+ }
131
+ return @oneWay.replicatePlot(dname, o)
132
+ end
133
+ # 反復測定検定
134
+ #
135
+ # @overload replicate_test(xi, a)
136
+ # @param [array] xi データ(double[][])
137
+ # @param [double] a 有意水準
138
+ # @return [boolean] 検定結果(true:棄却域内 false:棄却域外)
139
+ # @example
140
+ # xi = [
141
+ # [27, 52, 18, 21, 32],
142
+ # [52, 72, 31, 50, 45],
143
+ # [47, 54, 29, 43, 32],
144
+ # [28, 50, 22, 26, 29],
145
+ # ]
146
+ # oneWay = Num4AnovaLib::OneWayLayoutLib.new
147
+ # oneWay.replicate_test("LDH", vals)
148
+ # => true
149
+ def replicate_test(xi, a)
150
+ return @oneWay.replicateTest(xi.to_java(Java::double[]), a)
151
+ end
108
152
  end
109
153
  end
110
154
 
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.2
4
+ version: 0.0.4
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-23 00:00:00.000000000 Z
11
+ date: 2024-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -64,6 +64,7 @@ files:
64
64
  - ext/num4anova/MultiComp.java
65
65
  - ext/num4anova/OneWayLayout.java
66
66
  - lib/commons-math3-3.6.1.jar
67
+ - lib/dunnet.rb
67
68
  - lib/jcommon-1.0.23.jar
68
69
  - lib/jfreechart-1.5.4.jar
69
70
  - lib/multicomp.rb