num4anova 0.0.9-java → 0.0.11-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/num4anova/Ancova.java +212 -82
- data/lib/num4anova.rb +62 -2
- 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: 2a278a4c32d7e1ef21ccbb1200573d5c1b4e326c59602327f9968afb29f134b6
|
4
|
+
data.tar.gz: e8520453d70e0276e6bb0587aefcd31b90b84d703cf670ae25297af73172bcdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42836d15f6460c2650a7c6cb17c15de206bbabb52c40d988714fe26564d019974a416db4c22f67ed0c535694022575d380603da7c029f0b04476d4994ffca7a5
|
7
|
+
data.tar.gz: ed1698ed0b05da8d2f0d7417fd1271bcb41754d76fa68b19fb300245449a634c830636ea790a49b89d87066c320c55e2260464bb791ba795f8193664a0babb28
|
data/CHANGELOG.md
CHANGED
data/ext/num4anova/Ancova.java
CHANGED
@@ -11,6 +11,18 @@ public class Ancova {
|
|
11
11
|
double statistic = hypoth.calcTestStatistic(xi);
|
12
12
|
return hypoth.executeTest(statistic, a);
|
13
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
|
+
public boolean differenceTest(double[][][] xi, double a) {
|
21
|
+
HypothesisTest hypoth = new DifferenceTest();
|
22
|
+
|
23
|
+
double statistic = hypoth.calcTestStatistic(xi);
|
24
|
+
return hypoth.executeTest(statistic, a);
|
25
|
+
}
|
14
26
|
/*********************************/
|
15
27
|
/* interface define */
|
16
28
|
/*********************************/
|
@@ -21,101 +33,145 @@ public class Ancova {
|
|
21
33
|
/*********************************/
|
22
34
|
/* class define */
|
23
35
|
/*********************************/
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
private int m = 0;
|
28
|
-
public double calcTestStatistic(double[][][] xi) {
|
29
|
-
int sumn = calcSumn(xi);
|
30
|
-
double sumx = calcSumx(xi);
|
31
|
-
double sumy = calcSumy(xi);
|
32
|
-
n = xi.length - 1;
|
33
|
-
m = sumn - 2 * xi.length;
|
36
|
+
private class RegressionLine {
|
37
|
+
protected int calcSumn(double[][][] xi) {
|
38
|
+
int sum = 0;
|
34
39
|
|
40
|
+
for(int i = 0; i < xi.length; i++) {
|
41
|
+
sum += xi[i].length;
|
42
|
+
}
|
43
|
+
return sum;
|
44
|
+
}
|
35
45
|
// 全変動
|
36
|
-
|
46
|
+
private double calcSty(double[][][] xi, int sumn) {
|
37
47
|
double sumy2 = calcSumy2(xi);
|
38
|
-
double
|
48
|
+
double sumy = calcSumy(xi);
|
39
49
|
|
40
|
-
|
41
|
-
|
42
|
-
|
50
|
+
return sumy2 - sumy*sumy / sumn;
|
51
|
+
}
|
52
|
+
private double calcStx(double[][][] xi, int sumn) {
|
53
|
+
double sumx2 = calcSumx2(xi);
|
54
|
+
double sumx = calcSumx(xi);
|
43
55
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
double
|
56
|
+
return sumx2 - sumx*sumx / sumn;
|
57
|
+
}
|
58
|
+
private double calcStyx(double[][][] xi, int sumn) {
|
59
|
+
double sumx = calcSumx(xi);
|
60
|
+
double sumy = calcSumy(xi);
|
61
|
+
double sumyx = calcSumyx(xi);
|
48
62
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
63
|
+
return sumyx - sumy*sumx / sumn;
|
64
|
+
}
|
65
|
+
// 水準間変動
|
66
|
+
private double calcSay(double[][][] xi, int sumn) {
|
67
|
+
double sumy = calcSumy(xi);
|
53
68
|
|
54
|
-
|
55
|
-
|
56
|
-
|
69
|
+
return calcSumay(xi) - sumy*sumy / sumn;
|
70
|
+
}
|
71
|
+
private double calcSax(double[][][] xi, int sumn) {
|
72
|
+
double sumx = calcSumx(xi);
|
57
73
|
|
58
|
-
|
59
|
-
double vnp = sumnp / n;
|
60
|
-
double ve2 = sume2 / m;
|
61
|
-
return vnp / ve2;
|
74
|
+
return calcSumax(xi) - sumx*sumx / sumn;
|
62
75
|
}
|
63
|
-
|
64
|
-
|
65
|
-
double
|
76
|
+
private double calcSayx(double[][][] xi, int sumn) {
|
77
|
+
double sumx = calcSumx(xi);
|
78
|
+
double sumy = calcSumy(xi);
|
66
79
|
|
67
|
-
return (
|
80
|
+
return calcSumayx(xi) - sumy*sumx / sumn;
|
81
|
+
}
|
82
|
+
// 水準内変動
|
83
|
+
protected double calcSex(double[][][] xi, int sumn) {
|
84
|
+
return calcStx(xi, sumn) - calcSax(xi, sumn);
|
85
|
+
}
|
86
|
+
protected double calcSey(double[][][] xi, int sumn) {
|
87
|
+
return calcSty(xi, sumn) - calcSay(xi, sumn);
|
88
|
+
}
|
89
|
+
protected double calcSeyx(double[][][] xi, int sumn) {
|
90
|
+
return calcStyx(xi, sumn) - calcSayx(xi, sumn);
|
68
91
|
}
|
69
|
-
private int calcSumn(double[][][] xi) {
|
70
|
-
int sum = 0;
|
71
92
|
|
72
|
-
|
73
|
-
|
93
|
+
// 平行性の検定
|
94
|
+
protected double calcbx(double[][][] xi) {
|
95
|
+
double sum = 0.0;
|
96
|
+
|
97
|
+
for (int i = 0; i < xi.length; i++) {
|
98
|
+
int n = xi[i].length;
|
99
|
+
double sumx = 0.0;
|
100
|
+
double sumy = 0.0;
|
101
|
+
double sumyx = 0.0;
|
102
|
+
double sumx2 = 0.0;
|
103
|
+
for (int j = 0; j < n; j++) {
|
104
|
+
sumx += xi[i][j][1];
|
105
|
+
sumy += xi[i][j][0];
|
106
|
+
sumyx += xi[i][j][1] * xi[i][j][0];
|
107
|
+
|
108
|
+
sumx2 += xi[i][j][1] * xi[i][j][1];
|
109
|
+
|
110
|
+
}
|
111
|
+
double wki = n * sumyx - sumy * sumx;
|
112
|
+
double wk = wki * wki / (n * (n * sumx2 - sumx * sumx));
|
113
|
+
|
114
|
+
sum += wk;
|
74
115
|
}
|
75
116
|
return sum;
|
76
117
|
}
|
77
|
-
//
|
78
|
-
|
118
|
+
// 差の検定
|
119
|
+
protected double calcSa(double[][][] xi, int sumn) {
|
120
|
+
double sumty = calcSty(xi, sumn);
|
121
|
+
double sumtyx = calcStyx(xi, sumn);
|
122
|
+
double sumtx = calcStx(xi, sumn);
|
123
|
+
double sumey = calcSey(xi, sumn);
|
124
|
+
double sumeyx = calcSeyx(xi, sumn);
|
125
|
+
double sumex = calcSex(xi, sumn);
|
126
|
+
|
127
|
+
return (sumty - sumtyx * sumtyx / sumtx)
|
128
|
+
- (sumey - sumeyx * sumeyx / sumex);
|
129
|
+
}
|
130
|
+
|
131
|
+
// ETC
|
132
|
+
private double calcSumay(double[][][] xi) {
|
79
133
|
double sum = 0.0;
|
80
134
|
|
81
135
|
for (int i = 0; i < xi.length; i++) {
|
136
|
+
double sumyi = 0.0;
|
82
137
|
for (int j = 0; j < xi[i].length; j++) {
|
83
|
-
|
138
|
+
sumyi += xi[i][j][0];
|
84
139
|
}
|
140
|
+
sum += sumyi * sumyi / xi[i].length;
|
85
141
|
}
|
86
142
|
return sum;
|
87
143
|
}
|
88
|
-
private double
|
144
|
+
private double calcSumy2(double[][][] xi) {
|
89
145
|
double sum = 0.0;
|
90
146
|
|
91
147
|
for (int i = 0; i < xi.length; i++) {
|
92
148
|
for (int j = 0; j < xi[i].length; j++) {
|
93
|
-
sum += xi[i][j][0];
|
149
|
+
sum += xi[i][j][0] * xi[i][j][0];
|
94
150
|
}
|
95
151
|
}
|
96
152
|
return sum;
|
97
153
|
}
|
98
|
-
private double
|
154
|
+
private double calcSumx(double[][][] xi) {
|
99
155
|
double sum = 0.0;
|
100
156
|
|
101
157
|
for (int i = 0; i < xi.length; i++) {
|
102
158
|
for (int j = 0; j < xi[i].length; j++) {
|
103
|
-
sum += xi[i][j][1]
|
159
|
+
sum += xi[i][j][1];
|
104
160
|
}
|
105
161
|
}
|
106
162
|
return sum;
|
107
163
|
}
|
108
|
-
|
164
|
+
protected double calcSumx2(double[][][] xi) {
|
109
165
|
double sum = 0.0;
|
110
166
|
|
111
167
|
for (int i = 0; i < xi.length; i++) {
|
112
168
|
for (int j = 0; j < xi[i].length; j++) {
|
113
|
-
sum += xi[i][j][
|
169
|
+
sum += xi[i][j][1] * xi[i][j][1];
|
114
170
|
}
|
115
171
|
}
|
116
172
|
return sum;
|
117
173
|
}
|
118
|
-
|
174
|
+
protected double calcSumyx(double[][][] xi) {
|
119
175
|
double sum = 0.0;
|
120
176
|
|
121
177
|
for (int i = 0; i < xi.length; i++) {
|
@@ -125,70 +181,144 @@ public class Ancova {
|
|
125
181
|
}
|
126
182
|
return sum;
|
127
183
|
}
|
128
|
-
|
129
|
-
private double calcSumax(double[][][] xi) {
|
184
|
+
private double calcSumayx(double[][][] xi) {
|
130
185
|
double sum = 0.0;
|
131
186
|
|
132
187
|
for (int i = 0; i < xi.length; i++) {
|
133
188
|
double sumxi = 0.0;
|
189
|
+
double sumyi = 0.0;
|
134
190
|
for (int j = 0; j < xi[i].length; j++) {
|
135
191
|
sumxi += xi[i][j][1];
|
192
|
+
sumyi += xi[i][j][0];
|
136
193
|
}
|
137
|
-
sum += sumxi *
|
194
|
+
sum += sumxi * sumyi / xi[i].length;
|
138
195
|
}
|
139
196
|
return sum;
|
140
|
-
|
141
197
|
}
|
142
|
-
private double
|
198
|
+
private double calcSumax(double[][][] xi) {
|
143
199
|
double sum = 0.0;
|
144
200
|
|
145
201
|
for (int i = 0; i < xi.length; i++) {
|
146
|
-
double
|
202
|
+
double sumxi = 0.0;
|
147
203
|
for (int j = 0; j < xi[i].length; j++) {
|
148
|
-
|
204
|
+
sumxi += xi[i][j][1];
|
149
205
|
}
|
150
|
-
sum +=
|
206
|
+
sum += sumxi * sumxi / xi[i].length;
|
151
207
|
}
|
152
208
|
return sum;
|
153
209
|
}
|
154
|
-
private double
|
210
|
+
private double calcSumy(double[][][] xi) {
|
155
211
|
double sum = 0.0;
|
156
212
|
|
157
213
|
for (int i = 0; i < xi.length; i++) {
|
158
|
-
double sumxi = 0.0;
|
159
|
-
double sumyi = 0.0;
|
160
214
|
for (int j = 0; j < xi[i].length; j++) {
|
161
|
-
|
162
|
-
sumyi += xi[i][j][0];
|
215
|
+
sum += xi[i][j][0];
|
163
216
|
}
|
164
|
-
sum += sumxi * sumyi / xi[i].length;
|
165
217
|
}
|
166
218
|
return sum;
|
167
219
|
}
|
168
|
-
// 平行性の検定
|
169
|
-
private double calcbx(double[][][] xi) {
|
170
|
-
double sum = 0.0;
|
171
220
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
221
|
+
}
|
222
|
+
// 回帰直線モデルの平行性の検定
|
223
|
+
private class Parallettest extends RegressionLine implements HypothesisTest {
|
224
|
+
private int n = 0;
|
225
|
+
private int m = 0;
|
226
|
+
public double calcTestStatistic(double[][][] xi) {
|
227
|
+
int sumn = calcSumn(xi);
|
228
|
+
n = xi.length - 1;
|
229
|
+
m = sumn - 2 * xi.length;
|
230
|
+
|
231
|
+
double vnp = calcVnp(xi, sumn);
|
232
|
+
double ve2 = calcVe2(xi, sumn);
|
182
233
|
|
183
|
-
|
234
|
+
return vnp / ve2;
|
235
|
+
}
|
236
|
+
private double calcVnp(double[][][] xi, int sumn){
|
237
|
+
return calcSnp(xi, sumn) / n;
|
238
|
+
}
|
239
|
+
private double calcSnp(double[][][] xi, int sumn) {
|
240
|
+
double sumbx = calcbx(xi);
|
241
|
+
double sumeyx = calcSeyx(xi, sumn);
|
242
|
+
double sumex = calcSex(xi, sumn);
|
184
243
|
|
185
|
-
|
186
|
-
|
187
|
-
|
244
|
+
return sumbx - sumeyx * sumeyx / sumex;
|
245
|
+
}
|
246
|
+
private double calcVe2(double[][][] xi, int sumn) {
|
247
|
+
return calcSe2(xi, sumn) / m;
|
248
|
+
}
|
249
|
+
private double calcSe2(double[][][] xi, int sumn) {
|
250
|
+
double sumey = calcSey(xi, sumn);
|
251
|
+
double sumbx = calcbx(xi);
|
188
252
|
|
189
|
-
|
190
|
-
|
191
|
-
|
253
|
+
return sumey - sumbx;
|
254
|
+
}
|
255
|
+
public boolean executeTest(double statistic, double a) {
|
256
|
+
FDistribution fDist = new FDistribution(n, m);
|
257
|
+
double f = fDist.inverseCumulativeProbability(1.0 - a);
|
258
|
+
|
259
|
+
return (statistic >= f) ? true : false;
|
260
|
+
}
|
261
|
+
}
|
262
|
+
// 回帰直線モデルの平行性の検定
|
263
|
+
private class SignificanceTest extends RegressionLine implements HypothesisTest {
|
264
|
+
private int n = 0;
|
265
|
+
private int m = 0;
|
266
|
+
public double calcTestStatistic(double[][][] xi) {
|
267
|
+
int sumn = calcSumn(xi);
|
268
|
+
n = 1;
|
269
|
+
m = sumn - xi.length - 1;
|
270
|
+
|
271
|
+
double vr = calcVr(xi, sumn);
|
272
|
+
double ve = calcVe(xi, sumn);
|
273
|
+
|
274
|
+
return vr / ve;
|
275
|
+
}
|
276
|
+
public boolean executeTest(double statistic, double a) {
|
277
|
+
FDistribution fDist = new FDistribution(n, m);
|
278
|
+
double f = fDist.inverseCumulativeProbability(1.0 - a);
|
279
|
+
|
280
|
+
return (statistic >= f) ? true : false;
|
281
|
+
}
|
282
|
+
private double calcVr(double[][][] xi, int sumn) {
|
283
|
+
double sumeyx = calcSeyx(xi, sumn);
|
284
|
+
double sumex = calcSex(xi, sumn);
|
285
|
+
|
286
|
+
return (sumeyx * sumeyx) / sumex;
|
287
|
+
}
|
288
|
+
private double calcVe(double[][][] xi, int sumn) {
|
289
|
+
double sumey = calcSey(xi, sumn);
|
290
|
+
double sumex = calcSex(xi, sumn);
|
291
|
+
double sumeyx = calcSeyx(xi, sumn);
|
292
|
+
|
293
|
+
return (sumey * sumex - sumeyx * sumeyx) / (m * sumex);
|
294
|
+
}
|
295
|
+
}
|
296
|
+
// 水準間の差の検定
|
297
|
+
private class DifferenceTest extends RegressionLine implements HypothesisTest {
|
298
|
+
private int n = 0;
|
299
|
+
private int m = 0;
|
300
|
+
public double calcTestStatistic(double[][][] xi) {
|
301
|
+
int sumn = calcSumn(xi);
|
302
|
+
n = xi.length - 1;
|
303
|
+
m = sumn - xi.length - 1;
|
304
|
+
|
305
|
+
double va = calcSa(xi, sumn) / n;
|
306
|
+
double ve = calcVe(xi, sumn);
|
307
|
+
|
308
|
+
return va / ve;
|
309
|
+
}
|
310
|
+
public boolean executeTest(double statistic, double a) {
|
311
|
+
FDistribution fDist = new FDistribution(n, m);
|
312
|
+
double f = fDist.inverseCumulativeProbability(1.0 - a);
|
313
|
+
|
314
|
+
return (statistic >= f) ? true : false;
|
315
|
+
}
|
316
|
+
private double calcVe(double[][][] xi, int sumn) {
|
317
|
+
double sumey = calcSey(xi, sumn);
|
318
|
+
double sumex = calcSex(xi, sumn);
|
319
|
+
double sumeyx = calcSeyx(xi, sumn);
|
320
|
+
|
321
|
+
return (sumey * sumex - sumeyx * sumeyx) / (m * sumex);
|
192
322
|
}
|
193
323
|
}
|
194
324
|
}
|
data/lib/num4anova.rb
CHANGED
@@ -228,8 +228,8 @@ module Num4AnovaLib
|
|
228
228
|
#
|
229
229
|
# @overload parallel_test(xi, a)
|
230
230
|
# @param [array] xi データ(double[][][])
|
231
|
-
# @param [double] a
|
232
|
-
# @return [boolean]
|
231
|
+
# @param [double] a 有意水準
|
232
|
+
# @return [boolean] 検定結果(boolean true:棄却域内 false:棄却域外)
|
233
233
|
# @example
|
234
234
|
# xi = [
|
235
235
|
# [
|
@@ -254,6 +254,66 @@ module Num4AnovaLib
|
|
254
254
|
def parallel_test(xi, a)
|
255
255
|
@ancova.parallelTest(xi.to_java(Java::double[][]), a)
|
256
256
|
end
|
257
|
+
# 回帰直線の有意性検定
|
258
|
+
#
|
259
|
+
# @overload significance_test(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
|
+
# 水準間の差の検定
|
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
|
257
317
|
end
|
258
318
|
end
|
259
319
|
|
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.11
|
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-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|