# Finding parameters of a skew normal distribution knowing only the first and last deciles and a mean

I only know Q(0.1;…), Q(0.9;…) and the mean value, so I would like to know if there’s a way to find the parameters of skew normal distribution that fit to my data. For example, Q(0.1;…)=6670, Q(0.9;…)=16601, Mean=10330

One way (that doesn't always work) is to equate the true values to the estimated values and solve for the parameters. The brute force approach for this particular estimation would have 3 equations and 3 (unknown) parameters. However, here can simplify to 2 equations and 2 parameters.

If the skewed normal parameters are xi, omega and alpha and the estimated quantities are m (sample mean), p10 (sample 10th percentile), and p90 (sample 90th percentile), then the 3 equations are

  library(sn)
m == xi + omega*alpha*sqrt(2/(pi*(1+alpha^2)))
p10 == qsn(0.1, xi, omega, alpha)
p90 == qsn(0.9, xi, omega, alpha)


To get down to 2 equations and 2 parameters note that

  xi == m - omega*alpha*sqrt(2/(pi*(1+alpha^2)))


So we substitute m - omega*alpha*sqrt(2/(pi*(1+alpha^2))) for xi.

Using the library rootSolve the code to find the corresponding values of xi, omega, and alpha is as follows:

  library(rootSolve)
model <- function(x, parms) {
omega = x[1]
alpha = x[2]
m = parms[1]
p10 = parms[2]
p90 = parms[3]
xi = m - omega*alpha*sqrt(2/(pi*(1+alpha^2)))
c(F1 = p10 - qsn(0.1, xi, omega, alpha),
F2 = p90 - qsn(0.9, xi, omega, alpha))
}
(sol = multiroot(model, c(3000, 0.4), parms=c(11446, 6644, 16355)))


This results in

$root [1] 4557.6885354 0.9607431$f.root
F1            F2
5.911716e-11 -5.456968e-11

$iter [1] 6$estim.precis
[1] 5.684342e-11


So we have omega = 4557.6885354 and alpha = 0.9607431. The value for xi will be

 (m - sol$$root[1]*sol$$root[2]*sqrt(2/(pi*(1+sol\$root[2]^2))))
[1] 8926.719


For your particular numbers, no solution is found and this will happen more often when the sample sizes are not large (with large maybe being 10,000 or greater). When there are no solutions found, then maybe using the values of xi, omega, and alpha that minimize the sum of the squares or absolute values of the differences might be appropriate. I haven't checked that out.

• Thank you for your answer, although this method is somehow unsuitable for any of my data. I modified your solution by adding to qsn(...) the auxiliary parameters tau and engine, which change the skew nd to the extended skew nd allowing the simulation of kurtosis as well, although I don’t know the exact value. So I run the modified solution with different values of tau positive and negative minimizing the estim.precis. What do you think about it? Feb 22 '20 at 18:45
• That is imaginative but also wishful thinking. The obvious (but maybe impossible) solution is not to end up with just those 3 summary statistics.
– JimB
Feb 23 '20 at 5:20
• In your answer you wrote that sometimes the solutions aren’t found because of smaller sample size. What sample were you talking about? Is it something generated internally in sn or rootSolve libraries? How can I reset the number of samples? Feb 25 '20 at 10:57
• What I mean by that issue of small sample size is that if the sample size is small, then it is more likely that the 3 sample statistics are less likely to be plausible values for the associated values of a skew normal distribution which results in no solution found. For large sample sizes the 3 sample statistics will almost certainly be closer to the true values and a solution is more likely to be found. (But even that assumes that the sampling was from a skew normal distribution and not something else.)
– JimB
Feb 25 '20 at 16:01
• Oh, I see now. Thank you. Feb 25 '20 at 18:58