num4anova 0.0.5-java → 0.0.6-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 +5 -0
- data/ext/num4anova/TwoWayLayout.java +120 -20
- data/lib/num4anova.rb +23 -0
- 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: 4dd60df363d899af7ca69bca4cb1da1689548f083abaacfd6441d5a589bf3501
|
4
|
+
data.tar.gz: 84469385e378cde1eddc3521582aefd2f5b2adce84e76d0c8a4c23bdd40d9374
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a036fe08363781f31b3583d7c7a454131680413e9c3aaeb0ebe135eec930912807e3f84be688d8bf70e1e56eafdefef0a3425f07eb18d6d042549dc2f7dd893
|
7
|
+
data.tar.gz: 7d7c136e1e457c08ac341fc542be1590888c233c161034eeff0f67d3d1466b4879ccd49c5f2a83e2f42f18f28a0279d66909d768d616afabf24b59be36a7e4e4
|
data/CHANGELOG.md
CHANGED
@@ -12,6 +12,12 @@ public class TwoWayLayout {
|
|
12
12
|
double[] statistic = twoway.calcTestStatistic(xij);
|
13
13
|
return twoway.execute_test(statistic, a);
|
14
14
|
}
|
15
|
+
public boolean[] twoway2Anova(double[][] xij, double a) {
|
16
|
+
TwoWay2AnovaTest twoway = new TwoWay2Anova();
|
17
|
+
|
18
|
+
double[] statistic = twoway.calcTestStatistic(xij);
|
19
|
+
return twoway.execute_test(statistic, a);
|
20
|
+
}
|
15
21
|
/*********************************/
|
16
22
|
/* interface define */
|
17
23
|
/*********************************/
|
@@ -19,9 +25,14 @@ public class TwoWayLayout {
|
|
19
25
|
double[] calcTestStatistic(double[][][] xij);
|
20
26
|
boolean[] execute_test(double statistic[], double a);
|
21
27
|
}
|
28
|
+
private interface TwoWay2AnovaTest {
|
29
|
+
double[] calcTestStatistic(double[][] xij);
|
30
|
+
boolean[] execute_test(double statistic[], double a);
|
31
|
+
}
|
22
32
|
/*********************************/
|
23
33
|
/* class define */
|
24
34
|
/*********************************/
|
35
|
+
// 二元配置の分散分析(繰り返し数が等しい時)
|
25
36
|
private class TwoWayAnova implements TwoWayAnovaTest {
|
26
37
|
private int a = 0;
|
27
38
|
private int b = 0;
|
@@ -32,6 +43,7 @@ public class TwoWayLayout {
|
|
32
43
|
private int en = 0;
|
33
44
|
public double[] calcTestStatistic(double[][][] xij) {
|
34
45
|
double statistic[] = new double[3];
|
46
|
+
|
35
47
|
a = xij.length;
|
36
48
|
b = xij[0].length;
|
37
49
|
n = xij[0][0].length;
|
@@ -45,7 +57,6 @@ public class TwoWayLayout {
|
|
45
57
|
double[] meanBn = calcMeanBn(meanXij);
|
46
58
|
double meanABn = calcMeanABn(meanAn);
|
47
59
|
|
48
|
-
double allDrift = calcAllDrift(xij, meanABn); // 全変動
|
49
60
|
double anDrift = calcAnDrift(meanAn, meanABn); // 水準Ai間変動
|
50
61
|
double bnDrift = calcBnDrift(meanBn, meanABn); // 水準Bj間変動
|
51
62
|
// 交互作用の変動
|
@@ -76,20 +87,17 @@ public class TwoWayLayout {
|
|
76
87
|
}
|
77
88
|
private double[] calcMeanAn(double[][] meanXij) {
|
78
89
|
double[] an = new double[a];
|
79
|
-
DescriptiveStatistics stat = new DescriptiveStatistics();
|
80
90
|
|
81
91
|
for(int i = 0; i < a; i++) {
|
82
92
|
double sumSa = 0.0;
|
83
93
|
for(int j = 0; j < b; j++) {
|
84
|
-
|
94
|
+
an[i] += meanXij[i][j] / b;
|
85
95
|
}
|
86
|
-
an[i] = sumSa / b;
|
87
96
|
}
|
88
97
|
return an;
|
89
98
|
}
|
90
99
|
private double[] calcMeanBn(double[][] meanXij) {
|
91
100
|
double[] bn = new double[b];
|
92
|
-
double[] sumA = new double[b];
|
93
101
|
|
94
102
|
for(int i = 0; i < a; i++) {
|
95
103
|
for(int j = 0; j < b; j++) {
|
@@ -104,20 +112,6 @@ public class TwoWayLayout {
|
|
104
112
|
Arrays.stream(meanAn).forEach(stat::addValue);
|
105
113
|
return stat.getMean();
|
106
114
|
}
|
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
115
|
// 水準Ai間変動
|
122
116
|
private double calcAnDrift(double[] meanAn, double meanABn) {
|
123
117
|
double sumDrift = 0.0;
|
@@ -179,7 +173,113 @@ public class TwoWayLayout {
|
|
179
173
|
private boolean evaluation(FDistribution fDist, double statistic, double a) {
|
180
174
|
double r_val = fDist.inverseCumulativeProbability(1.0 - a);
|
181
175
|
|
182
|
-
return (statistic
|
176
|
+
return (statistic >= r_val) ? true : false;
|
177
|
+
}
|
178
|
+
}
|
179
|
+
// 二元配置の分散分析(繰り返しのない時)
|
180
|
+
private class TwoWay2Anova implements TwoWay2AnovaTest {
|
181
|
+
private int a = 0;
|
182
|
+
private int b = 0;
|
183
|
+
private int an = 0;
|
184
|
+
private int bn = 0;
|
185
|
+
private int en = 0;
|
186
|
+
public double[] calcTestStatistic(double[][] xij) {
|
187
|
+
double statistic[] = new double[2];
|
188
|
+
|
189
|
+
a = xij.length;
|
190
|
+
b = xij[0].length;
|
191
|
+
an = a- 1;
|
192
|
+
bn = b - 1;
|
193
|
+
en = (a- 1) * (b - 1);
|
194
|
+
|
195
|
+
double[] meanAn = calcMeanAn(xij);
|
196
|
+
double[] meanBn = calcMeanBn(xij);
|
197
|
+
double meanAB = calcMeanAB(meanAn);
|
198
|
+
|
199
|
+
double anDrift = calcAnDrift(meanAn, meanAB); // 水準Ai間変動
|
200
|
+
double bnDrift = calcBnDrift(meanBn, meanAB); // 水準Bj間変動
|
201
|
+
double benchDrift = calcBenchDrift(xij, meanAn, meanBn, meanAB); // 水準内変動
|
202
|
+
double va = anDrift / an;
|
203
|
+
double vb = bnDrift / bn;
|
204
|
+
double ve = benchDrift / en;
|
205
|
+
|
206
|
+
statistic[0] = va / ve;
|
207
|
+
statistic[1] = vb / ve;
|
208
|
+
return statistic;
|
209
|
+
}
|
210
|
+
private double[] calcMeanAn(double[][] xij) {
|
211
|
+
double[] an = new double[a];
|
212
|
+
|
213
|
+
for(int i = 0; i < a; i++) {
|
214
|
+
for(int j = 0; j < b; j++) {
|
215
|
+
an[i] += xij[i][j] / b;
|
216
|
+
}
|
217
|
+
}
|
218
|
+
return an;
|
219
|
+
}
|
220
|
+
private double[] calcMeanBn(double[][] xij) {
|
221
|
+
double[] bn = new double[b];
|
222
|
+
|
223
|
+
for(int i = 0; i < a; i++) {
|
224
|
+
for(int j = 0; j < b; j++) {
|
225
|
+
bn[j] += xij[i][j] / a;
|
226
|
+
}
|
227
|
+
}
|
228
|
+
return bn;
|
229
|
+
}
|
230
|
+
private double calcMeanAB(double[] meanAn) {
|
231
|
+
DescriptiveStatistics stat = new DescriptiveStatistics();
|
232
|
+
|
233
|
+
Arrays.stream(meanAn).forEach(stat::addValue);
|
234
|
+
return stat.getMean();
|
235
|
+
}
|
236
|
+
// 水準Ai間変動
|
237
|
+
private double calcAnDrift(double[] meanAn, double meanAB) {
|
238
|
+
double sumDrift = 0.0;
|
239
|
+
|
240
|
+
for(int i =0; i < meanAn.length; i++) {
|
241
|
+
double diffXi = meanAn[i] - meanAB;
|
242
|
+
|
243
|
+
sumDrift += diffXi * diffXi;
|
244
|
+
}
|
245
|
+
return b * sumDrift;
|
246
|
+
}
|
247
|
+
// 水準Bj間変動
|
248
|
+
private double calcBnDrift(double[] meanBn, double meanAB) {
|
249
|
+
double sumDrift = 0.0;
|
250
|
+
|
251
|
+
for(int j = 0; j < meanBn.length; j++) {
|
252
|
+
double diffXj = meanBn[j] - meanAB;
|
253
|
+
|
254
|
+
sumDrift += diffXj * diffXj;
|
255
|
+
}
|
256
|
+
return a * sumDrift;
|
257
|
+
}
|
258
|
+
// 水準内変動
|
259
|
+
private double calcBenchDrift(double[][] xij, double[] meanAn, double[] meanBn, double meanAB) {
|
260
|
+
double sumDrift = 0.0;
|
261
|
+
|
262
|
+
for(int i = 0; i < a; i++) {
|
263
|
+
for(int j = 0; j < b; j++) {
|
264
|
+
double diffXj = xij[i][j] - meanAn[i] - meanBn[j] + meanAB;
|
265
|
+
|
266
|
+
sumDrift += diffXj * diffXj;
|
267
|
+
}
|
268
|
+
}
|
269
|
+
return sumDrift;
|
270
|
+
}
|
271
|
+
|
272
|
+
public boolean[] execute_test(double statistic[], double a) {
|
273
|
+
boolean[] ret = new boolean[2];
|
274
|
+
|
275
|
+
ret[0] = evaluation(new FDistribution(an, en), statistic[0], a);
|
276
|
+
ret[1] = evaluation(new FDistribution(bn, en), statistic[1], a);
|
277
|
+
return ret;
|
278
|
+
}
|
279
|
+
private boolean evaluation(FDistribution fDist, double statistic, double a) {
|
280
|
+
double r_val = fDist.inverseCumulativeProbability(1.0 - a);
|
281
|
+
|
282
|
+
return (statistic >= r_val) ? true : false;
|
183
283
|
}
|
184
284
|
}
|
185
285
|
}
|
data/lib/num4anova.rb
CHANGED
@@ -158,6 +158,7 @@ module Num4AnovaLib
|
|
158
158
|
@twoWay = TwoWayLayout.getInstance()
|
159
159
|
end
|
160
160
|
# 二元配置の分散分析
|
161
|
+
# (繰り返し数が等しい時)
|
161
162
|
#
|
162
163
|
# @overload twoway_anova(xij, a)
|
163
164
|
# @param [array] xij データ(double[][][])
|
@@ -194,6 +195,28 @@ module Num4AnovaLib
|
|
194
195
|
ret = @twoWay.twowayAnova(xij.to_java(Java::double[][]), a)
|
195
196
|
return ret.to_a
|
196
197
|
end
|
198
|
+
# 二元配置の分散分析
|
199
|
+
# (繰り返しのない時)
|
200
|
+
#
|
201
|
+
# @overload twoway2_anova(xij, a)
|
202
|
+
# @param [array] xij データ(double[][])
|
203
|
+
# @param [double] a 有意水準
|
204
|
+
# @return [Array] 検定結果(boolean[] true:棄却域内 false:棄却域外)
|
205
|
+
# @example
|
206
|
+
# xij = [
|
207
|
+
# [13.6, 15.6, 9.2],
|
208
|
+
# [22.3, 23.3, 13.3],
|
209
|
+
# [26.7, 28.8, 15.0],
|
210
|
+
# [28.0, 31.2, 15.8],
|
211
|
+
# ]
|
212
|
+
# twoWay = Num4AnovaLib::TwoWayLayoutLib.new
|
213
|
+
# twoWay.twoway2_anova(xij, 0.05)
|
214
|
+
# =>
|
215
|
+
# [true, true]
|
216
|
+
def twoway2_anova(xij, a)
|
217
|
+
ret = @twoWay.twoway2Anova(xij.to_java(Java::double[]), a)
|
218
|
+
return ret.to_a
|
219
|
+
end
|
197
220
|
end
|
198
221
|
end
|
199
222
|
|
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.6
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- siranovel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|