num4anova 0.0.10-java → 0.0.12-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/Ancova.java +185 -16
- data/lib/num4anova.rb +67 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87febfd8031fd924430223c93fad6b0606aa212ab109e1b758db2c1d23b6dace
|
4
|
+
data.tar.gz: 48b610b93d2c5341f05c25ef230acea09b02fa75c924129f5dafba56fcb6051f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 979fe122d0cf17086e80a45ff6c44b67153822a8d89d83bceb84a25d3d68190f087c3ed8bf4b192e9afd48a38b3ec0d1456fa0821c84256113154e04d5a6e461
|
7
|
+
data.tar.gz: 0bcad9f7a234a96759697440f540f0caddf70c1a25cf46409dead11478faa0017cfe9e98d2a23feaad2648bea641d5bca80cb73adab5001ec46d93ef8899ce70
|
data/CHANGELOG.md
CHANGED
data/ext/num4anova/Ancova.java
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import org.apache.commons.math3.distribution.FDistribution;
|
2
|
+
import org.apache.commons.math3.distribution.TDistribution;
|
2
3
|
|
3
4
|
public class Ancova {
|
4
5
|
private static Ancova ancova = new Ancova();
|
@@ -17,6 +18,17 @@ public class Ancova {
|
|
17
18
|
double statistic = hypoth.calcTestStatistic(xi);
|
18
19
|
return hypoth.executeTest(statistic, a);
|
19
20
|
}
|
21
|
+
public boolean differenceTest(double[][][] xi, double a) {
|
22
|
+
HypothesisTest hypoth = new DifferenceTest();
|
23
|
+
|
24
|
+
double statistic = hypoth.calcTestStatistic(xi);
|
25
|
+
return hypoth.executeTest(statistic, a);
|
26
|
+
}
|
27
|
+
public Interval intervalEstim(double[][][] xi, double a) {
|
28
|
+
Estim estim = new IntervalEstim();
|
29
|
+
|
30
|
+
return estim.calcInterval(xi, a);
|
31
|
+
}
|
20
32
|
/*********************************/
|
21
33
|
/* interface define */
|
22
34
|
/*********************************/
|
@@ -24,9 +36,22 @@ public class Ancova {
|
|
24
36
|
double calcTestStatistic(double[][][] xi);
|
25
37
|
boolean executeTest(double statistic, double a);
|
26
38
|
}
|
39
|
+
private interface Estim {
|
40
|
+
Interval calcInterval(double[][][] xi, double a);
|
41
|
+
}
|
27
42
|
/*********************************/
|
28
43
|
/* class define */
|
29
44
|
/*********************************/
|
45
|
+
public class Interval {
|
46
|
+
private double min;
|
47
|
+
private double max;
|
48
|
+
public Interval(double min, double max) {
|
49
|
+
this.min = min;
|
50
|
+
this.max = max;
|
51
|
+
}
|
52
|
+
public double getMin() { return this.min; }
|
53
|
+
public double getMax() { return this.max; }
|
54
|
+
}
|
30
55
|
private class RegressionLine {
|
31
56
|
protected int calcSumn(double[][][] xi) {
|
32
57
|
int sum = 0;
|
@@ -36,34 +61,54 @@ public class Ancova {
|
|
36
61
|
}
|
37
62
|
return sum;
|
38
63
|
}
|
39
|
-
|
64
|
+
// 全変動
|
65
|
+
private double calcSty(double[][][] xi, int sumn) {
|
66
|
+
double sumy2 = calcSumy2(xi);
|
67
|
+
double sumy = calcSumy(xi);
|
68
|
+
|
69
|
+
return sumy2 - sumy*sumy / sumn;
|
70
|
+
}
|
71
|
+
private double calcStx(double[][][] xi, int sumn) {
|
40
72
|
double sumx2 = calcSumx2(xi);
|
41
73
|
double sumx = calcSumx(xi);
|
42
74
|
|
43
|
-
|
44
|
-
|
75
|
+
return sumx2 - sumx*sumx / sumn;
|
76
|
+
}
|
77
|
+
private double calcStyx(double[][][] xi, int sumn) {
|
78
|
+
double sumx = calcSumx(xi);
|
79
|
+
double sumy = calcSumy(xi);
|
80
|
+
double sumyx = calcSumyx(xi);
|
45
81
|
|
46
|
-
return
|
82
|
+
return sumyx - sumy*sumx / sumn;
|
47
83
|
}
|
48
|
-
|
49
|
-
|
84
|
+
// 水準間変動
|
85
|
+
private double calcSay(double[][][] xi, int sumn) {
|
50
86
|
double sumy = calcSumy(xi);
|
51
87
|
|
52
|
-
|
53
|
-
|
88
|
+
return calcSumay(xi) - sumy*sumy / sumn;
|
89
|
+
}
|
90
|
+
private double calcSax(double[][][] xi, int sumn) {
|
91
|
+
double sumx = calcSumx(xi);
|
54
92
|
|
55
|
-
return
|
93
|
+
return calcSumax(xi) - sumx*sumx / sumn;
|
56
94
|
}
|
57
|
-
|
95
|
+
private double calcSayx(double[][][] xi, int sumn) {
|
58
96
|
double sumx = calcSumx(xi);
|
59
97
|
double sumy = calcSumy(xi);
|
60
|
-
double sumyx = calcSumyx(xi);
|
61
98
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
99
|
+
return calcSumayx(xi) - sumy*sumx / sumn;
|
100
|
+
}
|
101
|
+
// 水準内変動
|
102
|
+
protected double calcSex(double[][][] xi, int sumn) {
|
103
|
+
return calcStx(xi, sumn) - calcSax(xi, sumn);
|
104
|
+
}
|
105
|
+
protected double calcSey(double[][][] xi, int sumn) {
|
106
|
+
return calcSty(xi, sumn) - calcSay(xi, sumn);
|
107
|
+
}
|
108
|
+
protected double calcSeyx(double[][][] xi, int sumn) {
|
109
|
+
return calcStyx(xi, sumn) - calcSayx(xi, sumn);
|
66
110
|
}
|
111
|
+
|
67
112
|
// 平行性の検定
|
68
113
|
protected double calcbx(double[][][] xi) {
|
69
114
|
double sum = 0.0;
|
@@ -89,8 +134,20 @@ public class Ancova {
|
|
89
134
|
}
|
90
135
|
return sum;
|
91
136
|
}
|
137
|
+
// 差の検定
|
138
|
+
protected double calcSa(double[][][] xi, int sumn) {
|
139
|
+
double sumty = calcSty(xi, sumn);
|
140
|
+
double sumtyx = calcStyx(xi, sumn);
|
141
|
+
double sumtx = calcStx(xi, sumn);
|
142
|
+
double sumey = calcSey(xi, sumn);
|
143
|
+
double sumeyx = calcSeyx(xi, sumn);
|
144
|
+
double sumex = calcSex(xi, sumn);
|
92
145
|
|
146
|
+
return (sumty - sumtyx * sumtyx / sumtx)
|
147
|
+
- (sumey - sumeyx * sumeyx / sumex);
|
148
|
+
}
|
93
149
|
|
150
|
+
// ETC
|
94
151
|
private double calcSumay(double[][][] xi) {
|
95
152
|
double sum = 0.0;
|
96
153
|
|
@@ -157,7 +214,6 @@ public class Ancova {
|
|
157
214
|
}
|
158
215
|
return sum;
|
159
216
|
}
|
160
|
-
// 水準間変動
|
161
217
|
private double calcSumax(double[][][] xi) {
|
162
218
|
double sum = 0.0;
|
163
219
|
|
@@ -180,6 +236,7 @@ public class Ancova {
|
|
180
236
|
}
|
181
237
|
return sum;
|
182
238
|
}
|
239
|
+
|
183
240
|
}
|
184
241
|
// 回帰直線モデルの平行性の検定
|
185
242
|
private class Parallettest extends RegressionLine implements HypothesisTest {
|
@@ -232,6 +289,7 @@ public class Ancova {
|
|
232
289
|
|
233
290
|
double vr = calcVr(xi, sumn);
|
234
291
|
double ve = calcVe(xi, sumn);
|
292
|
+
|
235
293
|
return vr / ve;
|
236
294
|
}
|
237
295
|
public boolean executeTest(double statistic, double a) {
|
@@ -254,5 +312,116 @@ public class Ancova {
|
|
254
312
|
return (sumey * sumex - sumeyx * sumeyx) / (m * sumex);
|
255
313
|
}
|
256
314
|
}
|
315
|
+
// 水準間の差の検定
|
316
|
+
private class DifferenceTest extends RegressionLine implements HypothesisTest {
|
317
|
+
private int n = 0;
|
318
|
+
private int m = 0;
|
319
|
+
public double calcTestStatistic(double[][][] xi) {
|
320
|
+
int sumn = calcSumn(xi);
|
321
|
+
n = xi.length - 1;
|
322
|
+
m = sumn - xi.length - 1;
|
323
|
+
|
324
|
+
double va = calcSa(xi, sumn) / n;
|
325
|
+
double ve = calcVe(xi, sumn);
|
326
|
+
|
327
|
+
return va / ve;
|
328
|
+
}
|
329
|
+
public boolean executeTest(double statistic, double a) {
|
330
|
+
FDistribution fDist = new FDistribution(n, m);
|
331
|
+
double f = fDist.inverseCumulativeProbability(1.0 - a);
|
332
|
+
|
333
|
+
return (statistic >= f) ? true : false;
|
334
|
+
}
|
335
|
+
private double calcVe(double[][][] xi, int sumn) {
|
336
|
+
double sumey = calcSey(xi, sumn);
|
337
|
+
double sumex = calcSex(xi, sumn);
|
338
|
+
double sumeyx = calcSeyx(xi, sumn);
|
339
|
+
|
340
|
+
return (sumey * sumex - sumeyx * sumeyx) / (m * sumex);
|
341
|
+
}
|
342
|
+
}
|
343
|
+
//
|
344
|
+
private class IntervalEstim extends RegressionLine
|
345
|
+
implements Estim {
|
346
|
+
private int n = 0;
|
347
|
+
private int[] ni = null;
|
348
|
+
private double sumex = 0.0;
|
349
|
+
public Interval calcInterval(double[][][] xi, double a) {
|
350
|
+
ni = calcNi(xi);
|
351
|
+
int sumn = calcSumn(xi);
|
352
|
+
n = sumn - xi.length - 1;
|
353
|
+
sumex = calcSex(xi, sumn);
|
354
|
+
double ve = calcVe(xi, sumn);
|
355
|
+
double b = calcB(xi, sumn);
|
356
|
+
|
357
|
+
double[] meanyi = calcMeanyi(xi);
|
358
|
+
double[] meanxi = calcMeanxi(xi);
|
359
|
+
double meanx = calcMeanx(xi);
|
360
|
+
|
361
|
+
TDistribution tDist = new TDistribution(n);
|
362
|
+
double t = tDist.inverseCumulativeProbability(1.0 - a / 2.0);
|
363
|
+
double wk = (meanxi[0] - meanx);
|
364
|
+
double wk2 = t * Math.sqrt((1/ni[0] + wk * wk / sumex) * ve);
|
365
|
+
double min = meanyi[0] - b * wk - wk2;
|
366
|
+
double max = meanyi[0] - b * wk + wk2;
|
367
|
+
|
368
|
+
return new Interval(min, max);
|
369
|
+
}
|
370
|
+
private int[] calcNi(double[][][] xi) {
|
371
|
+
int[] ni = new int[xi.length];
|
372
|
+
|
373
|
+
for(int i = 0; i < xi.length; i++) {
|
374
|
+
ni[i] = xi[i].length;
|
375
|
+
}
|
376
|
+
return ni;
|
377
|
+
}
|
378
|
+
private double calcVe(double[][][] xi, int sumn) {
|
379
|
+
double sumey = calcSey(xi, sumn);
|
380
|
+
double sumeyx = calcSeyx(xi, sumn);
|
381
|
+
|
382
|
+
return (sumey * sumex - sumeyx * sumeyx) / (n * sumex);
|
383
|
+
}
|
384
|
+
private double calcB(double[][][] xi, int sumn) {
|
385
|
+
double sumeyx = calcSeyx(xi, sumn);
|
386
|
+
double sex = calcSex(xi, sumn);
|
387
|
+
|
388
|
+
return sumeyx / sex;
|
389
|
+
}
|
390
|
+
private double[] calcMeanyi(double[][][] xi) {
|
391
|
+
double[] meanyi = new double[xi.length];
|
392
|
+
|
393
|
+
for(int i = 0; i < xi.length; i++) {
|
394
|
+
double sum = 0.0;
|
395
|
+
for(int j = 0; j < xi[i].length; j++) {
|
396
|
+
sum += xi[i][j][0];
|
397
|
+
}
|
398
|
+
meanyi[i] = sum / xi[i].length;
|
399
|
+
}
|
400
|
+
return meanyi;
|
401
|
+
}
|
402
|
+
private double[] calcMeanxi(double[][][] xi) {
|
403
|
+
double[] meanxi = new double[xi.length];
|
404
|
+
|
405
|
+
for(int i = 0; i < xi.length; i++) {
|
406
|
+
double sum = 0.0;
|
407
|
+
for(int j = 0; j < xi[i].length; j++) {
|
408
|
+
sum += xi[i][j][1];
|
409
|
+
}
|
410
|
+
meanxi[i] = sum / xi[i].length;
|
411
|
+
}
|
412
|
+
return meanxi;
|
413
|
+
}
|
414
|
+
private double calcMeanx(double[][][] xi) {
|
415
|
+
double sum = 0.0;
|
416
|
+
double n = 0;
|
417
|
+
for(int i = 0; i < xi.length; i++) {
|
418
|
+
for(int j = 0; j < xi[i].length; j++) {
|
419
|
+
sum += xi[i][j][1];
|
420
|
+
n++;
|
421
|
+
}
|
422
|
+
}
|
423
|
+
return sum / n;
|
424
|
+
}
|
425
|
+
}
|
257
426
|
}
|
258
427
|
|
data/lib/num4anova.rb
CHANGED
@@ -256,7 +256,7 @@ module Num4AnovaLib
|
|
256
256
|
end
|
257
257
|
# 回帰直線の有意性検定
|
258
258
|
#
|
259
|
-
# @overload
|
259
|
+
# @overload significance_test(xi, a)
|
260
260
|
# @param [array] xi データ(double[][][])
|
261
261
|
# @param [double] a 有意水準
|
262
262
|
# @return [boolean] 検定結果(boolean true:棄却域内 false:棄却域外)
|
@@ -284,6 +284,72 @@ module Num4AnovaLib
|
|
284
284
|
def significance_test(xi, a)
|
285
285
|
@ancova.significanceTest(xi.to_java(Java::double[][]), a)
|
286
286
|
end
|
287
|
+
# 水準間の差の検定
|
288
|
+
#
|
289
|
+
# @overload difference_test(xi, a)
|
290
|
+
# @param [array] xi データ(double[][][])
|
291
|
+
# @param [double] a 有意水準
|
292
|
+
# @return [boolean] 検定結果(boolean true:棄却域内 false:棄却域外)
|
293
|
+
# @example
|
294
|
+
# xi = [
|
295
|
+
# [
|
296
|
+
# [3,35], [5,38], [3,39],
|
297
|
+
# ],
|
298
|
+
# [
|
299
|
+
# [3,36], [3,39], [8,54],
|
300
|
+
# ],
|
301
|
+
# [
|
302
|
+
# [2,40], [2,45], [2,39],
|
303
|
+
# ],
|
304
|
+
# [
|
305
|
+
# [3,47], [4,52], [2,48],
|
306
|
+
# ],
|
307
|
+
# [
|
308
|
+
# [1,64], [2,80], [0,70],
|
309
|
+
# ],
|
310
|
+
# ]
|
311
|
+
# ancova = Num4AnovaLib::Num4AncovaLib.new
|
312
|
+
# ancova.difference_test(xi, 0.05)
|
313
|
+
# => true
|
314
|
+
def difference_test(xi, a)
|
315
|
+
@ancova.differenceTest(xi.to_java(Java::double[][]), a)
|
316
|
+
end
|
317
|
+
# 区間推定
|
318
|
+
#
|
319
|
+
# @overload interval_estim(xi, a)
|
320
|
+
# @param [array] xi データ(double[][][])
|
321
|
+
# @param [double] a 有意水準
|
322
|
+
# @return [Hash] (min:下限信頼区間 max:上限信頼区間)
|
323
|
+
# @example
|
324
|
+
# xi = [
|
325
|
+
# [
|
326
|
+
# [3,35], [5,38], [3,39],
|
327
|
+
# ],
|
328
|
+
# [
|
329
|
+
# [3,36], [3,39], [8,54],
|
330
|
+
# ],
|
331
|
+
# [
|
332
|
+
# [2,40], [2,45], [2,39],
|
333
|
+
# ],
|
334
|
+
# [
|
335
|
+
# [3,47], [4,52], [2,48],
|
336
|
+
# ],
|
337
|
+
# [
|
338
|
+
# [1,64], [2,80], [0,70],
|
339
|
+
# ],
|
340
|
+
# ]
|
341
|
+
# ancova = Num4AnovaLib::Num4AncovaLib.new
|
342
|
+
# ancova.interval_estim(xi, 0.05)
|
343
|
+
# =>
|
344
|
+
# {:min=>4.466605469341916, :max=>7.1909253948556096}
|
345
|
+
def interval_estim(xi, a)
|
346
|
+
retJava = @ancova.intervalEstim(xi.to_java(Java::double[][]), a)
|
347
|
+
retHash = {
|
348
|
+
"min": retJava.getMin(),
|
349
|
+
"max": retJava.getMax()
|
350
|
+
}
|
351
|
+
return retHash
|
352
|
+
end
|
287
353
|
end
|
288
354
|
end
|
289
355
|
|
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.12
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- siranovel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|