GithubHelp home page GithubHelp logo

Comments (5)

bvenn avatar bvenn commented on June 16, 2024 1

I've added an InvCDF member to all distributions by 3d6a220.
I noticed the approximation of the inverse error function leads to some discrepancies when extreme values are chosen and compared to the R qnorm procedure.

// Testing FSharp.Stats
(Distributions.Continuous.Normal.InvCDF 0. 1. 0.5)  //0.
# Testing R
qnorm(0.5,0,1)
# Testing Python
from scipy.stats import norm
norm.ppf(0.5, loc=0, scale=1)
Mean StDev X result FSharp.Stats result R result Python
0 1 0.5 1.253321755e-09 0 0
0 1 0 -infinity -infinity -infinity
0 1 1 infinity infinity infinity
3 0.01 0.01 2.97673652985179 2.97673652126 2.97673652125959
-300000 5000 0.99 -288368.2649258 -288368.2606298 -288368.2606297958

While the deviation is small and just occurs at extreme values, it would be worth checking if the approximation presented in Wichura, “Algorithm AS 241: The Percentage Points of the Normal Distribution.”, 1988 should be implemented.

  • add tests
  • check accuracy

References

from fsharp.stats.

bvenn avatar bvenn commented on June 16, 2024

The normal InvCDF for mean = 0 and sigma = 1 is already implemented at an inproper position:

let inverseCDF x =
sqrt 2. * Errorfunction.inverf (2. * x - 1.)

I agree, we should add quantile functions as InvCDF for all distributions 👍

from fsharp.stats.

bvenn avatar bvenn commented on June 16, 2024

I've implemented the quantile function of the normal distribution as described in Wichura et al.. Its accurate for
15 decimal places.

from fsharp.stats.

bvenn avatar bvenn commented on June 16, 2024

Progress of adding InvCDF/quantile functions t continuous distributions

  • Normal
  • Gamma
  • Beta
  • F
  • StudentT
  • Studentized Range
  • LogNormal
  • MultivariateNrmal
  • Exponential
  • Uniform <- should be easy
  • Chi
  • ChiSquared

from fsharp.stats.

bvenn avatar bvenn commented on June 16, 2024

Many distributions have no closed form of the quantile function. Besides published approximations would be beneficial to add a member for each Distribution that approximates the correct x for a given p. The CDF is continuously increasing and therefore a root finding approach should work just fine. I propose the following:

type MyDistribution =

    static member PDF a b x = ...

    static member CDF a b x = ...

    static member InvCDF a b x = //possible no closed form exists

    static member InvCDFApprox a b x accuracy = 
        ///parameters: function (float -> float); accuracy (float); minimum (float); maximum (float); maxIterations
        let tmp = Optimization.Bisection.tryFindRoot (fun x -> MyDistribution.CDF a b x - p) accuracy 0. 1. 1000
        match tmp with 
        | Some x -> x
        | None -> failwith "no InvCDF found to satisfy the given conditions"

Drawbacks

  • While this should be feasible for any distribution, the optimization step may be quite slow.
  • If the CDF itself is an approximation, an error propagation would inflate the InvCDF error.

To discuss:

  • should the InvCDFApprox fail or result in nan when no root can be identified?
  • can the maxIterations be determined by accuracy? In my understanding, the range between min and max is divided into two sections during each iteration. Therefore, the accuracy should be coupled to the number of maximum iterations by: $$accuracy = 0.5^{maxIterations}$$ If this is correct, maxIterations could be set to $$System.Math.Log(accuracy,0.5)$$
  • should the accuracy be given as float, or maybe model it as type like in Expecto.Accuracy.
  • Is there a better alternative for Optimization.Bisection? Like e.g. NelderMead with (fun x -> abs (MyDistribution.CDF a b x - p)) as objective function.
  • Are there any better naming options as InvCDFApprox?
  • Are there more concerns, that I missed?

from fsharp.stats.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.