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 +4 -4
- data/CHANGELOG.md +11 -0
- data/ext/num4regana/AbstractGLM.java +63 -0
- data/ext/num4regana/AbstractGLMM.java +127 -0
- data/ext/num4regana/LogitBayesRegAna.java +85 -0
- data/ext/num4regana/LogitRegAna.java +36 -50
- data/ext/num4regana/PoissonBayesRegAna.java +74 -0
- data/ext/num4regana/PoissonHierBayesRegAna.java +65 -0
- data/ext/num4regana/PoissonRegAna.java +36 -50
- data/ext/num4regana/ProBitRegAna.java +71 -0
- data/lib/num4glmmregana.rb +180 -0
- data/lib/num4glmregana.rb +210 -23
- data/lib/num4hbmregana.rb +44 -0
- data/lib/num4regana.rb +5 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a35c59c0d504b97992d42739340fb1370e5fd80fc547987bb4d0a138f628b284
|
4
|
+
data.tar.gz: fec825eed34dd9c230fed6065accc753e3539bd5af5bb9b8a697c1a3752c06c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10a7cbe03f96c05fc5995b696e6946fbc222d6b5a6b0f8b487cd5c50dfccca9d931d9312d5ab3589473b2589f6887885a142e6fcb467aa526499fb6812248368
|
7
|
+
data.tar.gz: 97009fb18fcb77dd771b6290eea892092710bf49d647e451cb720d94f2ead2a07826657b139e9842fc14d8c6b3aa3ac3fd938819bea090faa403bfe43384fb8e
|
data/CHANGELOG.md
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
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
|
-
#
|
51
|
-
#
|
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.
|
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-
|
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
|