num4anova 0.0.3-java → 0.0.5-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 +11 -1
- data/ext/num4anova/MultiComp.java +4 -1
- data/ext/num4anova/OneWayLayout.java +140 -3
- data/ext/num4anova/TwoWayLayout.java +186 -0
- data/lib/num4anova.rb +103 -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: 7a089d52ead2c9726d9ca61db475f128925afddca7cbcf6f65f0da75e41f0b1b
|
4
|
+
data.tar.gz: 050e29e04bd0e8272da89d5aba231fe08294f50f090d261da7aa6822f5df5bc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0cc84d4cebb416b04ed0360ef4cf72799aaebcf70104b6e2d2dc2bc471400d3ac313b71f5885fd0854ae8b3ae22dd66c753066233b1ed2848aabf586cee2c05
|
7
|
+
data.tar.gz: 88a74fb295e7ce0e0bdba405a14239a37fac4f3115bd29f358ce7b54fcc3b71a1533ff095e5aea7e2b141d867051eca703d179874f1ed349aef92575d8d0a186
|
data/CHANGELOG.md
CHANGED
@@ -2,10 +2,20 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## [0.0.5] - 2024-02-01
|
6
|
+
|
7
|
+
### add
|
8
|
+
- add function of twoway_anova.
|
9
|
+
|
10
|
+
## [0.0.4] - 2024-01-30
|
11
|
+
### add
|
12
|
+
- add function of replicate_plot
|
13
|
+
- add function of replicate_test
|
14
|
+
|
5
15
|
## [0.0.3] - 2024-01-26
|
6
16
|
|
7
17
|
### add
|
8
|
-
- add function of dunnet_test
|
18
|
+
- add function of dunnet_test
|
9
19
|
|
10
20
|
## [0.0.2] - 2024-01-23
|
11
21
|
|
@@ -249,6 +249,7 @@ public class MultiComp {
|
|
249
249
|
private double[] n = null;
|
250
250
|
protected int getK() { return k;}
|
251
251
|
protected int getV() { return v;}
|
252
|
+
|
252
253
|
public double[][] calcTestStatistic(double[][] xi) {
|
253
254
|
k = xi.length;
|
254
255
|
mean = new double[k];
|
@@ -267,8 +268,10 @@ public class MultiComp {
|
|
267
268
|
private double calcVe(double[][] xi) {
|
268
269
|
double sumSq = 0.0;
|
269
270
|
int sumN = 0;
|
271
|
+
|
270
272
|
for(int i = 0; i < k; i++) {
|
271
273
|
DescriptiveStatistics stat = new DescriptiveStatistics();
|
274
|
+
|
272
275
|
Arrays.stream(xi[i]).forEach(stat::addValue);
|
273
276
|
mean[i] = stat.getMean();
|
274
277
|
n[i] = stat.getN();
|
@@ -286,7 +289,7 @@ public class MultiComp {
|
|
286
289
|
int v = super.getV();
|
287
290
|
int k = super.getK();
|
288
291
|
double den = k - 1;
|
289
|
-
|
292
|
+
|
290
293
|
TDistribution tDist = new TDistribution(v);
|
291
294
|
double l_val = tDist.inverseCumulativeProbability(a / den);
|
292
295
|
double r_val = tDist.inverseCumulativeProbability(1.0 - a / den);
|
@@ -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();
|
@@ -57,7 +58,19 @@ public class OneWayLayout {
|
|
57
58
|
OneWayAnovaTest oneway = new BartletTest();
|
58
59
|
|
59
60
|
double statistic = oneway.calcTestStatistic(xi);
|
60
|
-
return oneway.
|
61
|
+
return oneway.execute_test(statistic, a);
|
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.execute_test(statistic, a);
|
61
74
|
}
|
62
75
|
/*********************************/
|
63
76
|
/* interface define */
|
@@ -78,7 +91,7 @@ public class OneWayLayout {
|
|
78
91
|
}
|
79
92
|
private interface OneWayAnovaTest {
|
80
93
|
double calcTestStatistic(double[][] xi);
|
81
|
-
boolean
|
94
|
+
boolean execute_test(double statistic, double a);
|
82
95
|
}
|
83
96
|
/*********************************/
|
84
97
|
/* class define */
|
@@ -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);
|
@@ -236,12 +251,134 @@ public class OneWayLayout {
|
|
236
251
|
* (invSumN - 1.0 / (sumN - n));
|
237
252
|
return ln2L / deno;
|
238
253
|
}
|
239
|
-
public boolean
|
254
|
+
public boolean execute_test(double statistic, double a) {
|
240
255
|
ChiSquaredDistribution chi2Dist = new ChiSquaredDistribution(n - 1);
|
241
256
|
double r_val = chi2Dist.inverseCumulativeProbability(1.0 - a);
|
242
257
|
|
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 execute_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
|
|
@@ -0,0 +1,186 @@
|
|
1
|
+
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
|
2
|
+
import org.apache.commons.math3.distribution.FDistribution;
|
3
|
+
import java.util.Arrays;
|
4
|
+
public class TwoWayLayout {
|
5
|
+
private static TwoWayLayout twoWay = new TwoWayLayout();
|
6
|
+
public static TwoWayLayout getInstance() {
|
7
|
+
return twoWay;
|
8
|
+
}
|
9
|
+
public boolean[] twowayAnova(double[][][] xij, double a) {
|
10
|
+
TwoWayAnovaTest twoway = new TwoWayAnova();
|
11
|
+
|
12
|
+
double[] statistic = twoway.calcTestStatistic(xij);
|
13
|
+
return twoway.execute_test(statistic, a);
|
14
|
+
}
|
15
|
+
/*********************************/
|
16
|
+
/* interface define */
|
17
|
+
/*********************************/
|
18
|
+
private interface TwoWayAnovaTest {
|
19
|
+
double[] calcTestStatistic(double[][][] xij);
|
20
|
+
boolean[] execute_test(double statistic[], double a);
|
21
|
+
}
|
22
|
+
/*********************************/
|
23
|
+
/* class define */
|
24
|
+
/*********************************/
|
25
|
+
private class TwoWayAnova implements TwoWayAnovaTest {
|
26
|
+
private int a = 0;
|
27
|
+
private int b = 0;
|
28
|
+
private int n = 0;
|
29
|
+
private int an = 0;
|
30
|
+
private int bn = 0;
|
31
|
+
private int abn = 0;
|
32
|
+
private int en = 0;
|
33
|
+
public double[] calcTestStatistic(double[][][] xij) {
|
34
|
+
double statistic[] = new double[3];
|
35
|
+
a = xij.length;
|
36
|
+
b = xij[0].length;
|
37
|
+
n = xij[0][0].length;
|
38
|
+
an = a- 1;
|
39
|
+
bn = b - 1;
|
40
|
+
abn = (a- 1) * (b - 1);
|
41
|
+
en = a * b * (n - 1);
|
42
|
+
|
43
|
+
double[][] meanXij = calcMeanXij(xij);
|
44
|
+
double[] meanAn = calcMeanAn(meanXij);
|
45
|
+
double[] meanBn = calcMeanBn(meanXij);
|
46
|
+
double meanABn = calcMeanABn(meanAn);
|
47
|
+
|
48
|
+
double allDrift = calcAllDrift(xij, meanABn); // 全変動
|
49
|
+
double anDrift = calcAnDrift(meanAn, meanABn); // 水準Ai間変動
|
50
|
+
double bnDrift = calcBnDrift(meanBn, meanABn); // 水準Bj間変動
|
51
|
+
// 交互作用の変動
|
52
|
+
double interaDrift = calcInteraDrift(meanXij, meanAn, meanBn, meanABn);
|
53
|
+
double benchDrift = calcBenchDrift(xij, meanXij); // 水準内変動
|
54
|
+
double va = b * n * anDrift / an;
|
55
|
+
double vb = a * n * bnDrift / bn;
|
56
|
+
double vab = n * interaDrift / abn;
|
57
|
+
double ve = benchDrift / en;
|
58
|
+
|
59
|
+
statistic[0] = va / ve;
|
60
|
+
statistic[1] = vb / ve;
|
61
|
+
statistic[2] = vab/ ve;
|
62
|
+
return statistic;
|
63
|
+
}
|
64
|
+
private double[][] calcMeanXij(double[][][] xij) {
|
65
|
+
DescriptiveStatistics stat = new DescriptiveStatistics();
|
66
|
+
double[][] meanXij = new double[a][b];
|
67
|
+
|
68
|
+
for(int i = 0; i < a; i++) {
|
69
|
+
for(int j = 0; j < b; j++) {
|
70
|
+
Arrays.stream(xij[i][j]).forEach(stat::addValue);
|
71
|
+
meanXij[i][j] = stat.getMean();
|
72
|
+
stat.clear();
|
73
|
+
}
|
74
|
+
}
|
75
|
+
return meanXij;
|
76
|
+
}
|
77
|
+
private double[] calcMeanAn(double[][] meanXij) {
|
78
|
+
double[] an = new double[a];
|
79
|
+
DescriptiveStatistics stat = new DescriptiveStatistics();
|
80
|
+
|
81
|
+
for(int i = 0; i < a; i++) {
|
82
|
+
double sumSa = 0.0;
|
83
|
+
for(int j = 0; j < b; j++) {
|
84
|
+
sumSa += meanXij[i][j];
|
85
|
+
}
|
86
|
+
an[i] = sumSa / b;
|
87
|
+
}
|
88
|
+
return an;
|
89
|
+
}
|
90
|
+
private double[] calcMeanBn(double[][] meanXij) {
|
91
|
+
double[] bn = new double[b];
|
92
|
+
double[] sumA = new double[b];
|
93
|
+
|
94
|
+
for(int i = 0; i < a; i++) {
|
95
|
+
for(int j = 0; j < b; j++) {
|
96
|
+
bn[j] += meanXij[i][j] / a;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
return bn;
|
100
|
+
}
|
101
|
+
private double calcMeanABn(double[] meanAn) {
|
102
|
+
DescriptiveStatistics stat = new DescriptiveStatistics();
|
103
|
+
|
104
|
+
Arrays.stream(meanAn).forEach(stat::addValue);
|
105
|
+
return stat.getMean();
|
106
|
+
}
|
107
|
+
// 全変動
|
108
|
+
private double calcAllDrift(double[][][] xij, double meanABn) {
|
109
|
+
double sumDrift = 0.0;
|
110
|
+
|
111
|
+
for(int i = 0; i < a; i++) {
|
112
|
+
for(int j = 0; j < b; j++) {
|
113
|
+
for(int k = 0; k < xij[i][j].length; k++) {
|
114
|
+
double diffXijk = xij[i][j][k] - meanABn;
|
115
|
+
sumDrift += diffXijk * diffXijk;
|
116
|
+
}
|
117
|
+
}
|
118
|
+
}
|
119
|
+
return sumDrift;
|
120
|
+
}
|
121
|
+
// 水準Ai間変動
|
122
|
+
private double calcAnDrift(double[] meanAn, double meanABn) {
|
123
|
+
double sumDrift = 0.0;
|
124
|
+
|
125
|
+
for(int i =0; i < meanAn.length; i++) {
|
126
|
+
double diffXi = meanAn[i] - meanABn;
|
127
|
+
|
128
|
+
sumDrift += diffXi * diffXi;
|
129
|
+
}
|
130
|
+
return sumDrift;
|
131
|
+
}
|
132
|
+
// 水準Bj間変動
|
133
|
+
private double calcBnDrift(double[] meanBn, double meanABn) {
|
134
|
+
double sumDrift = 0.0;
|
135
|
+
|
136
|
+
for(int j = 0; j < meanBn.length; j++) {
|
137
|
+
double diffXj = meanBn[j] - meanABn;
|
138
|
+
|
139
|
+
sumDrift += diffXj * diffXj;
|
140
|
+
}
|
141
|
+
return sumDrift;
|
142
|
+
}
|
143
|
+
// 交互作用の変動
|
144
|
+
private double calcInteraDrift(double[][] meanXij, double[] meanAn, double[] meanBn, double meanABn) {
|
145
|
+
double sumDrift = 0.0;
|
146
|
+
|
147
|
+
for(int i = 0; i< a; i++) {
|
148
|
+
for(int j = 0; j < b; j++) {
|
149
|
+
double diffXj = meanXij[i][j] - meanAn[i] - meanBn[j] + meanABn;
|
150
|
+
|
151
|
+
sumDrift += diffXj * diffXj;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
return sumDrift;
|
155
|
+
}
|
156
|
+
// 水準内変動
|
157
|
+
private double calcBenchDrift(double[][][] xij, double[][] meanXij) {
|
158
|
+
double sumDrift = 0.0;
|
159
|
+
|
160
|
+
for(int i = 0; i < a; i++) {
|
161
|
+
for(int j = 0; j < b; j++) {
|
162
|
+
for(int k = 0; k < xij[i][j].length; k++) {
|
163
|
+
double diffXj = xij[i][j][k] - meanXij[i][j];
|
164
|
+
|
165
|
+
sumDrift += diffXj * diffXj;
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
return sumDrift;
|
170
|
+
}
|
171
|
+
public boolean[] execute_test(double statistic[], double a) {
|
172
|
+
boolean[] ret = new boolean[3];
|
173
|
+
|
174
|
+
ret[0] = evaluation(new FDistribution(an, en), statistic[0], a);
|
175
|
+
ret[1] = evaluation(new FDistribution(bn, en), statistic[1], a);
|
176
|
+
ret[2] = evaluation(new FDistribution(abn, en), statistic[2], a);
|
177
|
+
return ret;
|
178
|
+
}
|
179
|
+
private boolean evaluation(FDistribution fDist, double statistic, double a) {
|
180
|
+
double r_val = fDist.inverseCumulativeProbability(1.0 - a);
|
181
|
+
|
182
|
+
return (statistic < r_val) ? false : true;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
data/lib/num4anova.rb
CHANGED
@@ -4,6 +4,7 @@ require 'jfreechart-1.5.4.jar'
|
|
4
4
|
require 'commons-math3-3.6.1.jar'
|
5
5
|
|
6
6
|
java_import 'OneWayLayout'
|
7
|
+
java_import 'TwoWayLayout'
|
7
8
|
java_import 'java.util.HashMap'
|
8
9
|
# 分散分析を行う
|
9
10
|
# (Apache commoms math3使用)
|
@@ -72,13 +73,13 @@ module Num4AnovaLib
|
|
72
73
|
# @param [double] a 有意水準
|
73
74
|
# @return [boolean] 検定結果(true:棄却域内 false:棄却域外)
|
74
75
|
# @example
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
76
|
+
# xi = [
|
77
|
+
# [12.2, 18.8, 18.2],
|
78
|
+
# [22.2, 20.5, 14.6],
|
79
|
+
# [20.8, 19.5, 26.3],
|
80
|
+
# [26.4, 32.5, 31.3],
|
81
|
+
# [24.5, 21.2, 22.4],
|
82
|
+
# ]
|
82
83
|
# oneWay = Num4AnovaLib::OneWayLayoutLib.new
|
83
84
|
# oneWay.oneWay.oneway_anova(xi, 0.05)
|
84
85
|
# => true
|
@@ -92,19 +93,107 @@ module Num4AnovaLib
|
|
92
93
|
# @param [double] a 有意水準
|
93
94
|
# @return [boolean] 検定結果(true:棄却域内 false:棄却域外)
|
94
95
|
# @example
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
96
|
+
# xi = [
|
97
|
+
# [12.2, 18.8, 18.2],
|
98
|
+
# [22.2, 20.5, 14.6],
|
99
|
+
# [20.8, 19.5, 26.3],
|
100
|
+
# [26.4, 32.5, 31.3],
|
101
|
+
# [24.5, 21.2, 22.4],
|
102
|
+
# ]
|
102
103
|
# oneWay = Num4AnovaLib::OneWayLayoutLib.new
|
103
104
|
# oneWay.bartlet(xi, 0.05)
|
104
105
|
# => true
|
105
106
|
def bartlet(xi, a)
|
106
107
|
return @oneWay.bartletTest(xi.to_java(Java::double[]), a)
|
107
108
|
end
|
109
|
+
# 反復測定Plot
|
110
|
+
#
|
111
|
+
# @overload replicate_plot(dname, vals)
|
112
|
+
# @param [String] dname データ名
|
113
|
+
# @param [Hash] vals Hash(String, double[])
|
114
|
+
# @return [void] replicate.jpegファイルを出力
|
115
|
+
# @example
|
116
|
+
# vals = {
|
117
|
+
# "stageA1" => [27, 52, 18, 21, 32],
|
118
|
+
# "stageA2" => [52, 72, 31, 50, 45],
|
119
|
+
# "stageA3" => [47, 54, 29, 43, 32],
|
120
|
+
# "stageA4" => [28, 50, 22, 26, 29],
|
121
|
+
# }
|
122
|
+
# oneWay = Num4AnovaLib::OneWayLayoutLib.new
|
123
|
+
# oneWay.replicate_plot("LDH", vals)
|
124
|
+
# => replicate.jpeg
|
125
|
+
# @note
|
126
|
+
# グラフは、jfreechartを使用
|
127
|
+
def replicate_plot(dname, vals)
|
128
|
+
o = HashMap.new
|
129
|
+
vals.each{|k, v|
|
130
|
+
o[k] = v.to_java(Java::double)
|
131
|
+
}
|
132
|
+
return @oneWay.replicatePlot(dname, o)
|
133
|
+
end
|
134
|
+
# 反復測定検定
|
135
|
+
#
|
136
|
+
# @overload replicate_test(xi, a)
|
137
|
+
# @param [array] xi データ(double[][])
|
138
|
+
# @param [double] a 有意水準
|
139
|
+
# @return [boolean] 検定結果(true:棄却域内 false:棄却域外)
|
140
|
+
# @example
|
141
|
+
# xi = [
|
142
|
+
# [27, 52, 18, 21, 32],
|
143
|
+
# [52, 72, 31, 50, 45],
|
144
|
+
# [47, 54, 29, 43, 32],
|
145
|
+
# [28, 50, 22, 26, 29],
|
146
|
+
# ]
|
147
|
+
# oneWay = Num4AnovaLib::OneWayLayoutLib.new
|
148
|
+
# oneWay.replicate_test(xi, 0.05)
|
149
|
+
# => true
|
150
|
+
def replicate_test(xi, a)
|
151
|
+
return @oneWay.replicateTest(xi.to_java(Java::double[]), a)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# 二元配置の分散分析
|
156
|
+
class TwoWayLayoutLib
|
157
|
+
def initialize
|
158
|
+
@twoWay = TwoWayLayout.getInstance()
|
159
|
+
end
|
160
|
+
# 二元配置の分散分析
|
161
|
+
#
|
162
|
+
# @overload twoway_anova(xij, a)
|
163
|
+
# @param [array] xij データ(double[][][])
|
164
|
+
# @param [double] a 有意水準
|
165
|
+
# @return [Array] 検定結果(boolean[] true:棄却域内 false:棄却域外)
|
166
|
+
# @example
|
167
|
+
# xij = [
|
168
|
+
# [
|
169
|
+
# [13.2, 15.7, 11.9],
|
170
|
+
# [16.1, 15.7, 15.1],
|
171
|
+
# [9.1, 10.3, 8.2],
|
172
|
+
# ],
|
173
|
+
# [
|
174
|
+
# [22.8, 25.7, 18.5],
|
175
|
+
# [24.5, 21.2, 24.2],
|
176
|
+
# [11.9, 14.3, 13.7],
|
177
|
+
# ],
|
178
|
+
# [
|
179
|
+
# [21.8, 26.3, 32.1],
|
180
|
+
# [26.9, 31.3, 28.3],
|
181
|
+
# [15.1, 13.6, 16.2],
|
182
|
+
# ],
|
183
|
+
# [
|
184
|
+
# [25.7, 28.8, 29.5],
|
185
|
+
# [30.1, 33.8, 29.6],
|
186
|
+
# [15.2, 17.3, 14.8],
|
187
|
+
# ],
|
188
|
+
# ]
|
189
|
+
# twoWay = Num4AnovaLib::TwoWayLayoutLib.new
|
190
|
+
# twoWay.twoway_anova(xij, 0.05)
|
191
|
+
# =>
|
192
|
+
# [true, true, true]
|
193
|
+
def twoway_anova(xij, a)
|
194
|
+
ret = @twoWay.twowayAnova(xij.to_java(Java::double[][]), a)
|
195
|
+
return ret.to_a
|
196
|
+
end
|
108
197
|
end
|
109
198
|
end
|
110
199
|
|
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.5
|
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-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- Rakefile
|
64
64
|
- ext/num4anova/MultiComp.java
|
65
65
|
- ext/num4anova/OneWayLayout.java
|
66
|
+
- ext/num4anova/TwoWayLayout.java
|
66
67
|
- lib/commons-math3-3.6.1.jar
|
67
68
|
- lib/dunnet.rb
|
68
69
|
- lib/jcommon-1.0.23.jar
|