在Java中为ARIMA调用R
我尝试在JAVA中调用R来实现ARIMA函数。第一个示例运行arima()。它工作得很好在Java中为ARIMA调用R,java,r,arima,jri,Java,R,Arima,Jri,我尝试在JAVA中调用R来实现ARIMA函数。第一个示例运行arima()。它工作得很好 Rengine rengine = new Rengine(new String[]{"--vanilla"},false,null); System.out.println(" *BEGIN* "); rengine.eval("library(forecast)"); double[] trainingData = = {10930,10318,10595,10972,7706,6756,9092,
Rengine rengine = new Rengine(new String[]{"--vanilla"},false,null);
System.out.println(" *BEGIN* ");
rengine.eval("library(forecast)");
double[] trainingData = = {10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422,
+ 6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,10477,
+ 10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,12136,12812,
+ 12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,13261,13230,15535,
+ 16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,9543,12872,13101,15053,
+ 12619,13749,10228,9725,14729,12518,14564,15085,14722,11999,9390,13481,14795,15845,
+ 15271,14686,11054,10395,14775,14618,16029,15231,14246,12095,10473,15323,15381,14947};
rengine.assign("value", trainingData);
rengine.eval("traindatats<-ts(value)");
rengine.eval("loopMinLag<-0");
rengine.eval("loopMaxLag<-8");
rengine.eval("best.order <- c(loopMinLag, 1, loopMinLag)");
rengine.eval("best.aic = Inf");
rengine.eval("for(P in loopMinLag:loopMaxLag) { for(Q in loopMinLag:loopMaxLag) { myModel <- arima(traindatats, order=c(P,1,Q), method='ML'); fit.aic <- myModel$aic; if(fit.aic < best.aic) { best.order <- c(P, 1, Q); best.aic <- fit.aic; } } }");
rengine.eval("model <- list()");
rengine.eval("model$P <- best.order[1]");
rengine.eval("model$D <- 1");
rengine.eval("model$Q <- best.order[3]");
rengine.eval("ar<-arima(traindatats,order=c(model$P,model$D,model$Q))");
rengine.eval("f<-predict(ar,n.ahead=7)");
System.out.println(" *RESULT* ");
double forecast[] = new double[7];
for (int i = 0,j=1; i < 7; i++,j++) {
forecast[i] = rengine.eval("f$pred[" + j + "]").asDouble();
System.out.print(" "+forecast[i]);
}
System.out.println("\r\n *DONE* ");
Rengine-Rengine=new-Rengine(新字符串[]{--vanilla},false,null);
System.out.println(“*BEGIN*”);
rengine.eval(“库(预测)”);
双[]训练数据=={10930103181059510972770667592921055177222109131115181866422,
+ 6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,10477,
+ 10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,12136,12812,
+ 12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,13261,13230,15535,
+ 16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,9543,12872,13101,15053,
+ 12619,13749,10228,9725,14729,12518,14564,15085,14722,11999,9390,13481,14795,15845,
+ 15271,14686,11054,10395,14775,14618,16029,15231,14246,12095,10473,15323,15381,14947};
重新设计分配(“值”,培训数据);
重新发动机评估(“此处的列车数据:
rengine.eval("f$pred[" + j + "]").asDouble();
rengine.eval(“f$pred[“+j+”])
此项为空
根据:
评估
公共REXP eval(java.lang.String s)
看起来,右边好像出了点问题
嗯,也许你对图书馆有一些问题,等等
如果我安装forecast
install.packages('forecast')
在R中,我这样调用代码:
javac -cp /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/jri/JRI.jar SimpleR.java
java -Djava.library.path=/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/jri -cp .:/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/jri/JRI.jar SimpleR
*BEGIN*
Forecast: 0
Result: 14436.670778092368
Forecast: 1
Result: 14104.789779948998
Forecast: 2
Result: 14104.789779948998
Forecast: 3
Result: 14104.789779948998
Forecast: 4
Result: 14104.789779948998
*DONE*
我得到了正确的输出。我的SimpleR.java如下所示:
import org.rosuda.JRI.*;
public class SimpleR {
public static void main(String [] arg) {
Rengine rengine = new Rengine(new String[]{"--vanilla"},false,null);
System.out.println(" *BEGIN* ");
// enable R log
rengine.eval("log<-file('/tmp/file.log')");
rengine.eval("sink(log, append=TRUE)");
rengine.eval("sink(log, append=TRUE, type='message')");
rengine.eval("library(forecast)");
double[] trainingData = {10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422,
+ 6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,10477,
+ 10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,12136,12812,
+ 12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,13261,13230,15535,
+ 16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,9543,12872,13101,15053,
+ 12619,13749,10228,9725,14729,12518,14564,15085,14722,11999,9390,13481,14795,15845,
+ 15271,14686,11054,10395,14775,14618,16029,15231,14246,12095,10473,15323,15381,14947};
rengine.assign("value", trainingData);
rengine.eval("traindatats<-ts(value)");
rengine.eval("ar<-auto.arima(traindatats)");
REXP result = rengine.eval("f<-predict(ar,n.ahead=" + 5 + ")");
if(result == null) {
System.out.println("Error");
}
double forecast[] = new double[5];
for (int i = 0;i < 5;i++) {
System.out.println("Forecast: " + i);
forecast[i] = rengine.eval("f$pred[" + (i+1) + "]").asDouble();
System.out.println("Result: " + forecast[i]);
}
System.out.println(" *DONE* ");
}
}
import org.rosuda.JRI.*;
公共类更简单{
公共静态void main(字符串[]arg){
Rengine-Rengine=new-Rengine(新字符串[]{--香草“},false,null);
System.out.println(“*BEGIN*”);
//启用R日志
rengine.eval(“logBut,如果下面的代码直接在R上运行,没有任何问题。值非常感谢!但是SimpleR.java对我不起作用。结果是,`*BEGIN*`错误
预测:0
线程“main”java.lang.NullPointerException
`at SimpleR.main(SimpleR.java:26)`我发现了一个异常情况。在JAVA中,当我调用arima()时,它会运行几秒钟。然后,它会正确地生成输出。但是,当我在JAVA中调用auto.arima()时,它运行得非常快。然后,它会输出错误消息。尝试使用log(查看源代码)。这样,您就可以看到R端发生了什么;)我遵循你的建议。我想JRI没有正确配置,尽管我可以在JAVA中调用arima()R函数。
javac -cp /Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/jri/JRI.jar SimpleR.java
java -Djava.library.path=/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/jri -cp .:/Library/Frameworks/R.framework/Versions/3.5/Resources/library/rJava/jri/JRI.jar SimpleR
*BEGIN*
Forecast: 0
Result: 14436.670778092368
Forecast: 1
Result: 14104.789779948998
Forecast: 2
Result: 14104.789779948998
Forecast: 3
Result: 14104.789779948998
Forecast: 4
Result: 14104.789779948998
*DONE*
import org.rosuda.JRI.*;
public class SimpleR {
public static void main(String [] arg) {
Rengine rengine = new Rengine(new String[]{"--vanilla"},false,null);
System.out.println(" *BEGIN* ");
// enable R log
rengine.eval("log<-file('/tmp/file.log')");
rengine.eval("sink(log, append=TRUE)");
rengine.eval("sink(log, append=TRUE, type='message')");
rengine.eval("library(forecast)");
double[] trainingData = {10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422,
+ 6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,10477,
+ 10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,12136,12812,
+ 12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,13261,13230,15535,
+ 16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,9543,12872,13101,15053,
+ 12619,13749,10228,9725,14729,12518,14564,15085,14722,11999,9390,13481,14795,15845,
+ 15271,14686,11054,10395,14775,14618,16029,15231,14246,12095,10473,15323,15381,14947};
rengine.assign("value", trainingData);
rengine.eval("traindatats<-ts(value)");
rengine.eval("ar<-auto.arima(traindatats)");
REXP result = rengine.eval("f<-predict(ar,n.ahead=" + 5 + ")");
if(result == null) {
System.out.println("Error");
}
double forecast[] = new double[5];
for (int i = 0;i < 5;i++) {
System.out.println("Forecast: " + i);
forecast[i] = rengine.eval("f$pred[" + (i+1) + "]").asDouble();
System.out.println("Result: " + forecast[i]);
}
System.out.println(" *DONE* ");
}
}
rengine.eval("log<-file('/tmp/file.log')");
rengine.eval("sink(log, append=TRUE)");
rengine.eval("sink(log, append=TRUE, type='message')");