Does R.NET support Skew Normal Distribution (snorm or others)?

Mar 24, 2014 at 9:46 PM
Does R.NET support "Skew Normal Distribution" such as snorm or others similar functions?
Mar 24, 2014 at 10:28 PM
It depends what you mean, really; could you be more precise. Do you have a short R code illustrating what you would do in R?

If you can express something in our R statements, you probably can craft an equivalent in R.NET.

If you refer to using directly the C function 'snorm' that is in the R engine, not sure; to start with, it is not exported by the R shared library.
Mar 25, 2014 at 2:43 AM
What I need is to create a skewed normal distribution curve that fits a histogram in C# and .NET. In searching the library, I found one in R - the "sn" library.


data(mydata, package="sn")

// dstart, dend, dbins will be set here from mydata

breaks<- c(seq(dstart, dend, by=(dend-dstart)/dbins))
f <- cut(Ht[y=="intensity"], breaks = breaks)
freq <- tabulate(f, length(levels(f)))
d1 <- sn.mle.grouped(breaks, freq)
d2 <- st.mle.grouped(breaks, freq, start=c(d1$end,log(5)))

How can I use this library from .NET? I don't have any experience in R. Could you please show me an example on how to link the sn library and craft an equivalent "d2 <- st.mle.grouped(breaks, freq, start=c(d1$end,log(5)))" in R.NET?
Mar 25, 2014 at 4:38 AM
Using some sample code from the package, the following works:
      private static void ReproDiscussion540017(REngine e)
          e.Evaluate("data(wines, package='sn')");
          e.Evaluate("X <- model.matrix(~ phenols + wine, data=wines)");
          e.Evaluate("fit <- msn.mle(x=X, y=cbind(wines$acidity, wines$alcohol), opt.method='BFGS')");
          var beta = e.Evaluate("fit$dp$beta").AsNumericMatrix();
          var value = beta[0,1];
          var betaNames = e.Evaluate("rownames(fit$dp$beta)").AsCharacter().ToArray();
It seems that your functions in your versions of sn are substantially different from the version 1.0.0
Mar 25, 2014 at 11:36 PM
Your code works! Now I learned how to link the library and call functions in R. I also learned how to pass the results back to .NET.

To make this works in my .NET application, I need to pass the data (double array, or double list) to sn lib as input (not load from a file):
void foo(List<double> myData)
var Y = myData;
e.Evaluate("fit <- msn.mle(y=Y,  opt.method='BFGS')");
var beta = engine.Evaluate("fit$dp$beta").AsNumericMatrix();
When my data is passed from Y in .NET to y in sn, it causes an following error:
"Error in : object 'Y' not found
A first chance exception of type 'RDotNet.ParseException' occurred in RDotNet.dll" 
Could you please advise me on how to pass the observed data to sn lib?

Mar 26, 2014 at 12:29 AM
There is a code sample for creating data frame in a very recent discussion
Mar 26, 2014 at 1:34 AM
Jul 17, 2014 at 10:56 PM
Use fGarch library - snorm and other skewed distributions