3

JAVA には 2 つの 4*4 マトリックスがあり、1 つのマトリックスには観測されたカウントが保持され、もう 1 つのマトリックスには期待されるカウントが保持されます。

これら 2 つの行列間のカイ 2 乗統計量から p 値を自動的に計算する方法が必要です。しかし、私が知る限り、JAVA にはそのような機能はありません。

カイ 2 乗とその p 値を計算するには、2 つの行列を .csv ファイル形式として R に読み込み、次のように chisq.test 関数を使用します。

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 に戻す?

助けてくれてありがとう....

4

6 に答える 6

12

これには (少なくとも) 2 つの方法があります。


コマンドラインとスクリプト

を使用して、コマンド ラインから Rscript を実行できますRscript.exe。たとえば、スクリプトでは次のようになります。

# Parse arguments.
# ...
# ...

chisq.test(obs, exp)

Java で CSV を作成して R に読み込ませるのではなく、R に直接渡すことができるはずです。マトリックスが非常に大きい場合を除き、CSV を作成してそのようにデータを渡す必要はないと思います。渡すことができるコマンド ライン引数のサイズには制限があります (オペレーティング システムによって異なると思います)。

引数を Rscript に渡し、commandArgs()関数またはさまざまなパッケージ (例: optparseまたはgetopt ) を使用してそれらを解析できます。詳細については、このスレッドを参照してください

Java でコマンド ラインから呼び出して読み取るには、いくつかの方法があります。アドバイスできるほど詳しくはありませんが、少しグーグルで検索すると結果が得られます。コマンド ラインからスクリプトを呼び出すには、次のようにします。

Rscript my_script.R

日本総合研究所

JRI を使用すると、Java から直接 R に話しかけることができます。double 配列を 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. 日本総合研究所へのリンク
  2. JRI をセットアップするための推奨 Eclipse プラグイン
于 2013-04-15T16:32:41.183 に答える
1

Rserve は、データを Java から R に、またはその逆に取得するもう 1 つの方法です。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 に関するその他の情報は次のとおりです。ちなみに、これは Tableau が R と通信する方法でもあり、R 接続を使用して通信する方法でもあります。

https://cran.r-project.org/web/packages/Rserve/index.html

于 2015-12-24T01:17:28.483 に答える
0

ChiSquare テストを行う Java ライブラリを使用することをお勧めします。それらは十分にあります:

これは完全なリストではありませんが、5 分間の検索で見つけたものです。

于 2013-06-06T07:46:17.660 に答える
0

1) 行列を JAVA から .csv ファイルに出力する

CSV ライブラリのいずれかを使用してください。http://opencsv.sourceforge.net/ をお勧めします

2) .csv ファイルを R にアップロードする 3) .csv ファイルの chisq.test を 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().exec() を使用して R を呼び出す場合にのみ、R の出力を読み取ることができます。

また、 Apache の Statistics Lib & How to calculate PValue from ChiSquareも参照することをお勧めします。たぶん、R がまったくなくても生きていけるかもしれません :)

于 2013-06-06T06:41:50.690 に答える