num4normality 0.0.3-java → 0.0.6-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: a735c6ff8848bf8f8c56b7e1bc0b1794a5675ab93d3e9a13477cf8d3041b50d9
4
- data.tar.gz: 87b102e787cd5835ce2c78ebf11e0abf8a2092462cbf9ff7fd73e06a3884d43b
3
+ metadata.gz: 9803b3bcb0408424c204ebda20e538aa178a2f35573e280dd222add412987cff
4
+ data.tar.gz: 1258e8ad4f82177478d2f35d689f56b4d8d58d1177f7a6f45896f05ee6c50189
5
5
  SHA512:
6
- metadata.gz: c808547090cef242d28bbfbc46243fc44726a69d22c18a03916f76ccb7e91b58b7c3a074f1fe7fd7a17c492da9978197358db941c20c1255fcd90773cc28e54d
7
- data.tar.gz: ff78669f413ae51fae98f4fb683981b12793f2a93eaeb17438124e1ad3771b476a34955e4482bc669bcd4044ec31a95f08e9c0c93b89a802b03fe7d664d03c4c
6
+ metadata.gz: 16ad0542c142e6b74871df83ae43fa4ac62a9bd977e3bd466b9a520f849f0852460a1b71051b072c5de14b93a4b7530e2ef1821300b7b02303cfd1b307f0a43c
7
+ data.tar.gz: c49ca950c085da6760c1d0b171b7daad90354c7804e6521711e7469373a47aca58bec5d7fad47fb5d6c1a882c754ff389bdcae8e957fa93467cdc9db500ffa8a
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.0.4] - 2023-12-21
6
+
7
+ ### add
8
+ - add function of omnibustest.
9
+
10
+ ### Fixed
11
+ - fix fuction of kurtosistest.
12
+
5
13
  ## [0.0.3] - 2023-12-18
6
14
 
7
15
  ### add
@@ -4,6 +4,7 @@ import org.jfree.chart.ChartFactory;
4
4
  import org.jfree.data.xy.XYSeriesCollection;
5
5
  import org.jfree.data.xy.XYSeries;
6
6
 
7
+ import org.jfree.chart.plot.CombinedDomainXYPlot;
7
8
  import org.jfree.chart.plot.XYPlot;
8
9
  import org.jfree.chart.axis.NumberAxis;
9
10
  import org.jfree.chart.axis.ValueAxis;
@@ -21,6 +22,7 @@ import java.io.IOException;
21
22
 
22
23
  import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
23
24
  import org.apache.commons.math3.distribution.NormalDistribution;
25
+ import org.apache.commons.math3.distribution.ChiSquaredDistribution;
24
26
  import org.apache.commons.math3.stat.regression.SimpleRegression;
25
27
  import java.util.Arrays;
26
28
  import java.text.DecimalFormat;
@@ -28,18 +30,24 @@ import java.text.DecimalFormat;
28
30
  import org.apache.commons.math3.stat.inference.TestUtils;
29
31
  public class Normality {
30
32
  public static void qqplot(String dname, double[] xi) {
31
- ChartPlot plot = new QQPlot();
32
- JFreeChart chart = plot.createChart(dname, xi);
33
+ ChartPlot plot = new QQChartPlot();
34
+ JFreeChart chart = plot.createChart("正規Q-Qプロット", dname, xi);
33
35
 
34
36
  plot.writeJPEG("qqplot.jpeg", chart, 800, 500);
35
37
  }
36
38
  public static void ksplot(String dname, double[] xi) {
37
- ChartPlot plot = new KSPlot();
38
- JFreeChart chart = plot.createChart(dname, xi);
39
+ ChartPlot plot = new KSChartPlot();
40
+ JFreeChart chart = plot.createChart("コルモゴルフ・スミルノフ検定", dname, xi);
39
41
 
40
42
  plot.writeJPEG("ksplot.jpeg", chart, 800, 500);
41
43
 
42
44
  }
45
+ public static void qqksplot(String dname, double[] xi) {
46
+ ChartPlot plot = new QQKSChartPlot();
47
+ JFreeChart chart = plot.createChart("Q-Q and コルモゴルフ・スミルノフ検定", dname, xi);
48
+
49
+ plot.writeJPEG("qqksplot.jpeg", chart, 1000, 800);
50
+ }
43
51
  public static boolean kstest(double[] xi) {
44
52
  KSTest ks = new KSTest();
45
53
 
@@ -57,14 +65,22 @@ public class Normality {
57
65
  double b2 = daigo.calcTestStatistic(xi);
58
66
  return daigo.test(b2, 0.05);
59
67
  }
60
-
68
+ public static boolean omnibustest(double[] xi) {
69
+ DAgostinosTest daigo = new OmnibusTest();
61
70
 
71
+ double x = daigo.calcTestStatistic(xi);
72
+ return daigo.test(x, 0.05);
73
+ }
74
+
75
+ /*********************************/
76
+ /* interface define */
77
+ /*********************************/
62
78
  private interface ChartPlot {
63
79
  /* フィールド */
64
80
  static final double CLASS_MIN = -4.0;
65
81
  static final double CLASS_MAX = 4.0;
66
82
  /* メゾット */
67
- JFreeChart createChart(String dname, double[] xi);
83
+ JFreeChart createChart(String title, String dname, double[] xi);
68
84
  default void writeJPEG(String fname, JFreeChart chart, int width, int height) {
69
85
  File file = new File(fname);
70
86
  try {
@@ -74,43 +90,22 @@ public class Normality {
74
90
  }
75
91
  }
76
92
  }
93
+ private interface CreatePlot {
94
+ XYPlot createPlot(String dname, double[] xi);
95
+ }
77
96
  private interface DAgostinosTest {
78
97
  double calcTestStatistic(double[] xi);
79
98
  boolean test(double statistic, double a);
80
99
  }
81
-
100
+ /*********************************/
101
+ /* Class define */
102
+ /*********************************/
82
103
  // Q-Qplot
83
- private static class QQPlot implements ChartPlot {
84
- private DescriptiveStatistics stat = null;
85
- private NormalDistribution ndist = null;
86
- public QQPlot() {
87
- stat = new DescriptiveStatistics();
88
- ndist = new NormalDistribution(0, 1);
89
- }
90
- private double[][] createData(double[] xi) {
91
- int n = xi.length;
92
- Arrays.sort(xi);
93
- Arrays.stream(xi).forEach(stat::addValue);
94
- double sum = stat.getSum();
95
- double[][] data = new double[n][2];
96
- double p = 0.0;
97
-
98
- for (int i = 0; i < n; i++) {
99
- p += xi[i] / sum;
100
- double x =
101
- ndist.inverseCumulativeProbability(p * (i + 1.0) / (n + 1.0));
102
-
103
- data[i][0] = x;
104
- data[i][1] = xi[i];
105
- }
106
- return data;
107
- }
108
- public JFreeChart createChart(String dname, double[] xi) {
109
- double[][] data = createData(xi);
110
-
111
- XYPlot plot = createPlot(dname, data);
104
+ private static class QQChartPlot implements ChartPlot {
105
+ public JFreeChart createChart(String title, String dname, double[] xi) {
106
+ XYPlot plot = createPlot(dname, xi);
112
107
  /*--- 横軸 ---*/
113
- NumberAxis domainAxis = new NumberAxis("標準正規分布");
108
+ NumberAxis domainAxis = new NumberAxis("期待値");
114
109
 
115
110
  plot.setDomainAxis(domainAxis);
116
111
  domainAxis.setLowerMargin(0.03);
@@ -119,150 +114,231 @@ public class Normality {
119
114
  domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
120
115
 
121
116
  ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
122
- return new JFreeChart("正規性の検定", plot);
117
+ return new JFreeChart(title, plot);
123
118
  }
124
- private XYPlot createPlot(String dname, double[][] data) {
125
- XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
126
- XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
127
- XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
128
-
129
- renderer0.setDefaultToolTipGenerator(toolTipGenerator);
130
- renderer0.setURLGenerator(null);
131
- renderer1.setDefaultToolTipGenerator(toolTipGenerator);
132
- renderer1.setURLGenerator(null);
133
-
134
- XYPlot plot = new XYPlot();
135
- plot.setOrientation(PlotOrientation.VERTICAL);
136
- plot.mapDatasetToRangeAxis(0,0);
137
- plot.mapDatasetToRangeAxis(1,0);
138
- plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
139
-
140
- /*--- 縦軸 ---*/
141
- NumberAxis valueAxis0 = new NumberAxis("観測値");
142
- plot.setRangeAxis(valueAxis0);
143
-
144
- plot.setRenderer(0, renderer0);
145
- plot.setDataset(0, createDataset0(dname, data));
146
-
147
- plot.setRenderer(1, renderer1);
148
- plot.setDataset(1, createDataset1(data));
119
+ private XYPlot createPlot(String dname, double[] xi) {
120
+ CreatePlot plotImpl = new QQPlot();
149
121
 
150
- return plot;
122
+ return plotImpl.createPlot(dname, xi);
151
123
  }
152
- private XYSeriesCollection createDataset0(String dname, double[][] data) {
153
- XYSeries cu = new XYSeries(dname);
154
-
155
- for (int i = 0; i < data.length; i++) {
156
- cu.add(data[i][0], data[i][1]);
124
+ public static class QQPlot implements CreatePlot {
125
+ private DescriptiveStatistics stat = null;
126
+ private NormalDistribution ndist = null;
127
+ public QQPlot() {
128
+ stat = new DescriptiveStatistics();
129
+ ndist = new NormalDistribution(0, 1);
130
+ }
131
+ private double[][] createData(double[] xi) {
132
+ int n = xi.length;
133
+ Arrays.sort(xi);
134
+ Arrays.stream(xi).forEach(stat::addValue);
135
+ double sum = stat.getSum();
136
+ double[][] data = new double[n][2];
137
+ double p = 0.0;
138
+
139
+ for (int i = 0; i < n; i++) {
140
+ p += xi[i] / sum;
141
+ double x =
142
+ ndist.inverseCumulativeProbability(p * (i + 1.0) / (n + 1.0));
143
+
144
+ data[i][0] = x;
145
+ data[i][1] = xi[i];
146
+ }
147
+ return data;
148
+ }
149
+ public XYPlot createPlot(String dname, double[] xi) {
150
+ double[][] data = createData(xi);
151
+ XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
152
+ XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
153
+ XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
154
+
155
+ renderer0.setDefaultToolTipGenerator(toolTipGenerator);
156
+ renderer0.setURLGenerator(null);
157
+ renderer1.setDefaultToolTipGenerator(toolTipGenerator);
158
+ renderer1.setURLGenerator(null);
159
+
160
+ XYPlot plot = new XYPlot();
161
+ plot.setOrientation(PlotOrientation.VERTICAL);
162
+ plot.mapDatasetToRangeAxis(0,0);
163
+ plot.mapDatasetToRangeAxis(1,0);
164
+ plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
165
+
166
+ /*--- 縦軸 ---*/
167
+ NumberAxis valueAxis0 = new NumberAxis("観測値");
168
+ plot.setRangeAxis(valueAxis0);
169
+
170
+ plot.setRenderer(0, renderer0);
171
+ plot.setDataset(0, createDataset0(dname, data));
172
+
173
+ plot.setRenderer(1, renderer1);
174
+ plot.setDataset(1, createDataset1(data));
175
+
176
+ return plot;
157
177
  }
158
- XYSeriesCollection series = new XYSeriesCollection();
178
+ private XYSeriesCollection createDataset0(String dname, double[][] data) {
179
+ XYSeries cu = new XYSeries(dname);
180
+
181
+ for (int i = 0; i < data.length; i++) {
182
+ cu.add(data[i][0], data[i][1]);
183
+ }
184
+ XYSeriesCollection series = new XYSeriesCollection();
159
185
 
160
- series.addSeries(cu);
161
- return series;
162
- }
163
- private XYSeriesCollection createDataset1(double[][] data) {
164
- SimpleRegression simpleReg = new SimpleRegression(true);
165
- XYSeries cu = new XYSeries("累積");
186
+ series.addSeries(cu);
187
+ return series;
188
+ }
189
+ private XYSeriesCollection createDataset1(double[][] data) {
190
+ SimpleRegression simpleReg = new SimpleRegression(true);
191
+ XYSeries cu = new XYSeries("累積");
166
192
 
167
- simpleReg.addData(data);
168
- double a = simpleReg.getSlope();
169
- double b = simpleReg.getIntercept();
193
+ simpleReg.addData(data);
194
+ double a = simpleReg.getSlope();
195
+ double b = simpleReg.getIntercept();
170
196
 
171
- for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
172
- double y = a * x + b;
173
-
174
- cu.add(x, y);
197
+ for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
198
+ double y = a * x + b;
199
+
200
+ cu.add(x, y);
201
+ }
202
+ XYSeriesCollection series = new XYSeriesCollection();
203
+ series.addSeries(cu);
204
+ return series;
175
205
  }
176
- XYSeriesCollection series = new XYSeriesCollection();
177
- series.addSeries(cu);
178
- return series;
179
206
  }
180
207
  }
181
208
  // コルモゴルフ・スミルノフ検定
182
- private static class KSPlot implements ChartPlot {
183
- public JFreeChart createChart(String dname, double[] xi) {
184
- NumberAxis domainAxis = new NumberAxis("標準正規分布");
209
+ private static class KSChartPlot implements ChartPlot {
210
+ public JFreeChart createChart(String title, String dname, double[] xi) {
211
+ /*--- 横軸 ---*/
212
+ NumberAxis domainAxis = new NumberAxis("期待値");
185
213
  XYPlot plot = createPlot(dname, xi);
186
214
 
187
- /*--- 横軸 ---*/
188
215
  plot.setDomainAxis(domainAxis);
189
216
  domainAxis.setLowerMargin(0.03);
190
217
  domainAxis.setUpperMargin(0.03);
191
- domainAxis.setLowerBound(-4);
192
- domainAxis.setUpperBound(4);
218
+ domainAxis.setLowerBound(ChartPlot.CLASS_MIN);
219
+ domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
193
220
 
194
221
  ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
195
- return new JFreeChart("コルモゴルフ・スミルノフ検定", plot);
222
+ return new JFreeChart(title, plot);
196
223
  }
197
224
  private XYPlot createPlot(String dname, double[] xi) {
198
- XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
199
- XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
200
- XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
201
-
202
- renderer0.setDefaultToolTipGenerator(toolTipGenerator);
203
- renderer0.setURLGenerator(null);
204
- renderer1.setDefaultToolTipGenerator(toolTipGenerator);
205
- renderer1.setURLGenerator(null);
206
-
207
- XYPlot plot = new XYPlot();
208
- plot.setOrientation(PlotOrientation.VERTICAL);
209
- plot.mapDatasetToRangeAxis(0,0);
210
- plot.mapDatasetToRangeAxis(1,0);
211
- plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
212
-
213
- /*--- 縦軸 ---*/
214
- NumberAxis valueAxis0 = new NumberAxis("確率");
215
- plot.setRangeAxis(valueAxis0);
216
- valueAxis0.setLowerBound(0);
217
- valueAxis0.setUpperBound(1);
218
- valueAxis0.setTickUnit(new NumberTickUnit(0.1));
219
- valueAxis0.setNumberFormatOverride(new DecimalFormat("0.0#"));
220
-
221
- plot.setRenderer(0, renderer0);
222
- plot.setDataset(0, createDataset0(dname, xi));
223
-
224
- plot.setRenderer(1, renderer1);
225
- plot.setDataset(1, createDataset1());
225
+ CreatePlot plotImpl = new KSPlot();
226
226
 
227
- return plot;
227
+ return plotImpl.createPlot(dname, xi);
228
228
  }
229
- private XYSeriesCollection createDataset0(String dname, double[] xi) {
230
- int n = xi.length;
231
- Arrays.sort(xi);
232
- DescriptiveStatistics stat = new DescriptiveStatistics();
233
- Arrays.stream(xi).forEach(stat::addValue);
234
- double m = stat.getMean(); // 平均
235
- double sd = stat.getStandardDeviation();// 標準偏差
236
- double sum = stat.getSum();
237
- double p = 0.0;
229
+ public static class KSPlot implements CreatePlot {
230
+ private DescriptiveStatistics stat = null;
231
+ public KSPlot() {
232
+ stat = new DescriptiveStatistics();
233
+ }
234
+ private double[][] createData(double[] xi) {
235
+ int n = xi.length;
236
+ Arrays.sort(xi);
237
+ Arrays.stream(xi).forEach(stat::addValue);
238
+ double m = stat.getMean(); // 平均
239
+ double sd = stat.getStandardDeviation();// 標準偏差
240
+ double sum = stat.getSum();
241
+ double[][] data = new double[n][2];
242
+ double p = 0.0;
243
+
244
+ for (int i = 0; i < n; i++) {
245
+ p += xi[i] / sum;
246
+ data[i][0] = (xi[i] - m) / sd;
247
+ data[i][1] = p;
248
+ }
249
+ return data;
250
+ }
251
+ public XYPlot createPlot(String dname, double[] xi) {
252
+ XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
253
+ XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
254
+ XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
255
+
256
+ renderer0.setDefaultToolTipGenerator(toolTipGenerator);
257
+ renderer0.setURLGenerator(null);
258
+ renderer1.setDefaultToolTipGenerator(toolTipGenerator);
259
+ renderer1.setURLGenerator(null);
260
+
261
+ XYPlot plot = new XYPlot();
262
+ plot.setOrientation(PlotOrientation.VERTICAL);
263
+ plot.mapDatasetToRangeAxis(0,0);
264
+ plot.mapDatasetToRangeAxis(1,0);
265
+ plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
266
+
267
+ /*--- 縦軸 ---*/
268
+ NumberAxis valueAxis0 = new NumberAxis("確率");
269
+ plot.setRangeAxis(valueAxis0);
270
+ valueAxis0.setLowerBound(0);
271
+ valueAxis0.setUpperBound(1);
272
+ valueAxis0.setTickUnit(new NumberTickUnit(0.1));
273
+ valueAxis0.setNumberFormatOverride(new DecimalFormat("0.0#"));
274
+
275
+ plot.setRenderer(0, renderer0);
276
+ plot.setDataset(0, createDataset0(dname, createData(xi)));
277
+
278
+ plot.setRenderer(1, renderer1);
279
+ plot.setDataset(1, createDataset1());
280
+
281
+ return plot;
282
+ }
283
+ private XYSeriesCollection createDataset0(String dname, double[][] data) {
284
+ XYSeries cu = new XYSeries(dname);
238
285
 
239
- XYSeries cu = new XYSeries(dname);
240
- for (int i = 0; i < n; i++) {
241
- double x = (xi[i] - m) / sd;
286
+ for (int i = 0; i < data.length; i++) {
287
+ cu.add(data[i][0], data[i][1]);
288
+ }
289
+ XYSeriesCollection series = new XYSeriesCollection();
242
290
 
243
- p += xi[i] / sum;
244
- cu.add(x, p);
291
+ series.addSeries(cu);
292
+ return series;
245
293
  }
246
- XYSeriesCollection series = new XYSeriesCollection();
294
+ private XYSeriesCollection createDataset1() {
295
+ NormalDistribution ndist = new NormalDistribution(0, 1);
296
+ XYSeries cu = new XYSeries("累積p");
247
297
 
248
- series.addSeries(cu);
249
- return series;
250
- }
251
- private XYSeriesCollection createDataset1() {
252
- NormalDistribution ndist = new NormalDistribution(0, 1);
253
- XYSeries cu = new XYSeries("累積p");
298
+ for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
299
+ double y = ndist.cumulativeProbability(x);
254
300
 
255
- for (double x = -4; x < 4; x += 0.01) {
256
- double y = ndist.cumulativeProbability(x);
301
+ cu.add(x, y);
302
+ }
303
+ XYSeriesCollection series = new XYSeriesCollection();
257
304
 
258
- cu.add(x, y);
305
+ series.addSeries(cu);
306
+ return series;
259
307
  }
260
- XYSeriesCollection series = new XYSeriesCollection();
308
+ }
309
+ }
310
+ // Q-QandKSplot
311
+ private static class QQKSChartPlot implements ChartPlot {
312
+ private CreatePlot plot0 = null;
313
+ private CreatePlot plot1 = null;
314
+ public QQKSChartPlot() {
315
+ plot0 = new QQChartPlot.QQPlot();
316
+ plot1 = new KSChartPlot.KSPlot();
317
+ }
318
+ public JFreeChart createChart(String title, String dname, double[] xi) {
319
+ XYPlot plot = createPlot(dname, xi);
320
+
321
+ /*--- 横軸 ---*/
322
+ NumberAxis domainAxis = (NumberAxis)plot.getDomainAxis();
323
+ domainAxis.setLabel("期待値");
324
+ domainAxis.setLowerMargin(0.03);
325
+ domainAxis.setUpperMargin(0.03);
326
+ domainAxis.setLowerBound(ChartPlot.CLASS_MIN);
327
+ domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
261
328
 
262
- series.addSeries(cu);
263
- return series;
329
+ ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
330
+ return new JFreeChart(title, plot);
264
331
  }
332
+ private XYPlot createPlot(String dname, double[] xi) {
333
+ CombinedDomainXYPlot plot = new CombinedDomainXYPlot();
334
+
335
+ plot.add(plot0.createPlot(dname, xi), 1);
336
+ plot.add(plot1.createPlot(dname, xi), 1);
337
+ return plot;
338
+ }
339
+
265
340
  }
341
+ // KS検定
266
342
  private static class KSTest {
267
343
  public boolean test(double[] xi) {
268
344
  double[] data = new double[xi.length];
@@ -298,14 +374,14 @@ public class Normality {
298
374
  public boolean test(double statistic, double a) {
299
375
  double ua_2 = ndist.inverseCumulativeProbability(1.0 - a / 2.0);
300
376
 
301
- return (Math.abs(statistic) > cnvb2tob2p(ua_2))
377
+ return (Math.abs(statistic) > calcNormStatic(ua_2))
302
378
  ? true : false;
303
379
  }
304
- private double cnvb2tob2p(double ua_2) {
380
+ private double calcNormStatic(double ua_2) {
305
381
  double el = (n + 1.0) * (n + 1.0) * (n + 3.0) * (n + 5.0); // 分子
306
382
  double den = 24 * n * (n - 2.0) * (n - 3.0); // 分母
307
383
  double b2p = Math.sqrt(el / den) *
308
- (long)(ua_2 + 3.0 / (2.0 * n) * (ua_2 * ua_2 * ua_2 - 3 * ua_2));
384
+ (ua_2 + 3.0 / (2.0 * n) * (ua_2 * ua_2 * ua_2 - 3 * ua_2));
309
385
 
310
386
  return b2p;
311
387
  }
@@ -322,33 +398,43 @@ public class Normality {
322
398
 
323
399
  Arrays.stream(xi).forEach(stat::addValue);
324
400
  n = stat.getN();
325
-
326
401
  return stat.getKurtosis();
327
402
  }
328
403
  public boolean test(double statistic, double a) {
329
404
  boolean ret = false;
330
405
  double ua_2 = ndist.inverseCumulativeProbability(1.0 - a / 2.0);
331
- double b2p = cnvb2tob2p(statistic);
332
406
 
333
407
  double r_val = ua_2 + Math.sqrt(6.0 / n) * (ua_2 * ua_2 - 1.0);
334
408
  double l_val = -1.0 * ua_2 + Math.sqrt(6.0 / n) * (ua_2 * ua_2 - 1.0);
335
409
 
336
- if (b2p > r_val) {
410
+ if (statistic > r_val) {
337
411
  ret = true;
338
412
  }
339
- if (b2p < l_val) {
413
+ if (statistic < l_val) {
340
414
  ret = true;
341
415
  }
342
416
  return ret;
343
417
  }
344
- private double cnvb2tob2p(double b2) {
345
- double el = (n + 1.0) * (n + 1.0) * (n + 3.0) * (n + 5.0); // 分子
346
- double den = 24 * n * (n - 2.0) * (n - 3.0); // 分母
418
+ }
419
+ // オムニバス検定
420
+ private static class OmnibusTest implements DAgostinosTest {
421
+ private DAgostinosTest skewness = null;
422
+ private DAgostinosTest kurtosis = null;
423
+ public OmnibusTest() {
424
+ skewness = new SkewnessTest();
425
+ kurtosis = new KurtosisTest();
426
+ }
427
+ public double calcTestStatistic(double[] xi) {
428
+ double x1 = skewness.calcTestStatistic(xi);
429
+ double x2 = kurtosis.calcTestStatistic(xi);
347
430
 
348
- double b2p = Math.sqrt(el / den) *
349
- (long)(b2 - 3 * (n - 1.0) / (n + 3.0));
350
-
351
- return b2p;
431
+ return x1 * x1 + x2 * x2;
432
+ }
433
+ public boolean test(double statistic, double a) {
434
+ ChiSquaredDistribution chi2Dist = new ChiSquaredDistribution(2);
435
+ double p = chi2Dist.cumulativeProbability(statistic);
436
+
437
+ return (p < a) ? true : false;
352
438
  }
353
439
  }
354
440
  }
data/lib/num4normality.rb CHANGED
@@ -39,6 +39,9 @@ module Num4NormalityLib
39
39
  def ksplot(dname, xi)
40
40
  Normality.ksplot(dname, xi.to_java(Java::double))
41
41
  end
42
+ def qqksplot(dname, xi)
43
+ Normality.qqksplot(dname, xi.to_java(Java::double))
44
+ end
42
45
  # コルモゴルフ・スミルノフ検定(1標本)
43
46
  #
44
47
  # @overload kstest(xi)
@@ -76,6 +79,18 @@ module Num4NormalityLib
76
79
  def kurtosistest(xi)
77
80
  Normality.kurtosistest(xi.to_java(Java::double))
78
81
  end
82
+ # オムニバス検定
83
+ #
84
+ # @overload omnibustest(xi)
85
+ # @param [Array] xi データ(double[])
86
+ # @return [boolean] 検定結果(true:棄却域内 false:棄却域外)
87
+ # @example
88
+ # xi = [320, 240, 402, 325, 440, 286, 362, 281, 560, 212, 198, 209, 374]
89
+ # Num4NormalityLib.omnibustest(xi)
90
+ # => false
91
+ def omnibustest(xi)
92
+ Normality.omnibustest(xi.to_java(Java::double))
93
+ end
79
94
  end
80
95
  end
81
96
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: num4normality
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
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: 2023-12-18 00:00:00.000000000 Z
11
+ date: 2023-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake