num4anova 0.0.8-java → 0.0.10-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: c95aa4643ccb4e0c51bcead18e37bf5561ecadd7ea0fe67a1ed0ee332aab3229
4
- data.tar.gz: 47045f21d6b1774ebf1435c6397852b6f567bf69fe1d001091cd4aa164a0756e
3
+ metadata.gz: 3dc8b0870b6c837111c8c59d391502dcea83fa1bb055834ccbe89823d24ba64a
4
+ data.tar.gz: d079fbc907bb2b0f72dc79affb51441efbbad8973842703194dac216be783e0b
5
5
  SHA512:
6
- metadata.gz: 5367576d7d8d9130c182eed316807b2b7393f3df7cabc9f95c441aced071b39f229e3f5e76a5307e619d399cafd27d4492e4d29049a0cd45475936df386ef647
7
- data.tar.gz: 3f23540f51ca938baa190c4b85a9e9aa6178d386ac0a66b7047cff877fb32b422d3f21ad7d42daa7a14ef4514901a8287f54b11b5b7fddef37e80d65f0c8fbe5
6
+ metadata.gz: 2ab2456e85fa85bb45fe021e5e6606353f7d957874ac6f5fe8f335ab78a4449c50f866ce5b8af14c5cfb5ece7b61bffc700c499d584e0d16df14c1d4e2370ab2
7
+ data.tar.gz: 0e43ed4956da47b8964f4f129ef27b46333c18f4c1cd84af0826f7f533ca7df185e2e9af83ce4cea202ad15d2115e4ed80c4335adfb7cf69654f39fbfd430af5
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.0.10] - 2024-03-05
6
+
7
+ ### add
8
+ - add fuction of significance_test.
9
+
10
+ ## [0.0.9] - 2024-03-02
11
+
12
+ ### add
13
+ - add fuction of parallel_test.
14
+
5
15
  ## [0.0.6] - 2024-02-04
6
16
 
7
17
  ### add
@@ -0,0 +1,258 @@
1
+ import org.apache.commons.math3.distribution.FDistribution;
2
+
3
+ public class Ancova {
4
+ private static Ancova ancova = new Ancova();
5
+ public static Ancova getInstance() {
6
+ return ancova;
7
+ }
8
+ public boolean parallelTest(double[][][] xi, double a) {
9
+ HypothesisTest hypoth = new Parallettest();
10
+
11
+ double statistic = hypoth.calcTestStatistic(xi);
12
+ return hypoth.executeTest(statistic, a);
13
+ }
14
+ public boolean significanceTest(double[][][] xi, double a) {
15
+ HypothesisTest hypoth = new SignificanceTest();
16
+
17
+ double statistic = hypoth.calcTestStatistic(xi);
18
+ return hypoth.executeTest(statistic, a);
19
+ }
20
+ /*********************************/
21
+ /* interface define */
22
+ /*********************************/
23
+ private interface HypothesisTest {
24
+ double calcTestStatistic(double[][][] xi);
25
+ boolean executeTest(double statistic, double a);
26
+ }
27
+ /*********************************/
28
+ /* class define */
29
+ /*********************************/
30
+ private class RegressionLine {
31
+ protected int calcSumn(double[][][] xi) {
32
+ int sum = 0;
33
+
34
+ for(int i = 0; i < xi.length; i++) {
35
+ sum += xi[i].length;
36
+ }
37
+ return sum;
38
+ }
39
+ protected double calcSex(double[][][] xi, int sumn) {
40
+ double sumx2 = calcSumx2(xi);
41
+ double sumx = calcSumx(xi);
42
+
43
+ double sumtx = sumx2 - sumx*sumx / sumn;
44
+ double sumax = calcSumax(xi) - sumx*sumx / sumn;
45
+
46
+ return sumtx - sumax;
47
+ }
48
+ protected double calcSey(double[][][] xi, int sumn) {
49
+ double sumy2 = calcSumy2(xi);
50
+ double sumy = calcSumy(xi);
51
+
52
+ double sumay = calcSumay(xi) - sumy*sumy / sumn;
53
+ double sumty = sumy2 - sumy*sumy / sumn;
54
+
55
+ return sumty - sumay;
56
+ }
57
+ protected double calcSeyx(double[][][] xi, int sumn) {
58
+ double sumx = calcSumx(xi);
59
+ double sumy = calcSumy(xi);
60
+ double sumyx = calcSumyx(xi);
61
+
62
+ double sumayx = calcSumayx(xi) - sumy*sumx / sumn;
63
+ double sumtyx = sumyx - sumy*sumx / sumn;
64
+
65
+ return sumtyx - sumayx;
66
+ }
67
+ // 平行性の検定
68
+ protected double calcbx(double[][][] xi) {
69
+ double sum = 0.0;
70
+
71
+ for (int i = 0; i < xi.length; i++) {
72
+ int n = xi[i].length;
73
+ double sumx = 0.0;
74
+ double sumy = 0.0;
75
+ double sumyx = 0.0;
76
+ double sumx2 = 0.0;
77
+ for (int j = 0; j < n; j++) {
78
+ sumx += xi[i][j][1];
79
+ sumy += xi[i][j][0];
80
+ sumyx += xi[i][j][1] * xi[i][j][0];
81
+
82
+ sumx2 += xi[i][j][1] * xi[i][j][1];
83
+
84
+ }
85
+ double wki = n * sumyx - sumy * sumx;
86
+ double wk = wki * wki / (n * (n * sumx2 - sumx * sumx));
87
+
88
+ sum += wk;
89
+ }
90
+ return sum;
91
+ }
92
+
93
+
94
+ private double calcSumay(double[][][] xi) {
95
+ double sum = 0.0;
96
+
97
+ for (int i = 0; i < xi.length; i++) {
98
+ double sumyi = 0.0;
99
+ for (int j = 0; j < xi[i].length; j++) {
100
+ sumyi += xi[i][j][0];
101
+ }
102
+ sum += sumyi * sumyi / xi[i].length;
103
+ }
104
+ return sum;
105
+ }
106
+ private double calcSumy2(double[][][] xi) {
107
+ double sum = 0.0;
108
+
109
+ for (int i = 0; i < xi.length; i++) {
110
+ for (int j = 0; j < xi[i].length; j++) {
111
+ sum += xi[i][j][0] * xi[i][j][0];
112
+ }
113
+ }
114
+ return sum;
115
+ }
116
+ private double calcSumx(double[][][] xi) {
117
+ double sum = 0.0;
118
+
119
+ for (int i = 0; i < xi.length; i++) {
120
+ for (int j = 0; j < xi[i].length; j++) {
121
+ sum += xi[i][j][1];
122
+ }
123
+ }
124
+ return sum;
125
+ }
126
+ protected double calcSumx2(double[][][] xi) {
127
+ double sum = 0.0;
128
+
129
+ for (int i = 0; i < xi.length; i++) {
130
+ for (int j = 0; j < xi[i].length; j++) {
131
+ sum += xi[i][j][1] * xi[i][j][1];
132
+ }
133
+ }
134
+ return sum;
135
+ }
136
+ protected double calcSumyx(double[][][] xi) {
137
+ double sum = 0.0;
138
+
139
+ for (int i = 0; i < xi.length; i++) {
140
+ for (int j = 0; j < xi[i].length; j++) {
141
+ sum += xi[i][j][0] * xi[i][j][1];
142
+ }
143
+ }
144
+ return sum;
145
+ }
146
+ private double calcSumayx(double[][][] xi) {
147
+ double sum = 0.0;
148
+
149
+ for (int i = 0; i < xi.length; i++) {
150
+ double sumxi = 0.0;
151
+ double sumyi = 0.0;
152
+ for (int j = 0; j < xi[i].length; j++) {
153
+ sumxi += xi[i][j][1];
154
+ sumyi += xi[i][j][0];
155
+ }
156
+ sum += sumxi * sumyi / xi[i].length;
157
+ }
158
+ return sum;
159
+ }
160
+ // 水準間変動
161
+ private double calcSumax(double[][][] xi) {
162
+ double sum = 0.0;
163
+
164
+ for (int i = 0; i < xi.length; i++) {
165
+ double sumxi = 0.0;
166
+ for (int j = 0; j < xi[i].length; j++) {
167
+ sumxi += xi[i][j][1];
168
+ }
169
+ sum += sumxi * sumxi / xi[i].length;
170
+ }
171
+ return sum;
172
+ }
173
+ private double calcSumy(double[][][] xi) {
174
+ double sum = 0.0;
175
+
176
+ for (int i = 0; i < xi.length; i++) {
177
+ for (int j = 0; j < xi[i].length; j++) {
178
+ sum += xi[i][j][0];
179
+ }
180
+ }
181
+ return sum;
182
+ }
183
+ }
184
+ // 回帰直線モデルの平行性の検定
185
+ private class Parallettest extends RegressionLine implements HypothesisTest {
186
+ private int n = 0;
187
+ private int m = 0;
188
+ public double calcTestStatistic(double[][][] xi) {
189
+ int sumn = calcSumn(xi);
190
+ n = xi.length - 1;
191
+ m = sumn - 2 * xi.length;
192
+
193
+ double vnp = calcVnp(xi, sumn);
194
+ double ve2 = calcVe2(xi, sumn);
195
+
196
+ return vnp / ve2;
197
+ }
198
+ private double calcVnp(double[][][] xi, int sumn){
199
+ return calcSnp(xi, sumn) / n;
200
+ }
201
+ private double calcSnp(double[][][] xi, int sumn) {
202
+ double sumbx = calcbx(xi);
203
+ double sumeyx = calcSeyx(xi, sumn);
204
+ double sumex = calcSex(xi, sumn);
205
+
206
+ return sumbx - sumeyx * sumeyx / sumex;
207
+ }
208
+ private double calcVe2(double[][][] xi, int sumn) {
209
+ return calcSe2(xi, sumn) / m;
210
+ }
211
+ private double calcSe2(double[][][] xi, int sumn) {
212
+ double sumey = calcSey(xi, sumn);
213
+ double sumbx = calcbx(xi);
214
+
215
+ return sumey - sumbx;
216
+ }
217
+ public boolean executeTest(double statistic, double a) {
218
+ FDistribution fDist = new FDistribution(n, m);
219
+ double f = fDist.inverseCumulativeProbability(1.0 - a);
220
+
221
+ return (statistic >= f) ? true : false;
222
+ }
223
+ }
224
+ // 回帰直線モデルの平行性の検定
225
+ private class SignificanceTest extends RegressionLine implements HypothesisTest {
226
+ private int n = 0;
227
+ private int m = 0;
228
+ public double calcTestStatistic(double[][][] xi) {
229
+ int sumn = calcSumn(xi);
230
+ n = 1;
231
+ m = sumn - xi.length - 1;
232
+
233
+ double vr = calcVr(xi, sumn);
234
+ double ve = calcVe(xi, sumn);
235
+ return vr / ve;
236
+ }
237
+ public boolean executeTest(double statistic, double a) {
238
+ FDistribution fDist = new FDistribution(n, m);
239
+ double f = fDist.inverseCumulativeProbability(1.0 - a);
240
+
241
+ return (statistic >= f) ? true : false;
242
+ }
243
+ private double calcVr(double[][][] xi, int sumn) {
244
+ double sumeyx = calcSeyx(xi, sumn);
245
+ double sumex = calcSex(xi, sumn);
246
+
247
+ return (sumeyx * sumeyx) / sumex;
248
+ }
249
+ private double calcVe(double[][][] xi, int sumn) {
250
+ double sumey = calcSey(xi, sumn);
251
+ double sumex = calcSex(xi, sumn);
252
+ double sumeyx = calcSeyx(xi, sumn);
253
+
254
+ return (sumey * sumex - sumeyx * sumeyx) / (m * sumex);
255
+ }
256
+ }
257
+ }
258
+
data/lib/num4anova.rb CHANGED
@@ -5,6 +5,7 @@ require 'commons-math3-3.6.1.jar'
5
5
 
6
6
  java_import 'OneWayLayout'
7
7
  java_import 'TwoWayLayout'
8
+ java_import 'Ancova'
8
9
  java_import 'java.util.HashMap'
9
10
  # 分散分析を行う
10
11
  # (Apache commoms math3使用)
@@ -218,5 +219,71 @@ module Num4AnovaLib
218
219
  return ret.to_a
219
220
  end
220
221
  end
222
+ # 共分散分析
223
+ class Num4AncovaLib
224
+ def initialize
225
+ @ancova = Ancova.getInstance()
226
+ end
227
+ # 回帰直線の平行性検定
228
+ #
229
+ # @overload parallel_test(xi, a)
230
+ # @param [array] xi データ(double[][][])
231
+ # @param [double] a 有意水準
232
+ # @return [boolean] 検定結果(boolean true:棄却域内 false:棄却域外)
233
+ # @example
234
+ # xi = [
235
+ # [
236
+ # [3,35], [5,38], [3,39],
237
+ # ],
238
+ # [
239
+ # [3,36], [3,39], [8,54],
240
+ # ],
241
+ # [
242
+ # [2,40], [2,45], [2,39],
243
+ # ],
244
+ # [
245
+ # [3,47], [4,52], [2,48],
246
+ # ],
247
+ # [
248
+ # [1,64], [2,80], [0,70],
249
+ # ],
250
+ # ]
251
+ # ancova = Num4AnovaLib::Num4AncovaLib.new
252
+ # ancova.parallel_test(xi, 0.05)
253
+ # => false
254
+ def parallel_test(xi, a)
255
+ @ancova.parallelTest(xi.to_java(Java::double[][]), a)
256
+ end
257
+ # 回帰直線の有意性検定
258
+ #
259
+ # @overload significance_testt(xi, a)
260
+ # @param [array] xi データ(double[][][])
261
+ # @param [double] a 有意水準
262
+ # @return [boolean] 検定結果(boolean true:棄却域内 false:棄却域外)
263
+ # @example
264
+ # xi = [
265
+ # [
266
+ # [3,35], [5,38], [3,39],
267
+ # ],
268
+ # [
269
+ # [3,36], [3,39], [8,54],
270
+ # ],
271
+ # [
272
+ # [2,40], [2,45], [2,39],
273
+ # ],
274
+ # [
275
+ # [3,47], [4,52], [2,48],
276
+ # ],
277
+ # [
278
+ # [1,64], [2,80], [0,70],
279
+ # ],
280
+ # ]
281
+ # ancova = Num4AnovaLib::Num4AncovaLib.new
282
+ # ancova.significance_test(xi, 0.05)
283
+ # => true
284
+ def significance_test(xi, a)
285
+ @ancova.significanceTest(xi.to_java(Java::double[][]), a)
286
+ end
287
+ end
221
288
  end
222
289
 
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.8
4
+ version: 0.0.10
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-04 00:00:00.000000000 Z
11
+ date: 2024-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -61,6 +61,7 @@ files:
61
61
  - Gemfile
62
62
  - LICENSE
63
63
  - Rakefile
64
+ - ext/num4anova/Ancova.java
64
65
  - ext/num4anova/MultiComp.java
65
66
  - ext/num4anova/OneWayLayout.java
66
67
  - ext/num4anova/TwoWayLayout.java