我在JAVA,其中一个矩阵保持观测到的计数和其他预期计数两个4×4矩阵。
我需要一个自动化的方式来计算这两个矩阵之间的卡方统计的p值; 然而,Java有没有这样的功能,据我所知。
我可以计算卡方和通过读取两个矩阵为R为.csv文件格式,然后使用chisq.test功能如下其p值:
obs<-read.csv("obs.csv")
exp<-read.csv("exp.csv")
chisq.test(obs,exp)
其中,该.csv文件的格式将如下:
A, C, G, T
A, 197.136, 124.32, 63.492, 59.052
C, 124.32, 78.4, 40.04, 37.24
G, 63.492, 40.04, 20.449, 19.019
T, 59.052, 37.24, 19.019, 17.689
鉴于这些命令,R会给格式的输出:
X-squared = 20.6236, df = 9, p-value = 0.01443
其中包括p值我一直在寻找。
有谁知道的一种有效的方式来自动化的过程:
1)输出从JAVA我的矩阵转换成的.csv文件2)上传该.csv文件到R 3)上调用该.csv文件chisq.test到R 4)返回所输出的p值回JAVA?
谢谢你的帮助....
Answer 1:
有(至少)的要对此有两种方式。
命令行&脚本
你可以用下面的命令行执行Rscripts Rscript.exe
。 例如,在你的脚本,你必须:
# Parse arguments.
# ...
# ...
chisq.test(obs, exp)
而不是使用Java创建CSV并在具有R-阅读,你应该能够通过他们直奔R.我不认为有必要建立CSV并在传递数据这样一来,除非你的矩阵是相当大的。 有对命令行参数的大小限制,您可以通过(跨操作系统的变化,我认为)。
你可以传递参数到Rscripts并使用它们解析commandArgs()
函数或与各种包装(如optparse或getopt的 )。 请参阅此线程以获取更多信息 。
有两种调用,并从Java中的命令行读取的几种方法。 我不知道有足够的了解它给你的意见,但有点谷歌搜索会给你一个结果。 调用命令行是这样做的脚本:
Rscript my_script.R
JRI
JRI可以让你直接从Java交谈R上。 这里是你将如何通过一个双阵列R和具有R概括它(这是现在Java)的例子:
// Start R session.
Rengine re = new Rengine (new String [] {"--vanilla"}, false, null);
// Check if the session is working.
if (!re.waitForR()) {
return;
}
re.assign("x", new double[] {1.5, 2.5, 3.5});
REXP result = re.eval("(sum(x))");
System.out.println(result.asDouble());
re.end();
功能assign()
这里是一样的R中这样做:
x <- c(1.5, 2.5, 3.5)
您应该能够解决如何延长这一带矩阵工作。
我认为JRI是在一开始很困难。 所以,如果你想获得这个快速完成的命令行选项可能是最好的。 我会说,一旦你得到它的成立虽然JRI方法不太凌乱。 如果你有,你有很多来回R和Java之间的情况下,它肯定是比调用多个脚本更好。
- 链接JRI 。
- 推荐Eclipse插件设置JRI 。
Answer 2:
查看此网页JRI
说明形成他们的网站:
JRI是一个Java / R接口,其允许内的Java应用程序作为单个线程中运行R上。 基本上它加载ř动态库到Java和提供了Java API至R的功能。 它同时支持到R的功能和简单的调用和一个完整的运行REPL。
Answer 3:
RCaller 2.2可以做你想做的事情。 假设频率矩阵给出你的问题。 所得p.value和df变量可以计算并使用返回的代码如下:
double[][] data = new double[][]{
{197.136, 124.32, 63.492, 59.052},
{124.32, 78.4, 40.04, 37.24},
{63.492, 40.04, 20.449, 19.019},
{59.052, 37.24, 19.019, 17.689}
};
RCaller caller = new RCaller();
Globals.detect_current_rscript();
caller.setRscriptExecutable(Globals.Rscript_current);
RCode code = new RCode();
code.addDoubleMatrix("mydata", data);
code.addRCode("result <- chisq.test(mydata)");
code.addRCode("mylist <- list(pval = result$p.value, df=result$parameter)");
caller.setRCode(code);
caller.runAndReturnResult("mylist");
double pvalue = caller.getParser().getAsDoubleArray("pval")[0];
double df = caller.getParser().getAsDoubleArray("df")[0];
System.out.println("Pvalue is : "+pvalue);
System.out.println("Df is : "+df);
输出是:
Pvalue is : 1.0
Df is : 9.0
你可以在技术细节在这里
Answer 4:
Rserve是另一种方式来获得从Java您的数据R和背部。 它是以R脚本作为字符串输入的服务器。 您可以使用一些Java中的字符串检查和转换矩阵转换成字符串,可以输入到R.
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;
public class RtestScript {
private String emailTestScript = "open <- c('O', 'O', 'N', 'N', 'O', 'O', 'N', 'N', 'N', 'O', " +
" 'O', 'N', 'N', 'O', 'O', 'N', 'N', 'N', 'O');" +
"testgroup <- c('A', 'A', 'A','A','A','A','A','A','A','A', 'B'," +
"'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B');" +
"emailTest <- data.frame(open, testgroup);" +
"emailTable<- table(emailTest$open, emailTest$testgroup);" +
"emailResults<- prop.test(emailTable, correct=FALSE);" +
"print(emailResults$p.value);";
public void executeRscript() {
try {
//Make sure to type in library(Rserve); Rserve() in Rstudio before running this
RConnection testConnection = new RConnection();
REXP testExpression = testConnection.eval(emailTestScript);
System.out.println("P value: " + testExpression.asString());
} catch(Exception e) {
e.printStackTrace();
}
}
}
下面是一些Rserve更多信息。 顺便说一下,这也是如何画面可以被R以及用其研发连接进行通信。
https://cran.r-project.org/web/packages/Rserve/index.html
Answer 5:
1)输出从JAVA我的矩阵转换成的.csv文件
使用任何CSV libraies的,我会建议http://opencsv.sourceforge.net/
2)上载该.csv文件到R 3)调用chisq.test上该.csv文件成R
2&3漂亮的一样,你最好创建参数化的脚本在R.运行
obs<-read.csv(args[1])
exp<-read.csv(args[2])
chisq.test(obs,exp)
所以,你可以运行
RScript your_script.r path_to_csv1 path_to_csv2,
并使用例如CSV文件中唯一的名称:
UUID.randomUUID().toString().replace("-","")
然后使用
Runtime.getRuntime().exec(command, environments, dataDir);
4)返回所输出的p值回JAVA? 如果你正在使用getRuntime(),则只能读取R的输出。EXEC()调用R.
我还建议采取看看Apache的统计库和如何从卡方计算p值 。 也许你可以住不带R在所有:)
Answer 6:
我建议只使用一个Java库,做了卡方检验你。 有足够多的:
- Apache的百科全书数学: http://commons.apache.org/proper/commons-math/
- JSC: http://www.jsc.nildram.co.uk/
- JDistlib: http://jdistlib.sourceforge.net/
这不是一个完整的清单,但我在5分钟内搜索找到。
文章来源: Call R from JAVA to get Chi-squared statistic and p-value