num4anova 0.0.8-java → 0.0.10-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 +258 -0
- data/lib/num4anova.rb +67 -0
- 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: 3dc8b0870b6c837111c8c59d391502dcea83fa1bb055834ccbe89823d24ba64a
|
4
|
+
data.tar.gz: d079fbc907bb2b0f72dc79affb51441efbbad8973842703194dac216be783e0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ab2456e85fa85bb45fe021e5e6606353f7d957874ac6f5fe8f335ab78a4449c50f866ce5b8af14c5cfb5ece7b61bffc700c499d584e0d16df14c1d4e2370ab2
|
7
|
+
data.tar.gz: 0e43ed4956da47b8964f4f129ef27b46333c18f4c1cd84af0826f7f533ca7df185e2e9af83ce4cea202ad15d2115e4ed80c4335adfb7cf69654f39fbfd430af5
|
data/CHANGELOG.md
CHANGED
@@ -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.
|
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-
|
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
|