Search code examples
c#rr.net

How to perform Change Point Analysis using R.NET


How to perform Change Point Analysis using R.NET. I am using below code

REngine.SetEnvironmentVariables();
REngine engine = REngine.GetInstance();
double[] data = new double[] { 1, 2, 3, 4, 5, 6 };
NumericVector vector = engine.CreateNumericVector(data);
engine.SetSymbol("mydatapoints", vector);
engine.Evaluate("library(changepoint)");
engine.Evaluate("chpoints = cpt.mean(mydatapoints, method="BinSeg")");
DynamicVector result = engine.Evaluate("x<-cpts(chpoints)").AsVector(); ;
engine.Dispose();

I am receiving below error on engine.Evaluate("library(changepoint)");

Error in library(changepoint) : there is no package called 'changepoint'

Edit # 1

The changepoint package is supposed to be installed explicitly, it is not there by default. Installed it using RGui -> Packages -> Load package.

Now the error has been changed to

Status Error for chpoints = cpt.mean(mydatapoints, method=”BinSeg”) : unexpected input

Edit # 2

After fixing first two errors, the following one appears on second Evaluate statement.

Error in BINSEG(sumstat, pen = pen.value, cost_func = costfunc, minseglen = minseglen, : Q is larger than the maximum number of segments 4

The same error appears on R as well using these commands

value.ts <- c(29.89, 29.93, 29.72, 29.98)
chpoints = cpt.mean(value.ts, method="BinSeg")

Solution

  • The data points are supposed to be converted in Time Series.

    REngine.SetEnvironmentVariables();
    REngine engine = REngine.GetInstance();
    double[] data = new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    NumericVector vector = engine.CreateNumericVector(data);
    engine.Evaluate("library(changepoint)");
    engine.SetSymbol("values", vector);
    engine.Evaluate("values.ts = ts(values, frequency = 12, start = c(2017, 1))");
    engine.Evaluate("chpoints = cpt.mean(values.ts, method=\"BinSeg\")");
    var result = engine.GetSymbol("chpoints");
    engine.Dispose();
    

    Now looking for how to get the results back in C#, chpoints or result of plot(chpoints)