从Java调用R键得到卡方统计和p值(Call R from JAVA to get Chi-squ

2019-08-31 07:10发布

我在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之间的情况下,它肯定是比调用多个脚本更好。

  1. 链接JRI 。
  2. 推荐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