2015年1月10日土曜日

math/Rで度数分布表をrJava経由でやってみる

前々回のRSampleと入れ替えてみる.
package rJava;
import java.util.Vector;
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.RVector;
import org.rosuda.JRI.Rengine;
public class RSample {
public static void main(String[] args) {
System.out.println("R_HOME:" + System.getenv("R_HOME"));
System.out.println("java.library.path:"
+ System.getProperty("java.library.path"));
Rengine engine = new Rengine(new String[] {
"--no-save"
}, false, null);
try {
int n = 1000000;
int m = 10;
double r = 6.0;
double[] x = new double[n];
for (int i = 0; i < n; i++) {
x[i] = 0.0;
for (int j = 0; j < m; j++) {
x[i] += Math.random() * r;
}
}
double[] b = new double[m + 1];
for (int i = 0; i < m + 1; i++) {
b[i] = r * i;
}
engine.assign("x", x);
engine.assign("b", b);
engine.eval("x2<-cut(x, breaks=b, right=FALSE, ordered_result=TRUE)");
engine.eval("x3<-table(x2)");
REXP result = engine.eval("as.data.frame(rbind(x3, x3/sum(x3)))");
RVector resultV = result.asVector();
@SuppressWarnings("unchecked")
Vector<String> labels = (Vector<String>) resultV.getNames();
for (String label : labels) {
double[] v = resultV.at(label).asDoubleArray();
String out = "label=" + label;
out += "\tfreq=" + v[0];
out += "\tratio=" + v[1];
System.out.println(out);
}
String[] sigma1 = {
"[24,30)", "[30,36)"
};
System.out.println("sigma1=" + func(resultV, sigma1));
String[] sigma2 = {
"[18,24)", "[24,30)", "[30,36)", "[36,42)"
};
System.out.println("sigma2=" + func(resultV, sigma2));
String[] sigma3 = {
"[12,18)", "[18,24)", "[24,30)", "[30,36)", "[36,42)",
"[42,48)"
};
System.out.println("sigma3=" + func(resultV, sigma3));
} finally {
engine.end();
}
}
private static double func(RVector resultV, String[] labels) {
double ratio = 0.0;
for (String label : labels) {
ratio += resultV.at(label).asDoubleArray()[1];
}
return ratio;
}
}
view raw RSample.java hosted with ❤ by GitHub


結果

R_HOME:/usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources
java.library.path:.:/usr/local/Cellar/r/3.1.2/R.framework/Versions/3.1/Resources/library/rJava/jri
label=[0,6) freq=0.0 ratio=0.0
label=[6,12) freq=19.0 ratio=1.9E-4
label=[12,18) freq=1394.0 ratio=0.01394
label=[18,24) freq=12456.0 ratio=0.12456
label=[24,30) freq=36287.0 ratio=0.36287
label=[30,36) freq=35818.0 ratio=0.35818
label=[36,42) freq=12658.0 ratio=0.12658
label=[42,48) freq=1340.0 ratio=0.0134
label=[48,54) freq=28.0 ratio=2.8E-4
label=[54,60) freq=0.0 ratio=0.0
sigma1=0.72105
sigma2=0.97219
sigma3=0.99953

参考

0 件のコメント: