num4normality 0.0.3-java → 0.0.6-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 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