num4anova 0.0.5-java → 0.0.7-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: 7a089d52ead2c9726d9ca61db475f128925afddca7cbcf6f65f0da75e41f0b1b
4
- data.tar.gz: 050e29e04bd0e8272da89d5aba231fe08294f50f090d261da7aa6822f5df5bc5
3
+ metadata.gz: 72ca9e237cf35e5d7c29cef5603044824f821b53974275cf2025db717cc74947
4
+ data.tar.gz: 8898ddd64a38258ac4208906fed49b9b15f5f0328150b570b91a7c48af8ff96b
5
5
  SHA512:
6
- metadata.gz: f0cc84d4cebb416b04ed0360ef4cf72799aaebcf70104b6e2d2dc2bc471400d3ac313b71f5885fd0854ae8b3ae22dd66c753066233b1ed2848aabf586cee2c05
7
- data.tar.gz: 88a74fb295e7ce0e0bdba405a14239a37fac4f3115bd29f358ce7b54fcc3b71a1533ff095e5aea7e2b141d867051eca703d179874f1ed349aef92575d8d0a186
6
+ metadata.gz: f0d19ec6277e2551d90268319d6866ea15fa467ed1da1ad8ad776db3e4c57d4b2ab4ae3f57abaf3fe976ee5adc68a0b1a2e615a1b7c88b5c841252bdd1bae292
7
+ data.tar.gz: 759dab8f82a35ca0a65a1d81a45b670fc5476799df44517ff52f379fb83f29a661fd75be82dc79fa0835b3f9edb8bb06a4746869a12eee66e06d77c68c504517
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.0.6] - 2024-02-04
6
+
7
+ ### add
8
+ - add function of twoway2_anova.
9
+
5
10
  ## [0.0.5] - 2024-02-01
6
11
 
7
12
  ### add
@@ -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
- sumSa += meanXij[i][j];
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 < r_val) ? false : true;
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.5
4
+ version: 0.0.7
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-01 00:00:00.000000000 Z
11
+ date: 2024-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake