num4anova 0.0.2-java → 0.0.4-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 +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/num4anova/MultiComp.java +146 -1
- data/ext/num4anova/OneWayLayout.java +137 -0
- data/lib/dunnet.rb +89 -0
- data/lib/multicomp.rb +7 -2
- data/lib/num4anova.rb +58 -14
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ca0164a7092861bfca67f257129332375e90bfae762365194ced78ef75a293a7
|
|
4
|
+
data.tar.gz: 16f17fb717e3d92c27c4c651e034704cd81609a3adc293555eac54f9209884be
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e14efb373cde03fc5872f3dfb1d4186e5d2263b0b7597970d1629c562cfb6696ecf2cdbfc3325aa2d732e252241de093c156b7d9da21b51a8ea305f3e24e0e0f
|
|
7
|
+
data.tar.gz: c9b7f310d00d060d1c6fee3e8e9f5c43fce812a65d51b192315c72a378de7e2bc775e1118346373a93047c1cd8880240d03d52309ec0d8f567481923f14e31b4
|
data/CHANGELOG.md
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
#
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
#
|
|
79
|
-
#
|
|
80
|
-
#
|
|
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
|
-
#
|
|
96
|
-
#
|
|
97
|
-
#
|
|
98
|
-
#
|
|
99
|
-
#
|
|
100
|
-
#
|
|
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.
|
|
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-
|
|
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
|