num4normality 0.0.4-java → 0.0.7-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 +11 -0
- data/ext/num4normality/Normality.java +366 -153
- data/lib/num4normality.rb +45 -0
- 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: d445077e57757b20233ab78457bdd1b11a3b1851a8341ab7e28d778ef180d68d
|
4
|
+
data.tar.gz: 1e7b9c47b46bffbc4ae6dafa164b6f2b6d3c0707b6ad4478267740248b098498
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bb019e46c2b0deae1b6f2e2e5776926621620fd787903a3fec119bece63b04e64b979f3c5b3de08883a487fb6ec503d49f43c7acc229b1ab33134c24e5d1179
|
7
|
+
data.tar.gz: 8f60222acffc237d2961b909209182cdf9ef2e7fecad9248553be02853c9690cfeefef425f49a4ad5bdff5a0e733d3bd9a434b74b09ef934d94f2ac3f851345b
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,8 @@ 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;
|
8
|
+
import org.jfree.chart.plot.CombinedRangeXYPlot;
|
7
9
|
import org.jfree.chart.plot.XYPlot;
|
8
10
|
import org.jfree.chart.axis.NumberAxis;
|
9
11
|
import org.jfree.chart.axis.ValueAxis;
|
@@ -29,17 +31,36 @@ import java.text.DecimalFormat;
|
|
29
31
|
import org.apache.commons.math3.stat.inference.TestUtils;
|
30
32
|
public class Normality {
|
31
33
|
public static void qqplot(String dname, double[] xi) {
|
32
|
-
ChartPlot plot = new
|
33
|
-
JFreeChart chart = plot.createChart(dname, xi);
|
34
|
+
ChartPlot plot = new QQChartPlot();
|
35
|
+
JFreeChart chart = plot.createChart("正規Q-Qプロット", dname, xi);
|
34
36
|
|
35
37
|
plot.writeJPEG("qqplot.jpeg", chart, 800, 500);
|
36
38
|
}
|
37
39
|
public static void ksplot(String dname, double[] xi) {
|
38
|
-
ChartPlot plot = new
|
39
|
-
JFreeChart chart = plot.createChart(dname, xi);
|
40
|
+
ChartPlot plot = new KSChartPlot();
|
41
|
+
JFreeChart chart = plot.createChart("コルモゴルフ・スミルノフ検定", dname, xi);
|
40
42
|
|
41
43
|
plot.writeJPEG("ksplot.jpeg", chart, 800, 500);
|
42
44
|
|
45
|
+
}
|
46
|
+
public static void qqksplot(String dname, double[] xi) {
|
47
|
+
ChartPlot plot = new QQKSChartPlot();
|
48
|
+
JFreeChart chart = plot.createChart("Q-Q and コルモゴルフ・スミルノフ", dname, xi);
|
49
|
+
|
50
|
+
plot.writeJPEG("qqksplot.jpeg", chart, 1000, 800);
|
51
|
+
}
|
52
|
+
public static void ppplot(String dname, double[] xi) {
|
53
|
+
ChartPlot plot = new PPChartPlot();
|
54
|
+
JFreeChart chart = plot.createChart("正規P-Pプロット", dname, xi);
|
55
|
+
|
56
|
+
plot.writeJPEG("ppplot.jpeg", chart, 800, 500);
|
57
|
+
}
|
58
|
+
public static void ppksplot(String dname, double[] xi) {
|
59
|
+
ChartPlot plot = new PPKSChartPlot();
|
60
|
+
JFreeChart chart = plot.createChart("P-P and コルモゴルフ・スミルノフ", dname, xi);
|
61
|
+
|
62
|
+
plot.writeJPEG("ppksplot.jpeg", chart, 800, 500);
|
63
|
+
|
43
64
|
}
|
44
65
|
public static boolean kstest(double[] xi) {
|
45
66
|
KSTest ks = new KSTest();
|
@@ -65,13 +86,15 @@ public class Normality {
|
|
65
86
|
return daigo.test(x, 0.05);
|
66
87
|
}
|
67
88
|
|
68
|
-
|
89
|
+
/*********************************/
|
90
|
+
/* interface define */
|
91
|
+
/*********************************/
|
69
92
|
private interface ChartPlot {
|
70
93
|
/* フィールド */
|
71
94
|
static final double CLASS_MIN = -4.0;
|
72
95
|
static final double CLASS_MAX = 4.0;
|
73
96
|
/* メゾット */
|
74
|
-
JFreeChart createChart(String dname, double[] xi);
|
97
|
+
JFreeChart createChart(String title, String dname, double[] xi);
|
75
98
|
default void writeJPEG(String fname, JFreeChart chart, int width, int height) {
|
76
99
|
File file = new File(fname);
|
77
100
|
try {
|
@@ -81,195 +104,385 @@ public class Normality {
|
|
81
104
|
}
|
82
105
|
}
|
83
106
|
}
|
107
|
+
private interface CreatePlot {
|
108
|
+
XYPlot createPlot(String dname, double[] xi);
|
109
|
+
}
|
84
110
|
private interface DAgostinosTest {
|
85
111
|
double calcTestStatistic(double[] xi);
|
86
112
|
boolean test(double statistic, double a);
|
87
113
|
}
|
88
|
-
|
114
|
+
/*********************************/
|
115
|
+
/* Class define */
|
116
|
+
/*********************************/
|
89
117
|
// Q-Qplot
|
90
|
-
private static class
|
91
|
-
|
92
|
-
|
93
|
-
public QQPlot() {
|
94
|
-
stat = new DescriptiveStatistics();
|
95
|
-
ndist = new NormalDistribution(0, 1);
|
96
|
-
}
|
97
|
-
private double[][] createData(double[] xi) {
|
98
|
-
int n = xi.length;
|
99
|
-
Arrays.sort(xi);
|
100
|
-
Arrays.stream(xi).forEach(stat::addValue);
|
101
|
-
double sum = stat.getSum();
|
102
|
-
double[][] data = new double[n][2];
|
103
|
-
double p = 0.0;
|
104
|
-
|
105
|
-
for (int i = 0; i < n; i++) {
|
106
|
-
p += xi[i] / sum;
|
107
|
-
double x =
|
108
|
-
ndist.inverseCumulativeProbability(p * (i + 1.0) / (n + 1.0));
|
118
|
+
private static class QQChartPlot implements ChartPlot {
|
119
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
120
|
+
XYPlot plot = createPlot(dname, xi);
|
109
121
|
|
110
|
-
|
111
|
-
|
112
|
-
}
|
113
|
-
return data;
|
122
|
+
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
123
|
+
return new JFreeChart(title, plot);
|
114
124
|
}
|
115
|
-
|
116
|
-
|
125
|
+
private XYPlot createPlot(String dname, double[] xi) {
|
126
|
+
CreatePlot plotImpl = new QQPlot();
|
117
127
|
|
118
|
-
|
119
|
-
|
120
|
-
|
128
|
+
return plotImpl.createPlot(dname, xi);
|
129
|
+
}
|
130
|
+
public static class QQPlot implements CreatePlot {
|
131
|
+
private double[][] createData(double[] xi) {
|
132
|
+
DescriptiveStatistics stat = new DescriptiveStatistics();
|
133
|
+
NormalDistribution ndist = new NormalDistribution(0, 1);
|
134
|
+
|
135
|
+
int n = xi.length;
|
136
|
+
Arrays.sort(xi);
|
137
|
+
Arrays.stream(xi).forEach(stat::addValue);
|
138
|
+
double sum = stat.getSum();
|
139
|
+
double[][] data = new double[n][2];
|
140
|
+
double p = 0.0;
|
141
|
+
|
142
|
+
for (int i = 0; i < n; i++) {
|
143
|
+
p += xi[i] / sum;
|
144
|
+
double x =
|
145
|
+
ndist.inverseCumulativeProbability(p * (i + 1.0) / (n + 1.0));
|
146
|
+
|
147
|
+
data[i][0] = x;
|
148
|
+
data[i][1] = xi[i];
|
149
|
+
}
|
150
|
+
return data;
|
151
|
+
}
|
152
|
+
public XYPlot createPlot(String dname, double[] xi) {
|
153
|
+
double[][] data = createData(xi);
|
154
|
+
XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
|
155
|
+
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
156
|
+
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
157
|
+
|
158
|
+
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
159
|
+
renderer0.setURLGenerator(null);
|
160
|
+
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
161
|
+
renderer1.setURLGenerator(null);
|
162
|
+
|
163
|
+
XYPlot plot = new XYPlot();
|
164
|
+
plot.setOrientation(PlotOrientation.VERTICAL);
|
165
|
+
plot.mapDatasetToRangeAxis(0,0);
|
166
|
+
plot.mapDatasetToRangeAxis(1,0);
|
167
|
+
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
168
|
+
|
169
|
+
/*--- 横軸 ---*/
|
170
|
+
NumberAxis domainAxis = new NumberAxis("期待値");
|
171
|
+
|
172
|
+
plot.setDomainAxis(domainAxis);
|
173
|
+
domainAxis.setLowerMargin(0.03);
|
174
|
+
domainAxis.setUpperMargin(0.03);
|
175
|
+
domainAxis.setLowerBound(ChartPlot.CLASS_MIN);
|
176
|
+
domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
|
177
|
+
|
178
|
+
/*--- 縦軸 ---*/
|
179
|
+
NumberAxis valueAxis0 = new NumberAxis("観測値");
|
180
|
+
plot.setRangeAxis(valueAxis0);
|
181
|
+
|
182
|
+
plot.setRenderer(0, renderer0);
|
183
|
+
plot.setDataset(0, createDataset0(dname, data));
|
184
|
+
|
185
|
+
plot.setRenderer(1, renderer1);
|
186
|
+
plot.setDataset(1, createDataset1(data));
|
187
|
+
|
188
|
+
return plot;
|
189
|
+
}
|
190
|
+
private XYSeriesCollection createDataset0(String dname, double[][] data) {
|
191
|
+
XYSeries cu = new XYSeries(dname);
|
192
|
+
|
193
|
+
for (int i = 0; i < data.length; i++) {
|
194
|
+
cu.add(data[i][0], data[i][1]);
|
195
|
+
}
|
196
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
121
197
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
198
|
+
series.addSeries(cu);
|
199
|
+
return series;
|
200
|
+
}
|
201
|
+
private XYSeriesCollection createDataset1(double[][] data) {
|
202
|
+
SimpleRegression simpleReg = new SimpleRegression(true);
|
203
|
+
XYSeries cu = new XYSeries("累積");
|
127
204
|
|
205
|
+
simpleReg.addData(data);
|
206
|
+
double a = simpleReg.getSlope();
|
207
|
+
double b = simpleReg.getIntercept();
|
208
|
+
|
209
|
+
for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
|
210
|
+
double y = a * x + b;
|
211
|
+
|
212
|
+
cu.add(x, y);
|
213
|
+
}
|
214
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
215
|
+
series.addSeries(cu);
|
216
|
+
return series;
|
217
|
+
}
|
218
|
+
}
|
219
|
+
}
|
220
|
+
// コルモゴルフ・スミルノフ検定
|
221
|
+
private static class KSChartPlot implements ChartPlot {
|
222
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
223
|
+
XYPlot plot = createPlot(dname, xi);
|
224
|
+
|
128
225
|
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
129
|
-
return new JFreeChart(
|
226
|
+
return new JFreeChart(title, plot);
|
130
227
|
}
|
131
|
-
private XYPlot createPlot(String dname, double[]
|
132
|
-
|
133
|
-
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
134
|
-
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
135
|
-
|
136
|
-
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
137
|
-
renderer0.setURLGenerator(null);
|
138
|
-
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
139
|
-
renderer1.setURLGenerator(null);
|
140
|
-
|
141
|
-
XYPlot plot = new XYPlot();
|
142
|
-
plot.setOrientation(PlotOrientation.VERTICAL);
|
143
|
-
plot.mapDatasetToRangeAxis(0,0);
|
144
|
-
plot.mapDatasetToRangeAxis(1,0);
|
145
|
-
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
146
|
-
|
147
|
-
/*--- 縦軸 ---*/
|
148
|
-
NumberAxis valueAxis0 = new NumberAxis("観測値");
|
149
|
-
plot.setRangeAxis(valueAxis0);
|
228
|
+
private XYPlot createPlot(String dname, double[] xi) {
|
229
|
+
CreatePlot plotImpl = new KSPlot();
|
150
230
|
|
151
|
-
|
152
|
-
|
231
|
+
return plotImpl.createPlot(dname, xi);
|
232
|
+
}
|
233
|
+
public static class KSPlot implements CreatePlot {
|
234
|
+
private double[][] createData(double[] xi) {
|
235
|
+
DescriptiveStatistics stat = new DescriptiveStatistics();
|
236
|
+
|
237
|
+
int n = xi.length;
|
238
|
+
Arrays.sort(xi);
|
239
|
+
Arrays.stream(xi).forEach(stat::addValue);
|
240
|
+
double m = stat.getMean(); // 平均
|
241
|
+
double sd = stat.getStandardDeviation();// 標準偏差
|
242
|
+
double sum = stat.getSum();
|
243
|
+
double[][] data = new double[n][2];
|
244
|
+
double p = 0.0;
|
245
|
+
|
246
|
+
for (int i = 0; i < n; i++) {
|
247
|
+
p += xi[i] / sum;
|
248
|
+
data[i][0] = (xi[i] - m) / sd;
|
249
|
+
data[i][1] = p;
|
250
|
+
}
|
251
|
+
return data;
|
252
|
+
}
|
253
|
+
public XYPlot createPlot(String dname, double[] xi) {
|
254
|
+
XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
|
255
|
+
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
256
|
+
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
257
|
+
|
258
|
+
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
259
|
+
renderer0.setURLGenerator(null);
|
260
|
+
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
261
|
+
renderer1.setURLGenerator(null);
|
262
|
+
|
263
|
+
XYPlot plot = new XYPlot();
|
264
|
+
plot.setOrientation(PlotOrientation.VERTICAL);
|
265
|
+
plot.mapDatasetToRangeAxis(0,0);
|
266
|
+
plot.mapDatasetToRangeAxis(1,0);
|
267
|
+
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
268
|
+
|
269
|
+
/*--- 横軸 ---*/
|
270
|
+
NumberAxis domainAxis = new NumberAxis("期待値");
|
271
|
+
plot.setDomainAxis(domainAxis);
|
272
|
+
|
273
|
+
domainAxis.setLowerMargin(0.03);
|
274
|
+
domainAxis.setUpperMargin(0.03);
|
275
|
+
domainAxis.setLowerBound(ChartPlot.CLASS_MIN);
|
276
|
+
domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
|
277
|
+
|
278
|
+
/*--- 縦軸 ---*/
|
279
|
+
NumberAxis valueAxis0 = new NumberAxis("確率");
|
280
|
+
plot.setRangeAxis(valueAxis0);
|
281
|
+
valueAxis0.setLowerBound(0);
|
282
|
+
valueAxis0.setUpperBound(1);
|
283
|
+
valueAxis0.setTickUnit(new NumberTickUnit(0.1));
|
284
|
+
valueAxis0.setNumberFormatOverride(new DecimalFormat("0.0#"));
|
285
|
+
|
286
|
+
plot.setRenderer(0, renderer0);
|
287
|
+
plot.setDataset(0, createDataset0(dname, createData(xi)));
|
288
|
+
|
289
|
+
plot.setRenderer(1, renderer1);
|
290
|
+
plot.setDataset(1, createDataset1());
|
291
|
+
|
292
|
+
return plot;
|
293
|
+
}
|
294
|
+
private XYSeriesCollection createDataset0(String dname, double[][] data) {
|
295
|
+
XYSeries cu = new XYSeries(dname);
|
153
296
|
|
154
|
-
|
155
|
-
|
297
|
+
for (int i = 0; i < data.length; i++) {
|
298
|
+
cu.add(data[i][0], data[i][1]);
|
299
|
+
}
|
300
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
156
301
|
|
157
|
-
|
158
|
-
|
159
|
-
private XYSeriesCollection createDataset0(String dname, double[][] data) {
|
160
|
-
XYSeries cu = new XYSeries(dname);
|
161
|
-
|
162
|
-
for (int i = 0; i < data.length; i++) {
|
163
|
-
cu.add(data[i][0], data[i][1]);
|
302
|
+
series.addSeries(cu);
|
303
|
+
return series;
|
164
304
|
}
|
165
|
-
XYSeriesCollection
|
305
|
+
private XYSeriesCollection createDataset1() {
|
306
|
+
NormalDistribution ndist = new NormalDistribution(0, 1);
|
307
|
+
XYSeries cu = new XYSeries("累積p");
|
166
308
|
|
167
|
-
|
168
|
-
|
169
|
-
}
|
170
|
-
private XYSeriesCollection createDataset1(double[][] data) {
|
171
|
-
SimpleRegression simpleReg = new SimpleRegression(true);
|
172
|
-
XYSeries cu = new XYSeries("累積");
|
309
|
+
for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
|
310
|
+
double y = ndist.cumulativeProbability(x);
|
173
311
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
|
179
|
-
double y = a * x + b;
|
312
|
+
cu.add(x, y);
|
313
|
+
}
|
314
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
180
315
|
|
181
|
-
|
316
|
+
series.addSeries(cu);
|
317
|
+
return series;
|
182
318
|
}
|
183
|
-
XYSeriesCollection series = new XYSeriesCollection();
|
184
|
-
series.addSeries(cu);
|
185
|
-
return series;
|
186
319
|
}
|
187
320
|
}
|
188
|
-
//
|
189
|
-
private static class
|
190
|
-
|
191
|
-
|
321
|
+
// Q-Q and KSplot
|
322
|
+
private static class QQKSChartPlot implements ChartPlot {
|
323
|
+
private CreatePlot plot0 = new QQChartPlot.QQPlot();
|
324
|
+
private CreatePlot plot1 = new KSChartPlot.KSPlot();
|
325
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
192
326
|
XYPlot plot = createPlot(dname, xi);
|
193
|
-
|
194
|
-
/*--- 横軸 ---*/
|
195
|
-
plot.setDomainAxis(domainAxis);
|
196
|
-
domainAxis.setLowerMargin(0.03);
|
197
|
-
domainAxis.setUpperMargin(0.03);
|
198
|
-
domainAxis.setLowerBound(-4);
|
199
|
-
domainAxis.setUpperBound(4);
|
200
327
|
|
201
328
|
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
202
|
-
return new JFreeChart(
|
329
|
+
return new JFreeChart(title, plot);
|
203
330
|
}
|
204
331
|
private XYPlot createPlot(String dname, double[] xi) {
|
205
|
-
|
206
|
-
|
207
|
-
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
208
|
-
|
209
|
-
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
210
|
-
renderer0.setURLGenerator(null);
|
211
|
-
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
212
|
-
renderer1.setURLGenerator(null);
|
332
|
+
/*--- 横軸 ---*/
|
333
|
+
NumberAxis domainAxis = new NumberAxis("期待値");
|
213
334
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
335
|
+
CombinedDomainXYPlot plot = new CombinedDomainXYPlot(domainAxis);
|
336
|
+
domainAxis.setLabel("期待値");
|
337
|
+
domainAxis.setLowerMargin(0.03);
|
338
|
+
domainAxis.setUpperMargin(0.03);
|
339
|
+
domainAxis.setLowerBound(ChartPlot.CLASS_MIN);
|
340
|
+
domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
|
219
341
|
|
220
|
-
|
221
|
-
|
222
|
-
plot
|
223
|
-
|
224
|
-
valueAxis0.setUpperBound(1);
|
225
|
-
valueAxis0.setTickUnit(new NumberTickUnit(0.1));
|
226
|
-
valueAxis0.setNumberFormatOverride(new DecimalFormat("0.0#"));
|
342
|
+
plot.add(plot0.createPlot(dname, xi), 1);
|
343
|
+
plot.add(plot1.createPlot(dname, xi), 1);
|
344
|
+
return plot;
|
345
|
+
}
|
227
346
|
|
228
|
-
|
229
|
-
|
347
|
+
}
|
348
|
+
// P-Pplot
|
349
|
+
private static class PPChartPlot implements ChartPlot {
|
350
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
351
|
+
XYPlot plot = createPlot(dname, xi);
|
230
352
|
|
231
|
-
|
232
|
-
|
353
|
+
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
354
|
+
return new JFreeChart(title, plot);
|
355
|
+
}
|
356
|
+
private XYPlot createPlot(String dname, double[] xi) {
|
357
|
+
CreatePlot plotImpl = new PPPlot();
|
233
358
|
|
234
|
-
return
|
359
|
+
return plotImpl.createPlot(dname, xi);
|
235
360
|
}
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
361
|
+
public static class PPPlot implements CreatePlot {
|
362
|
+
private double[][] createData(double[] xi) {
|
363
|
+
DescriptiveStatistics stat = new DescriptiveStatistics();
|
364
|
+
NormalDistribution ndist = new NormalDistribution(0, 1);
|
365
|
+
|
366
|
+
int n = xi.length;
|
367
|
+
Arrays.sort(xi);
|
368
|
+
Arrays.stream(xi).forEach(stat::addValue);
|
369
|
+
double m = stat.getMean(); // 平均
|
370
|
+
double sd = stat.getStandardDeviation();// 標準偏差
|
371
|
+
double sum = stat.getSum();
|
372
|
+
double[][] data = new double[n][2];
|
373
|
+
double p = 0.0;
|
374
|
+
|
375
|
+
for (int i = 0; i < n; i++) {
|
376
|
+
p += xi[i] / sum;
|
377
|
+
double x = (xi[i] - m) / sd;
|
378
|
+
|
379
|
+
ndist.cumulativeProbability(x);
|
380
|
+
data[i][0] = ndist.cumulativeProbability(x);
|
381
|
+
data[i][1] = p;
|
382
|
+
}
|
383
|
+
return data;
|
384
|
+
}
|
385
|
+
public XYPlot createPlot(String dname, double[] xi) {
|
386
|
+
double[][] data = createData(xi);
|
387
|
+
XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
|
388
|
+
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
389
|
+
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
390
|
+
|
391
|
+
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
392
|
+
renderer0.setURLGenerator(null);
|
393
|
+
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
394
|
+
renderer1.setURLGenerator(null);
|
395
|
+
|
396
|
+
XYPlot plot = new XYPlot();
|
397
|
+
plot.setOrientation(PlotOrientation.VERTICAL);
|
398
|
+
plot.mapDatasetToRangeAxis(0,0);
|
399
|
+
plot.mapDatasetToRangeAxis(1,0);
|
400
|
+
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
401
|
+
|
402
|
+
/*--- 横軸 ---*/
|
403
|
+
NumberAxis domainAxis = new NumberAxis("観測累積確率");
|
404
|
+
|
405
|
+
plot.setDomainAxis(0, domainAxis);
|
406
|
+
domainAxis.setLowerMargin(0.03);
|
407
|
+
domainAxis.setUpperMargin(0.03);
|
408
|
+
domainAxis.setLowerBound(0.0);
|
409
|
+
domainAxis.setUpperBound(1.0);
|
410
|
+
domainAxis.setTickUnit(new NumberTickUnit(0.1));
|
411
|
+
domainAxis.setNumberFormatOverride(new DecimalFormat("0.0#"));
|
412
|
+
/*--- 縦軸 ---*/
|
413
|
+
NumberAxis valueAxis0 = new NumberAxis("予測累積確率");
|
414
|
+
plot.setRangeAxis(valueAxis0);
|
415
|
+
valueAxis0.setLowerBound(0);
|
416
|
+
valueAxis0.setUpperBound(1);
|
417
|
+
valueAxis0.setTickUnit(new NumberTickUnit(0.1));
|
418
|
+
valueAxis0.setNumberFormatOverride(new DecimalFormat("0.0#"));
|
419
|
+
|
420
|
+
plot.setRenderer(0, renderer0);
|
421
|
+
plot.setDataset(0, createDataset0(dname, data));
|
422
|
+
|
423
|
+
plot.setRenderer(1, renderer1);
|
424
|
+
plot.setDataset(1, createDataset1(data));
|
425
|
+
return plot;
|
426
|
+
}
|
427
|
+
private XYSeriesCollection createDataset0(String dname, double[][] data) {
|
428
|
+
XYSeries cu = new XYSeries(dname);
|
245
429
|
|
246
|
-
|
247
|
-
|
248
|
-
|
430
|
+
for (int i = 0; i < data.length; i++) {
|
431
|
+
cu.add(data[i][0], data[i][1]);
|
432
|
+
}
|
433
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
249
434
|
|
250
|
-
|
251
|
-
|
435
|
+
series.addSeries(cu);
|
436
|
+
return series;
|
252
437
|
}
|
253
|
-
XYSeriesCollection
|
438
|
+
private XYSeriesCollection createDataset1(double[][] data) {
|
439
|
+
SimpleRegression simpleReg = new SimpleRegression(true);
|
440
|
+
XYSeries cu = new XYSeries("累積");
|
254
441
|
|
255
|
-
|
256
|
-
|
442
|
+
simpleReg.addData(data);
|
443
|
+
double a = simpleReg.getSlope();
|
444
|
+
double b = simpleReg.getIntercept();
|
445
|
+
|
446
|
+
for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
|
447
|
+
double y = a * x + b;
|
448
|
+
|
449
|
+
cu.add(x, y);
|
450
|
+
}
|
451
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
452
|
+
series.addSeries(cu);
|
453
|
+
return series;
|
454
|
+
}
|
455
|
+
|
257
456
|
}
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
457
|
+
}
|
458
|
+
// P-P and KSplot
|
459
|
+
private static class PPKSChartPlot implements ChartPlot {
|
460
|
+
private CreatePlot plot0 = new PPChartPlot.PPPlot();
|
461
|
+
private CreatePlot plot1 = new KSChartPlot.KSPlot();
|
462
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
463
|
+
XYPlot plot = createPlot(dname, xi);
|
264
464
|
|
265
|
-
|
266
|
-
|
267
|
-
|
465
|
+
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
466
|
+
return new JFreeChart(title, plot);
|
467
|
+
}
|
468
|
+
private XYPlot createPlot(String dname, double[] xi) {
|
469
|
+
/*--- 縦軸 ---*/
|
470
|
+
NumberAxis rangeAxis = new NumberAxis("予測累積確率");
|
471
|
+
CombinedRangeXYPlot plot = new CombinedRangeXYPlot(rangeAxis);
|
472
|
+
rangeAxis.setLowerMargin(0.03);
|
473
|
+
rangeAxis.setUpperMargin(0.03);
|
474
|
+
rangeAxis.setLowerBound(0.0);
|
475
|
+
rangeAxis.setUpperBound(1.0);
|
476
|
+
rangeAxis.setTickUnit(new NumberTickUnit(0.1));
|
477
|
+
rangeAxis.setNumberFormatOverride(new DecimalFormat("0.0#"));
|
478
|
+
|
479
|
+
plot.add(plot0.createPlot(dname, xi), 2);
|
480
|
+
plot.add(plot1.createPlot(dname, xi), 3);
|
268
481
|
|
269
|
-
|
270
|
-
return series;
|
482
|
+
return plot;
|
271
483
|
}
|
272
484
|
}
|
485
|
+
// KS検定
|
273
486
|
private static class KSTest {
|
274
487
|
public boolean test(double[] xi) {
|
275
488
|
double[] data = new double[xi.length];
|
data/lib/num4normality.rb
CHANGED
@@ -39,6 +39,51 @@ module Num4NormalityLib
|
|
39
39
|
def ksplot(dname, xi)
|
40
40
|
Normality.ksplot(dname, xi.to_java(Java::double))
|
41
41
|
end
|
42
|
+
# Q-Q and コルモゴルフ・スミルノフ検定プロット(1標本)
|
43
|
+
#
|
44
|
+
# @overload qqksplot(dname, xi)
|
45
|
+
# @param [String] dname データ名
|
46
|
+
# @param [Array] xi データ(double[])
|
47
|
+
# @return [void] qqksplot.jpegファイルを出力
|
48
|
+
# @example
|
49
|
+
# xi = [320, 240, 402, 325, 440, 286, 362, 281, 560, 212, 198, 209, 374]
|
50
|
+
# Num4NormalityLib.qqksplot("LDH", xi)
|
51
|
+
# => qqksplot.jpeg
|
52
|
+
# @note
|
53
|
+
# グラフは、jfreechartを使用
|
54
|
+
def qqksplot(dname, xi)
|
55
|
+
Normality.qqksplot(dname, xi.to_java(Java::double))
|
56
|
+
end
|
57
|
+
# P-Pプロット
|
58
|
+
#
|
59
|
+
# @overload ppplot(dname, xi)
|
60
|
+
# @param [String] dname データ名
|
61
|
+
# @param [Array] xi データ(double[])
|
62
|
+
# @return [void] ppplot.jpegファイルを出力
|
63
|
+
# @example
|
64
|
+
# xi = [320, 240, 402, 325, 440, 286, 362, 281, 560, 212, 198, 209, 374]
|
65
|
+
# Num4NormalityLib.ppplot("LDH", xi)
|
66
|
+
# => ppplot.jpeg
|
67
|
+
# @note
|
68
|
+
# グラフは、jfreechartを使用
|
69
|
+
def ppplot(dname, xi)
|
70
|
+
Normality.ppplot(dname, xi.to_java(Java::double))
|
71
|
+
end
|
72
|
+
# P-P and コルモゴルフ・スミルノフ検定プロット(1標本)
|
73
|
+
#
|
74
|
+
# @overload ppksplot(dname, xi)
|
75
|
+
# @param [String] dname データ名
|
76
|
+
# @param [Array] xi データ(double[])
|
77
|
+
# @return [void] ppplot.jpegファイルを出力
|
78
|
+
# @example
|
79
|
+
# xi = [320, 240, 402, 325, 440, 286, 362, 281, 560, 212, 198, 209, 374]
|
80
|
+
# Num4NormalityLib.ppksplot("LDH", xi)
|
81
|
+
# => ppksplot.jpeg
|
82
|
+
# @note
|
83
|
+
# グラフは、jfreechartを使用
|
84
|
+
def ppksplot(dname, xi)
|
85
|
+
Normality.ppksplot(dname, xi.to_java(Java::double))
|
86
|
+
end
|
42
87
|
# コルモゴルフ・スミルノフ検定(1標本)
|
43
88
|
#
|
44
89
|
# @overload kstest(xi)
|
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.
|
4
|
+
version: 0.0.7
|
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-
|
11
|
+
date: 2023-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|