num4regana 0.0.3-java → 0.0.5-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: e3b63549f4e9c8d1779a21f7247bae8c034c4066e9907b53c76281c84c18c114
4
- data.tar.gz: 19bd91c1939a3055b03a5bf35b516e09f31360cdeb227baab648c5277f843de9
3
+ metadata.gz: a35c59c0d504b97992d42739340fb1370e5fd80fc547987bb4d0a138f628b284
4
+ data.tar.gz: fec825eed34dd9c230fed6065accc753e3539bd5af5bb9b8a697c1a3752c06c6
5
5
  SHA512:
6
- metadata.gz: ed0417b5fd2374d6ce4b3253484f532c40675fdf920e0bd7f10ec65e1c14ff7d1cf8be8fc748d9c68fe173613e67c4bcfa97235c43dbd4a9a65533a7a5fa38f1
7
- data.tar.gz: a630e9d0ea9b931542b439617f9b28b38f1b0ac6e857ae95538cb04da60407af0882bf2654ec444abcbe150109c5e40bfcaf372d8514f5f621eb9af23cdb13fc
6
+ metadata.gz: 10a7cbe03f96c05fc5995b696e6946fbc222d6b5a6b0f8b487cd5c50dfccca9d931d9312d5ab3589473b2589f6887885a142e6fcb467aa526499fb6812248368
7
+ data.tar.gz: 97009fb18fcb77dd771b6290eea892092710bf49d647e451cb720d94f2ead2a07826657b139e9842fc14d8c6b3aa3ac3fd938819bea090faa403bfe43384fb8e
data/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.0.5] - 2024-09-27
6
+
7
+ ### add
8
+ - add Bayesian models
9
+ - add Hierarchical Bayesian models
10
+
11
+ ## [0.0.4] - 2024-09-13
12
+
13
+ ### add
14
+ - add function of getAIC
15
+
5
16
  ## [0.0.3] - 2024-09-05
6
17
 
7
18
  ### add
@@ -0,0 +1,63 @@
1
+ import java.util.Arrays;
2
+
3
+ abstract class AbstractGLM {
4
+ private final double eta = 0.005;
5
+ abstract double regression(double[] b, double[] xi);
6
+ abstract double linkFunc(double q);
7
+ // 勾配降下法
8
+ protected double[] grand_metod(double[] yi, double[] b, double[][] xij) {
9
+ // 交差エントロピー計算
10
+ double[] ei = calcE(yi, b, xij);
11
+
12
+ // パラメータ更新
13
+ for(int i = 0; i < ei.length; i++) {
14
+ b[i] -= eta * ei[i];
15
+ }
16
+ return b;
17
+ }
18
+ // AIC
19
+ protected double calcAIC(double[] b, double[][] xij) {
20
+ // 尤度計算
21
+ double maxL = calcLogL(b,xij);
22
+ int k = 1 + xij[0].length;
23
+
24
+ return -2 * (maxL - k);
25
+ }
26
+ // 交差エントロピー計算
27
+ private double[] calcE(double[] yi, double[] b, double[][] xij) {
28
+ double[] xi = new double[b.length];
29
+ double[] ei = new double[b.length];
30
+
31
+ Arrays.fill(ei, 0.0);
32
+ for(int i = 0; i < yi.length; i++) {
33
+ xi[0] = 1.0;
34
+ System.arraycopy(xij[i], 0, xi, 1, xij[0].length);
35
+
36
+ double q = regression(b, xi);
37
+ double p = linkFunc(q);
38
+
39
+ for(int j = 0; j < xi.length; j++) {
40
+ ei[j] += (p - yi[i]) * xi[j];
41
+ }
42
+ }
43
+
44
+ return ei;
45
+ }
46
+ // 対数尤度計算(パラメータ)
47
+ private double calcLogL(double[] b, double[][] xij) {
48
+ double l = 0.0;
49
+ double[] xi = new double[b.length];
50
+
51
+ for(int i = 0; i < xij.length; i++) {
52
+ xi[0] = 1.0;
53
+ System.arraycopy(xij[i], 0, xi, 1, xij[0].length);
54
+
55
+ double q = regression(b, xi);
56
+ double p = linkFunc(q);
57
+
58
+ l += Math.log(p);
59
+ }
60
+ return l;
61
+ }
62
+ }
63
+
@@ -0,0 +1,127 @@
1
+ import java.util.Arrays;
2
+ import org.apache.commons.math3.distribution.BetaDistribution;
3
+ import org.apache.commons.math3.distribution.NormalDistribution;
4
+
5
+ abstract class AbstractGLMM {
6
+ private NormalDistribution nDist = new NormalDistribution(0,1);
7
+ abstract double regression(double[] b, double[] xi, double r);
8
+ abstract double linkFunc(double q);
9
+ // mcmc法
10
+ // (メトロポリス法,ギブスサンプリング)
11
+ protected double[] mcmcGS(double[] yi, double[] b, double[][] xij) {
12
+ BetaDistribution beDist = new BetaDistribution(50, 50);
13
+ BetaDistribution beDist2 = new BetaDistribution(1, 1); // 確率用
14
+ double[] newB = new double[b.length];
15
+ double oldL = 0.0;
16
+ double newL = 0.0;
17
+
18
+ for(int i = 0; i < b.length; i++) {
19
+ newB = Arrays.copyOf(b, b.length);
20
+ oldL = calcLx(b,xij);
21
+ newB[i] = beDist.sample();
22
+ newL = calcLx(newB,xij);
23
+
24
+ double r = newL / oldL;
25
+ if (r > 1.0) {
26
+ b[i] = newB[i];
27
+ }
28
+ else {
29
+ double r2 = beDist2.sample();
30
+
31
+ if (r2 < (1.0 - r)) {
32
+ b[i] = newB[i];
33
+ }
34
+ }
35
+ }
36
+ return b;
37
+ }
38
+ // BIC
39
+ protected double calcBIC(double[] b, double[][] xij) {
40
+ // 尤度計算
41
+ double maxL = calcLogLx(b,xij);
42
+ int k = 1 + xij[0].length;
43
+ int n = xij.length;
44
+
45
+ return -2 * maxL + k * Math.log(n);
46
+ }
47
+ // EMアルゴリズム
48
+ protected double[] mcmcEM(double[] yi, double[] b, double[][] xij) {
49
+ double[] newB = new double[b.length];
50
+
51
+ double[] bE = calcEStep(yi, b);
52
+ double[] bM = calcMStep(yi, bE, xij);
53
+
54
+ for(int i = 0; i < newB.length; i++) {
55
+ newB[i] = b[i] + bM[i];
56
+ }
57
+ return newB;
58
+ }
59
+ /* ------------------------------------------------------------------ */
60
+ // 尤度計算(パラメータ)
61
+ private double calcLx(double[] b, double[][] xij) {
62
+ double l = 1.0;
63
+ double[] xi = new double[b.length];
64
+
65
+ for(int i = 0; i < xij.length; i++) {
66
+ xi[0] = 1.0;
67
+ System.arraycopy(xij[i], 0, xi, 1, xij[0].length);
68
+ double q = regression(b, xi, nDist.sample());
69
+ double p = linkFunc(q);
70
+
71
+ l *= p;
72
+ }
73
+ return l;
74
+ }
75
+ // 対数尤度計算(パラメータ)
76
+ private double calcLogLx(double[] b, double[][] xij) {
77
+ double l = 0.0;
78
+ double[] xi = new double[b.length];
79
+
80
+ for(int i = 0; i < xij.length; i++) {
81
+ xi[0] = 1.0;
82
+ System.arraycopy(xij[i], 0, xi, 1, xij[0].length);
83
+ double q = regression(b, xi, nDist.sample());
84
+ double p = linkFunc(q);
85
+
86
+ l += Math.log(p);
87
+ }
88
+ return l;
89
+ }
90
+ // E-Step
91
+ // (自己エントロピー)
92
+ private double[] calcEStep(double[] yi, double[] b) {
93
+ double[] bh = new double[b.length];
94
+
95
+ Arrays.fill(bh, 0.0);
96
+ for(int j = 0; j < b.length; j++) {
97
+ for(int i = 0; i < yi.length; i++) {
98
+ double p = linkFunc(yi[i]);
99
+
100
+ bh[j] += p * Math.log(p);
101
+ }
102
+ bh[j] *= -1;
103
+ }
104
+ return bh;
105
+ }
106
+ // M-Step
107
+ // (KLダイバージェンス)
108
+ private double[] calcMStep(double[] yi, double[] b, double[][] xij) {
109
+ double[] xi = new double[b.length];
110
+ double[] ei = new double[b.length];
111
+
112
+ Arrays.fill(ei, 0.0);
113
+ for(int j = 0; j < b.length; j++) {
114
+ for(int i = 0; i < xij.length; i++) {
115
+ xi[0] = 1.0;
116
+ System.arraycopy(xij[i], 0, xi, 1, xij[0].length);
117
+
118
+ double q = linkFunc(yi[i]);
119
+ double p = linkFunc(regression(b, xi, 0));
120
+
121
+ ei[j] += q * (Math.log(q) - Math.log(p)) * xi[j];
122
+ }
123
+ }
124
+ return ei;
125
+ }
126
+ }
127
+
@@ -0,0 +1,85 @@
1
+ import java.util.Map;
2
+ import java.util.Arrays;
3
+ import org.apache.commons.math3.distribution.BetaDistribution;
4
+
5
+ public class LogitBayesRegAna extends AbstractGLMM {
6
+ private final int NUM = 1000;
7
+ private final int TIM = 3;
8
+ private static LogitBayesRegAna regana = new LogitBayesRegAna();
9
+ public static LogitBayesRegAna getInstance() {
10
+ return regana;
11
+ }
12
+ public LineReg nonLineRegAna(double[] yi, double xij[][]) {
13
+ double[] b = initB(xij[0].length);
14
+
15
+ for (int i = 0; i < NUM; i++) {
16
+ b = mcmcGS(yi, b, xij);
17
+ }
18
+
19
+ return new LineReg(b);
20
+ }
21
+ public double getBIC(Map<String, Object> regCoe, double[][] xij) {
22
+ double[] b = new double[1 + xij[0].length];
23
+
24
+ b[0] = (double)regCoe.get("intercept");
25
+ System.arraycopy(regCoe.get("slope"), 0, b, 1, xij[0].length);
26
+ return calcBIC(b, xij);
27
+ }
28
+ private double[] initB(int xsie) {
29
+ double[] b = new double[1 + xsie];
30
+ BetaDistribution beDist = new BetaDistribution(50, 50);
31
+
32
+ for(int i = 0; i < b.length; i++) {
33
+ b[i] = beDist.sample();
34
+ }
35
+ return b;
36
+ }
37
+ private double[] calcMeanBy(double[] yi, double[] b) {
38
+ double[] meanB = new double[b.length];
39
+
40
+ Arrays.fill(meanB, 0.0);
41
+ for(int i = 0; i < meanB.length; i++) {
42
+ for(int j = 0; j < yi.length; j++) {
43
+ meanB[i] += yi[j] * b[i];
44
+ }
45
+ }
46
+ return meanB;
47
+ }
48
+ // q = b0 + b1 * x0
49
+ double regression(double[] b, double[] xi, double r) {
50
+ double ret = 0.0;
51
+
52
+ for(int i = 0; i < xi.length; i++) {
53
+ ret += b[i] * xi[i];
54
+ }
55
+ return ret;
56
+ }
57
+ // p = 1 / (1 + exp( -q))
58
+ double linkFunc(double q) {
59
+ return 1.0 / (1.0 + Math.exp(-1.0 * q));
60
+ }
61
+ /*********************************/
62
+ /* interface define */
63
+ /*********************************/
64
+ /*********************************/
65
+ /* class define */
66
+ /*********************************/
67
+ public class LineReg {
68
+ private double a = 0.0;
69
+ private double[] b = null;
70
+ public LineReg(double[] b) {
71
+ this.a = b[0];
72
+ this.b = new double[b.length - 1];
73
+ for (int i = 0; i < this.b.length; i++) {
74
+ this.b[i] = b[i + 1];
75
+ }
76
+ }
77
+ public double getIntercept() {
78
+ return a;
79
+ }
80
+ public double[] getSlope() {
81
+ return b;
82
+ }
83
+ }
84
+ }
85
+
@@ -1,12 +1,45 @@
1
- public class LogitRegAna {
1
+ import java.util.Arrays;
2
+ import java.util.Map;
3
+
4
+ public class LogitRegAna extends AbstractGLM {
5
+ private final int NUM = 1000;
2
6
  private static LogitRegAna regana = new LogitRegAna();
3
7
  public static LogitRegAna getInstance() {
4
8
  return regana;
5
9
  }
6
10
  public LineReg nonLineRegAna(double[] yi, double xij[][]) {
7
- NonLineRegAna line = new NonLineRegAna();
11
+ double[] b = initB(xij[0].length);
12
+
13
+ for (int i = 0; i < NUM; i++) {
14
+ b = grand_metod(yi, b, xij);
15
+ }
16
+ return new LineReg(b);
17
+ }
18
+ public double getAIC(Map<String, Object> regCoe, double[][] xij) {
19
+ double[] b = new double[1 + xij[0].length];
8
20
 
9
- return line.nonLineRegAna(yi, xij);
21
+ b[0] = (double)regCoe.get("intercept");
22
+ System.arraycopy(regCoe.get("slope"), 0, b, 1, xij[0].length);
23
+ return calcAIC(b, xij);
24
+ }
25
+ private double[] initB(int xsie) {
26
+ double[] b = new double[1 + xsie];
27
+
28
+ Arrays.fill(b, 0.0);
29
+ return b;
30
+ }
31
+ // q = b0 + b1 * x0
32
+ double regression(double[] b, double[] xi) {
33
+ double ret = 0.0;
34
+
35
+ for(int i = 0; i < xi.length; i++) {
36
+ ret += b[i] * xi[i];
37
+ }
38
+ return ret;
39
+ }
40
+ // p = 1 / (1 + exp( -q))
41
+ double linkFunc(double q) {
42
+ return 1.0 / (1.0 + Math.exp(-1.0 * q));
10
43
  }
11
44
  /*********************************/
12
45
  /* interface define */
@@ -31,52 +64,5 @@ public class LogitRegAna {
31
64
  return b;
32
65
  }
33
66
  }
34
- private class NonLineRegAna {
35
- private final double eta = 0.001;
36
- private final int num = 10000;
37
- public LineReg nonLineRegAna(double[] yi, double[][] xij) {
38
- double[] b = new double[1 + xij[0].length];
39
-
40
- for(int i = 0; i < b.length; i++) {
41
- b[i] = 0.0;
42
- }
43
- for (int i = 0; i < num; i++) {
44
- b = grand_metod(yi, b, xij);
45
- }
46
- return new LineReg(b);
47
- }
48
- // q = b0 + b1 * x0
49
- private double rereion(double[] b, double[] xi) {
50
- double ret = b[0];
51
-
52
- for(int i = 0; i < xi.length; i++) {
53
- ret += b[i + 1] * xi[i];
54
- }
55
- return ret;
56
- }
57
- // p = 1 / (1 + exp( -q))
58
- private double sigmoid(double q) {
59
- return 1.0 / (1.0 + Math.exp(-1.0 * q));
60
- }
61
- private double[] grand_metod(double[] yi, double[] b, double[][] xij) {
62
- double e0 = 0.0;
63
- double[] en = new double[xij[0].length];
64
-
65
- for(int i = 0; i < yi.length; i++) {
66
- double q = rereion(b, xij[i]);
67
- double p = sigmoid(q);
68
-
69
- e0 += (yi[i] - p);
70
- for(int j = 0; j < en.length; j++) {
71
- en[j] += (yi[i] - p) * xij[i][j];
72
- }
73
- }
74
- b[0] = b[0] + eta * e0;
75
- for(int j = 0; j < en.length; j++) {
76
- b[1 + j] += eta * en[j];
77
- }
78
- return b;
79
- }
80
- }
81
67
  }
82
68
 
@@ -0,0 +1,74 @@
1
+ import java.util.Arrays;
2
+ import java.util.Map;
3
+ import org.apache.commons.math3.distribution.BetaDistribution;
4
+
5
+ public class PoissonBayesRegAna extends AbstractGLMM {
6
+ private final int NUM = 1000;
7
+ private final int TIM = 3;
8
+ private static PoissonBayesRegAna regana = new PoissonBayesRegAna();
9
+ public static PoissonBayesRegAna getInstance() {
10
+ return regana;
11
+ }
12
+ public LineReg nonLineRegAna(double[] yi, double xij[][]) {
13
+ double[] b = initB(xij[0].length);
14
+
15
+ for (int i = 0; i < NUM; i++) {
16
+ b = mcmcGS(yi, b, xij);
17
+ }
18
+ return new LineReg(b);
19
+ }
20
+ public double getBIC(Map<String, Object> regCoe, double[][] xij) {
21
+ double[] b = new double[1 + xij[0].length];
22
+
23
+ b[0] = (double)regCoe.get("intercept");
24
+ System.arraycopy(regCoe.get("slope"), 0, b, 1, xij[0].length);
25
+ return calcBIC(b, xij);
26
+ }
27
+ private double[] initB(int xsie) {
28
+ double[] b = new double[1 + xsie];
29
+ BetaDistribution beDist = new BetaDistribution(50, 50);
30
+
31
+ for(int i = 0; i < b.length; i++) {
32
+ b[i] = beDist.sample();
33
+ }
34
+ return b;
35
+ }
36
+ // q = b0 + b1 * x0
37
+ double regression(double[] b, double[] xi, double r) {
38
+ double ret = 0.0;
39
+
40
+ for(int i = 0; i < xi.length; i++) {
41
+ ret += b[i] * xi[i];
42
+ }
43
+ return ret;
44
+ }
45
+ // p = exp(q)
46
+ double linkFunc(double q) {
47
+ return Math.exp(q);
48
+ }
49
+ /*********************************/
50
+ /* interface define */
51
+ /*********************************/
52
+ /*********************************/
53
+ /* class define */
54
+ /*********************************/
55
+ public class LineReg {
56
+ private double a = 0.0;
57
+ private double[] b = null;
58
+ public LineReg(double[] b) {
59
+ this.a = b[0];
60
+ this.b = new double[b.length - 1];
61
+ for (int i = 0; i < this.b.length; i++) {
62
+ this.b[i] = b[i + 1];
63
+ }
64
+ }
65
+ public double getIntercept() {
66
+ return a;
67
+ }
68
+ public double[] getSlope() {
69
+ return b;
70
+ }
71
+ }
72
+
73
+ }
74
+
@@ -0,0 +1,65 @@
1
+ import java.util.Arrays;
2
+ import java.util.Map;
3
+ import org.apache.commons.math3.distribution.BetaDistribution;
4
+
5
+ public class PoissonHierBayesRegAna extends AbstractGLMM {
6
+ private final int NUM = 1000;
7
+ private static PoissonHierBayesRegAna regana = new PoissonHierBayesRegAna();
8
+ public static PoissonHierBayesRegAna getInstance() {
9
+ return regana;
10
+ }
11
+ public LineReg nonLineRegAna(double[] yi, double xij[][]) {
12
+ double[] b = initB(xij[0].length);
13
+
14
+ for (int i = 0; i < NUM; i++) {
15
+ b = mcmcGS(yi, b, xij);
16
+ }
17
+ return new LineReg(b);
18
+ }
19
+ private double[] initB(int xsie) {
20
+ double[] b = new double[1 + xsie];
21
+ BetaDistribution beDist = new BetaDistribution(50, 50);
22
+
23
+ for(int i = 0; i < b.length; i++) {
24
+ b[i] = beDist.sample();
25
+ }
26
+ return b;
27
+ }
28
+ // q = b0 + b1 * x0 + r
29
+ // (ランダム切片モデル)
30
+ double regression(double[] b, double[] xi, double r) {
31
+ double ret = 0.0;
32
+
33
+ for(int i = 0; i < xi.length; i++) {
34
+ ret += b[i] * xi[i];
35
+ }
36
+ return ret + r;
37
+ }
38
+ // p = exp(q)
39
+ double linkFunc(double q) {
40
+ return Math.exp(q);
41
+ }
42
+ /*********************************/
43
+ /* interface define */
44
+ /*********************************/
45
+ /*********************************/
46
+ /* class define */
47
+ /*********************************/
48
+ public class LineReg {
49
+ private double a = 0.0;
50
+ private double[] b = null;
51
+ public LineReg(double[] b) {
52
+ this.a = b[0];
53
+ this.b = new double[b.length - 1];
54
+ for (int i = 0; i < this.b.length; i++) {
55
+ this.b[i] = b[i + 1];
56
+ }
57
+ }
58
+ public double getIntercept() {
59
+ return a;
60
+ }
61
+ public double[] getSlope() {
62
+ return b;
63
+ }
64
+ }
65
+ }
@@ -1,12 +1,45 @@
1
- public class PoissonRegAna {
1
+ import java.util.Arrays;
2
+ import java.util.Map;
3
+
4
+ public class PoissonRegAna extends AbstractGLM {
5
+ private final int NUM = 1000;
2
6
  private static PoissonRegAna regana = new PoissonRegAna();
3
7
  public static PoissonRegAna getInstance() {
4
8
  return regana;
5
9
  }
6
10
  public LineReg nonLineRegAna(double[] yi, double[][] xij) {
7
- NonLineRegAna line = new NonLineRegAna();
11
+ double[] b = initB(xij[0].length);
12
+
13
+ for (int i = 0; i < NUM; i++) {
14
+ b = grand_metod(yi, b, xij);
15
+ }
16
+ return new LineReg(b);
17
+ }
18
+ public double getAIC(Map<String, Object> regCoe, double[][] xij) {
19
+ double[] b = new double[1 + xij[0].length];
20
+
21
+ b[0] = (double)regCoe.get("intercept");
22
+ System.arraycopy(regCoe.get("slope"), 0, b, 1, xij[0].length);
23
+ return calcAIC(b, xij);
24
+ }
25
+ private double[] initB(int xsie) {
26
+ double[] b = new double[1 + xsie];
27
+
28
+ Arrays.fill(b, 0.0);
29
+ return b;
30
+ }
31
+ // q = b0 + b1 * x0
32
+ double regression(double[] b, double[] xi) {
33
+ double ret = 0.0;
8
34
 
9
- return line.nonLineRegAna(yi, xij);
35
+ for(int i = 0; i < xi.length; i++) {
36
+ ret += b[i] * xi[i];
37
+ }
38
+ return ret;
39
+ }
40
+ // p = exp(q)
41
+ double linkFunc(double q) {
42
+ return Math.exp(q);
10
43
  }
11
44
  /*********************************/
12
45
  /* interface define */
@@ -31,52 +64,5 @@ public class PoissonRegAna {
31
64
  return b;
32
65
  }
33
66
  }
34
- private class NonLineRegAna {
35
- private final double eta = 0.005;
36
- private final int num = 1000;
37
- public LineReg nonLineRegAna(double[] yi, double[][] xij) {
38
- double[] b = new double[1 + xij[0].length];
39
-
40
- for(int i = 0; i < b.length; i++) {
41
- b[i] = 0.0;
42
- }
43
- for (int i = 0; i < num; i++) {
44
- b = grand_metod(yi, b, xij);
45
- }
46
-
47
- return new LineReg(b);
48
- }
49
- // q = b0 + b1 * x0
50
- private double rereion(double[] b, double[] xi) {
51
- double ret = b[0];
52
-
53
- for(int i = 0; i < xi.length; i++) {
54
- ret += b[i + 1] * xi[i];
55
- }
56
- return ret;
57
- }
58
- private double linkFunc(double q) {
59
- return Math.exp(q);
60
- }
61
- private double[] grand_metod(double[] yi, double[] b, double[][] xij) {
62
- double e0 = 0.0;
63
- double[] en = new double[xij[0].length];
64
-
65
- for(int i = 0; i < yi.length; i++) {
66
- double q = rereion(b, xij[i]);
67
- double p = linkFunc(q);
68
-
69
- e0 += (yi[i] - p);
70
- for(int j = 0; j < en.length; j++) {
71
- en[j] += (yi[i] - p) * xij[i][j];
72
- }
73
- }
74
- b[0] += eta * e0;
75
- for(int j = 0; j < en.length; j++) {
76
- b[1 + j] += eta * en[j];
77
- }
78
- return b;
79
- }
80
- }
81
67
  }
82
68
 
@@ -0,0 +1,71 @@
1
+ import java.util.Arrays;
2
+ import org.apache.commons.math3.distribution.NormalDistribution;
3
+ import java.util.Map;
4
+
5
+ public class ProBitRegAna extends AbstractGLM {
6
+ private final int NUM = 1000;
7
+ private static ProBitRegAna regana = new ProBitRegAna();
8
+ private NormalDistribution ndist = new NormalDistribution(0, 1);
9
+
10
+ public static ProBitRegAna getInstance() {
11
+ return regana;
12
+ }
13
+ public LineReg nonLineRegAna(double[] yi, double[][] xij) {
14
+ double[] b = initB(xij[0].length);
15
+
16
+ for (int i = 0; i < NUM; i++) {
17
+ b = grand_metod(yi, b, xij);
18
+ }
19
+ return new LineReg(b);
20
+ }
21
+ public double getAIC(Map<String, Object> regCoe, double[][] xij) {
22
+ double[] b = new double[1 + xij[0].length];
23
+
24
+ b[0] = (double)regCoe.get("intercept");
25
+ System.arraycopy(regCoe.get("slope"), 0, b, 1, xij[0].length);
26
+ return calcAIC(b, xij);
27
+ }
28
+ private double[] initB(int xsie) {
29
+ double[] b = new double[1 + xsie];
30
+
31
+ Arrays.fill(b, 0.0);
32
+ return b;
33
+ }
34
+ // q = b0 + b1 * x0
35
+ double regression(double[] b, double[] xi) {
36
+ double ret = 0.0;
37
+
38
+ for(int i = 0; i < xi.length; i++) {
39
+ ret += b[i] * xi[i];
40
+ }
41
+ return ret;
42
+ }
43
+ //
44
+ double linkFunc(double q) {
45
+ return ndist.cumulativeProbability(q);
46
+ }
47
+ /*********************************/
48
+ /* interface define */
49
+ /*********************************/
50
+ /*********************************/
51
+ /* class define */
52
+ /*********************************/
53
+ public class LineReg {
54
+ private double a = 0.0;
55
+ private double[] b = null;
56
+ public LineReg(double[] b) {
57
+ this.a = b[0];
58
+ this.b = new double[b.length - 1];
59
+ for (int i = 0; i < this.b.length; i++) {
60
+ this.b[i] = b[i + 1];
61
+ }
62
+ }
63
+ public double getIntercept() {
64
+ return a;
65
+ }
66
+ public double[] getSlope() {
67
+ return b;
68
+ }
69
+ }
70
+ }
71
+
@@ -0,0 +1,180 @@
1
+ require 'java'
2
+ require 'num4regana.jar'
3
+ require 'commons-math3-3.6.1.jar'
4
+
5
+ java_import 'LogitBayesRegAna'
6
+ java_import 'PoissonBayesRegAna'
7
+ java_import 'java.util.HashMap'
8
+
9
+ # 一般化線形混合モデル
10
+ # (Apache commoms math3使用)
11
+ module Num4GLMMRegAnaLib
12
+ # (2項)ベイズロジスティック回帰分析
13
+ class LogitBayesRegAnaLib
14
+ def initialize
15
+ @multana = LogitBayesRegAna.getInstance()
16
+ end
17
+ # (2項)ベイズロジスティック回帰分析
18
+ #
19
+ # @overload non_line_reg_ana(yi, xij)
20
+ # @param [Array] yi yの値(double[])
21
+ # @param [Array] xij xの値(double[][])
22
+ # @return [Hash] (intercept:定数項 slope:回帰係数)
23
+ # @example
24
+ # glsyi = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
25
+ # glsxij = [
26
+ # [1, 24],
27
+ # [1, 18],
28
+ # [0, 15],
29
+ # [1, 16],
30
+ # [0, 10],
31
+ # [1, 26],
32
+ # [1, 2],
33
+ # [0, 24],
34
+ # [1, 18],
35
+ # [1, 22],
36
+ # [1, 3],
37
+ # [1, 6],
38
+ # [0, 15],
39
+ # [0, 12],
40
+ # [1, 6],
41
+ # [0, 6],
42
+ # [1, 12],
43
+ # [0, 12],
44
+ # [1, 18],
45
+ # [1, 3],
46
+ # [1, 8],
47
+ # [0, 9],
48
+ # [0, 12],
49
+ # [0, 6],
50
+ # [0, 8],
51
+ # [1, 12],
52
+ # ]
53
+ # regana = Num4GLMMRegAnaLib::LogitBayesRegAnaLib.new
54
+ # regana.non_line_reg_ana(glsyi, glsxij)
55
+ # =>
56
+ # {
57
+ # :intercept=>0.5742886218005325, # 定数項
58
+ # # 回帰係数
59
+ # :slope=>[0.5517212822536828, 0.5748054561700319]
60
+ # }
61
+ def non_line_reg_ana(yi, xij)
62
+ multRet = @multana.nonLineRegAna(yi.to_java(Java::double), xij.to_java(Java::double[]))
63
+ retRb = {
64
+ "intercept": multRet.getIntercept(), # 定数項
65
+ "slope": multRet.getSlope().to_a, # 回帰係数
66
+ }
67
+ return retRb
68
+ end
69
+ # BIC
70
+ #
71
+ # @overload get_bic(regcoe, xij)
72
+ # @param [Hash] regcoe 回帰係数(intercept:定数項 slope:回帰係数)
73
+ # @param [Array] xij xの値(double[][])
74
+ # @return double AIC値
75
+ # @example
76
+ # reg = {
77
+ # :intercept=> -6.2313, # 定数項
78
+ # :slope=> [2.5995, 0.1652], # 回帰係数
79
+ # }
80
+ # xij = [
81
+ # [1, 24],
82
+ # [1, 18],
83
+ # [0, 15],
84
+ # [1, 16],
85
+ # [0, 10],
86
+ # [1, 26],
87
+ # [1, 2],
88
+ # [0, 24],
89
+ # [1, 18],
90
+ # [1, 22],
91
+ # [1, 3],
92
+ # [1, 6],
93
+ # [0, 15],
94
+ # [0, 12],
95
+ # [1, 6],
96
+ # [0, 6],
97
+ # [1, 12],
98
+ # [0, 12],
99
+ # [1, 18],
100
+ # [1, 3],
101
+ # [1, 8],
102
+ # [0, 9],
103
+ # [0, 12],
104
+ # [0, 6],
105
+ # [0, 8],
106
+ # [1, 12],
107
+ # ]
108
+ # regana = Num4GLMMRegAnaLib::LogitBayesRegAnaLib.new
109
+ # regana.get_bic(reg, xij)
110
+ # => 159.386
111
+ def get_bic(regcoe, xij)
112
+ o = HashMap.new
113
+ o["intercept"] = regcoe[:intercept]
114
+ o["slope"] = regcoe[:slope].to_java(Java::double)
115
+ @multana.getBIC(o, xij.to_java(Java::double[]))
116
+ end
117
+ end
118
+ # ベイズポアソン回帰分析
119
+ class PoissonBayesRegAnaLib
120
+ def initialize
121
+ @multana = PoissonBayesRegAna.getInstance()
122
+ end
123
+ # ベイズポアソン回帰分析
124
+ #
125
+ # @overload non_line_reg_ana(yi, xij)
126
+ # @param [Array] yi yの値(double[])
127
+ # @param [Array] xij xの値(double[][])
128
+ # @return [Hash] (intercept:定数項 slope:回帰係数)
129
+ # @example
130
+ # glsyi = [4, 10, 7, 14]
131
+ # glsxij = [
132
+ # [1],
133
+ # [2],
134
+ # [3],
135
+ # [4],
136
+ # ]
137
+ # regana = Num4GLMMRegAnaLib::PoissonBayesRegAnaLib.new
138
+ # regana.non_line_reg_ana(glsyi, glsxij)
139
+ # =>
140
+ # {
141
+ # :intercept=>0.4341885635221602, # 定数項
142
+ # :slope=>[0.5703137378188881] # 回帰係数
143
+ # }
144
+ def non_line_reg_ana(yi, xij)
145
+ multRet = @multana.nonLineRegAna(yi.to_java(Java::double), xij.to_java(Java::double[]))
146
+ retRb = {
147
+ "intercept": multRet.getIntercept(), # 定数項
148
+ "slope": multRet.getSlope().to_a, # 回帰係数
149
+ }
150
+ return retRb
151
+ end
152
+ # BIC
153
+ #
154
+ # @overload get_bic(regcoe, xij)
155
+ # @param [Hash] regcoe 回帰係数(intercept:定数項 slope:回帰係数)
156
+ # @param [Array] xij xの値(double[][])
157
+ # @return double AIC値
158
+ # @example
159
+ # reg = {
160
+ # :intercept=>0.4341885635221602, # 定数項
161
+ # :slope=>[0.5703137378188881] # 回帰係数
162
+ # }
163
+ # xij = [
164
+ # [1],
165
+ # [2],
166
+ # [3],
167
+ # [4],
168
+ # ]
169
+ # regana = Num4GLMMRegAnaLib::BayesPoissonRegAnaLib.new
170
+ # regana.get_bic(reg, xij)
171
+ # => -13.157
172
+ def get_bic(regcoe, xij)
173
+ o = HashMap.new
174
+ o["intercept"] = regcoe[:intercept]
175
+ o["slope"] = regcoe[:slope].to_java(Java::double)
176
+ @multana.getBIC(o, xij.to_java(Java::double[]))
177
+ end
178
+ end
179
+ end
180
+
data/lib/num4glmregana.rb CHANGED
@@ -4,6 +4,8 @@ require 'commons-math3-3.6.1.jar'
4
4
 
5
5
  java_import 'LogitRegAna'
6
6
  java_import 'PoissonRegAna'
7
+ java_import 'ProBitRegAna'
8
+ java_import 'java.util.HashMap'
7
9
 
8
10
  # 一般化線形回帰分析
9
11
  # (Apache commoms math3使用)
@@ -20,35 +22,41 @@ module Num4GLMRegAnaLib
20
22
  # @param [Array] xij xの値(double[][])
21
23
  # @return [Hash] (intercept:定数項 slope:回帰係数)
22
24
  # @example
23
- # glsyi = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
25
+ # glsyi = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
24
26
  # glsxij = [
25
- # [95],
26
- # [90],
27
- # [85],
28
- # [80],
29
- # [80],
30
- # [75],
31
- # [70],
32
- # [70],
33
- # [65],
34
- # [50],
35
- # [60],
36
- # [55],
37
- # [45],
38
- # [65],
39
- # [40],
40
- # [35],
41
- # [55],
42
- # [50],
43
- # [50],
44
- # [45],
27
+ # [1, 24],
28
+ # [1, 18],
29
+ # [0, 15],
30
+ # [1, 16],
31
+ # [0, 10],
32
+ # [1, 26],
33
+ # [1, 2],
34
+ # [0, 24],
35
+ # [1, 18],
36
+ # [1, 22],
37
+ # [1, 3],
38
+ # [1, 6],
39
+ # [0, 15],
40
+ # [0, 12],
41
+ # [1, 6],
42
+ # [0, 6],
43
+ # [1, 12],
44
+ # [0, 12],
45
+ # [1, 18],
46
+ # [1, 3],
47
+ # [1, 8],
48
+ # [0, 9],
49
+ # [0, 12],
50
+ # [0, 6],
51
+ # [0, 8],
52
+ # [1, 12],
45
53
  # ]
46
54
  # regana = Num4RegAnaLib::LogitRegAnaLib.new
47
55
  # regana.non_line_reg_ana(glsyi, glsxij)
48
56
  # =>
49
57
  # {
50
- # "intercept": -17.81, # 定数項
51
- # "slope": [0.16], # 回帰係数
58
+ # "intercept": -6.2313, # 定数項
59
+ # "slope": [2.5995, 0.1652], # 回帰係数
52
60
  # }
53
61
  def non_line_reg_ana(yi, xij)
54
62
  multRet = @multana.nonLineRegAna(yi.to_java(Java::double), xij.to_java(Java::double[]))
@@ -58,6 +66,54 @@ module Num4GLMRegAnaLib
58
66
  }
59
67
  return retRb
60
68
  end
69
+ # AIC
70
+ #
71
+ # @overload get_aic(regcoe, xij)
72
+ # @param [Hash] regcoe 回帰係数(intercept:定数項 slope:回帰係数)
73
+ # @param [Array] xij xの値(double[][])
74
+ # @return double AIC値
75
+ # @example
76
+ # reg = {
77
+ # :intercept=> -6.2313, # 定数項
78
+ # :slope=> [2.5995, 0.1652], # 回帰係数
79
+ # }
80
+ # xij = [
81
+ # [1, 24],
82
+ # [1, 18],
83
+ # [0, 15],
84
+ # [1, 16],
85
+ # [0, 10],
86
+ # [1, 26],
87
+ # [1, 2],
88
+ # [0, 24],
89
+ # [1, 18],
90
+ # [1, 22],
91
+ # [1, 3],
92
+ # [1, 6],
93
+ # [0, 15],
94
+ # [0, 12],
95
+ # [1, 6],
96
+ # [0, 6],
97
+ # [1, 12],
98
+ # [0, 12],
99
+ # [1, 18],
100
+ # [1, 3],
101
+ # [1, 8],
102
+ # [0, 9],
103
+ # [0, 12],
104
+ # [0, 6],
105
+ # [0, 8],
106
+ # [1, 12],
107
+ # ]
108
+ # regana = Num4RegAnaLib::LogitRegAnaLib.new
109
+ # regana.get_aic(reg, xij)
110
+ # => 155.612
111
+ def get_aic(regcoe, xij)
112
+ o = HashMap.new
113
+ o["intercept"] = regcoe[:intercept]
114
+ o["slope"] = regcoe[:slope].to_java(Java::double)
115
+ @multana.getAIC(o, xij.to_java(Java::double[]))
116
+ end
61
117
  end
62
118
  # ポアソン回帰分析
63
119
  class PoissonRegAnaLib
@@ -85,6 +141,89 @@ module Num4GLMRegAnaLib
85
141
  # "intercept": 1.3138, # 定数項
86
142
  # "slope": [0.3173], # 回帰係数
87
143
  # }
144
+ def non_line_reg_ana(yi, xij)
145
+ multRet = @multana.nonLineRegAna(yi.to_java(Java::double), xij.to_java(Java::double[]))
146
+ retRb = {
147
+ "intercept": multRet.getIntercept(), # 定数項
148
+ "slope": multRet.getSlope().to_a, # 回帰係数
149
+ }
150
+ return retRb
151
+ end
152
+ # AIC
153
+ #
154
+ # @overload get_aic(regcoe, xij)
155
+ # @param [Hash] regcoe 回帰係数(intercept:定数項 slope:回帰係数)
156
+ # @param [Array] xij xの値(double[][])
157
+ # @return double AIC値
158
+ # @example
159
+ # reg = {
160
+ # :intercept => 1.3138, # 定数項
161
+ # :slope => [0.3173], # 回帰係数
162
+ # }
163
+ # xij = [
164
+ # [1],
165
+ # [2],
166
+ # [3],
167
+ # [4],
168
+ # ]
169
+ # regana = Num4RegAnaLib::PoissonRegAnaLib.new
170
+ # regana.get_aic(reg, xij)
171
+ # => -12.856
172
+ def get_aic(regcoe, xij)
173
+ o = HashMap.new
174
+ o["intercept"] = regcoe[:intercept]
175
+ o["slope"] = regcoe[:slope].to_java(Java::double)
176
+ @multana.getAIC(o, xij.to_java(Java::double[]))
177
+ end
178
+ end
179
+ # プロビット回帰分析
180
+ class ProBitRegAnaLib
181
+ def initialize
182
+ @multana = ProBitRegAna.getInstance()
183
+ end
184
+ # プロビット回帰分析
185
+ #
186
+ # @overload non_line_reg_ana(yi, xij)
187
+ # @param [Array] yi yの値(double[])
188
+ # @param [Array] xij xの値(double[][])
189
+ # @return [Hash] (intercept:定数項 slope:回帰係数)
190
+ # @example
191
+ # glsyi = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
192
+ # glsxij = [
193
+ # [1, 24],
194
+ # [1, 18],
195
+ # [0, 15],
196
+ # [1, 16],
197
+ # [0, 10],
198
+ # [1, 26],
199
+ # [1, 2],
200
+ # [0, 24],
201
+ # [1, 18],
202
+ # [1, 22],
203
+ # [1, 3],
204
+ # [1, 6],
205
+ # [0, 15],
206
+ # [0, 12],
207
+ # [1, 6],
208
+ # [0, 6],
209
+ # [1, 12],
210
+ # [0, 12],
211
+ # [1, 18],
212
+ # [1, 3],
213
+ # [1, 8],
214
+ # [0, 9],
215
+ # [0, 12],
216
+ # [0, 6],
217
+ # [0, 8],
218
+ # [1, 12],
219
+ # ]
220
+ # regana = Num4RegAnaLib::ProBitRegAnaLib.new
221
+ # regana.non_line_reg_ana(glsyi, glsxij)
222
+ # =>
223
+ # {
224
+ # "intercept": -5.0497, # 定数項
225
+ # "slope": [2.2379, 0.2973], # 回帰係数
226
+ # }
88
227
  def non_line_reg_ana(yi, xij)
89
228
  multRet = @multana.nonLineRegAna(yi.to_java(Java::double), xij.to_java(Java::double[]))
90
229
  retRb = {
@@ -93,6 +232,54 @@ module Num4GLMRegAnaLib
93
232
  }
94
233
  return retRb
95
234
  end
235
+ # AIC
236
+ #
237
+ # @overload get_aic(regcoe, xij)
238
+ # @param [Hash] regcoe 回帰係数(intercept:定数項 slope:回帰係数)
239
+ # @param [Array] xij xの値(double[][])
240
+ # @return double AIC値
241
+ # @example
242
+ # reg = {
243
+ # :intercept=> -5.0497, # 定数項
244
+ # :slope=> [2.2379, 0.2973], # 回帰係数
245
+ # }
246
+ # xij = [
247
+ # [1, 24],
248
+ # [1, 18],
249
+ # [0, 15],
250
+ # [1, 16],
251
+ # [0, 10],
252
+ # [1, 26],
253
+ # [1, 2],
254
+ # [0, 24],
255
+ # [1, 18],
256
+ # [1, 22],
257
+ # [1, 3],
258
+ # [1, 6],
259
+ # [0, 15],
260
+ # [0, 12],
261
+ # [1, 6],
262
+ # [0, 6],
263
+ # [1, 12],
264
+ # [0, 12],
265
+ # [1, 18],
266
+ # [1, 3],
267
+ # [1, 8],
268
+ # [0, 9],
269
+ # [0, 12],
270
+ # [0, 6],
271
+ # [0, 8],
272
+ # [1, 12],
273
+ # ]
274
+ # regana = Num4RegAnaLib::ProBitRegAnaLib.new
275
+ # regana.get_aic(reg, xij)
276
+ # => 119.674
277
+ def get_aic(regcoe, xij)
278
+ o = HashMap.new
279
+ o["intercept"] = regcoe[:intercept]
280
+ o["slope"] = regcoe[:slope].to_java(Java::double)
281
+ @multana.getAIC(o, xij.to_java(Java::double[]))
282
+ end
96
283
  end
97
284
  end
98
285
 
@@ -0,0 +1,44 @@
1
+ require 'java'
2
+ require 'num4regana.jar'
3
+ require 'commons-math3-3.6.1.jar'
4
+
5
+ java_import 'PoissonHierBayesRegAna'
6
+ # 階層ベイズモデル
7
+ module Num4HBMRegAnaLib
8
+ # 階層ベイズポアソン回帰分析
9
+ class PoissonHierBayesRegAnaLib
10
+ def initialize
11
+ @multana = PoissonHierBayesRegAna.getInstance()
12
+ end
13
+ # ポアソン回帰分析
14
+ #
15
+ # @overload non_line_reg_ana(yi, xij)
16
+ # @param [Array] yi yの値(double[])
17
+ # @param [Array] xij xの値(double[][])
18
+ # @return [Hash] (intercept:定数項 slope:回帰係数)
19
+ # @example
20
+ # glsyi = [4, 10, 7, 14]
21
+ # glsxij = [
22
+ # [1],
23
+ # [2],
24
+ # [3],
25
+ # [4],
26
+ # ]
27
+ # regana = Num4RegAnaLib::HierBayesPoissonRegAnaLib.new
28
+ # regana.non_line_reg_ana(glsyi, glsxij)
29
+ # =>
30
+ # {
31
+ # "intercept": 0.477366, # 定数項
32
+ # "slope": [0.538545], # 回帰係数
33
+ # }
34
+ def non_line_reg_ana(yi, xij)
35
+ multRet = @multana.nonLineRegAna(yi.to_java(Java::double), xij.to_java(Java::double[]))
36
+ retRb = {
37
+ "intercept": multRet.getIntercept(), # 定数項
38
+ "slope": multRet.getSlope().to_a, # 回帰係数
39
+ }
40
+ return retRb
41
+ end
42
+ end
43
+ end
44
+
data/lib/num4regana.rb CHANGED
@@ -1,9 +1,14 @@
1
1
  require_relative('num4lineregana')
2
2
  require_relative('num4glmregana')
3
+ require_relative('num4glmmregana')
4
+ require_relative('num4hbmregana')
3
5
 
6
+ # 回帰分析
4
7
  module Num4RegAnaLib
5
8
  include Num4LineRegAnaLib
6
9
  include Num4GLMRegAnaLib
10
+ include Num4GLMMRegAnaLib
11
+ include Num4HBMRegAnaLib
7
12
  end
8
13
 
9
14
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: num4regana
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  platform: java
6
6
  authors:
7
7
  - siranovel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-05 00:00:00.000000000 Z
11
+ date: 2024-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -61,12 +61,20 @@ files:
61
61
  - Gemfile
62
62
  - LICENSE
63
63
  - Rakefile
64
+ - ext/num4regana/AbstractGLM.java
65
+ - ext/num4regana/AbstractGLMM.java
66
+ - ext/num4regana/LogitBayesRegAna.java
64
67
  - ext/num4regana/LogitRegAna.java
65
68
  - ext/num4regana/MultRegAna.java
69
+ - ext/num4regana/PoissonBayesRegAna.java
70
+ - ext/num4regana/PoissonHierBayesRegAna.java
66
71
  - ext/num4regana/PoissonRegAna.java
72
+ - ext/num4regana/ProBitRegAna.java
67
73
  - ext/num4regana/SmplRegAna.java
68
74
  - lib/commons-math3-3.6.1.jar
75
+ - lib/num4glmmregana.rb
69
76
  - lib/num4glmregana.rb
77
+ - lib/num4hbmregana.rb
70
78
  - lib/num4lineregana.rb
71
79
  - lib/num4regana.rb
72
80
  homepage: http://github.com/siranovel/num4regana