Problem with the Inverse CDF of Non-central F Ratio Distribution












3












$begingroup$


In[3]:= n = 5; n1 = 4; n2 = 6; γ = 0.05; α = 1/370;
InverseCDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2],
1 - α - (n - n1)/n2]



During evaluation of In[3]:= FindRoot::lstol: The line search
decreased the step size to within tolerance specified by AccuracyGoal
and PrecisionGoal but was unable to find a sufficient decrease in the
merit function. You may need more than MachinePrecision digits of
working precision to meet these tolerances. >>




Out[4]= 3.24659


The correct answer is 5468.146427955789










share|improve this question











$endgroup$

















    3












    $begingroup$


    In[3]:= n = 5; n1 = 4; n2 = 6; γ = 0.05; α = 1/370;
    InverseCDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2],
    1 - α - (n - n1)/n2]



    During evaluation of In[3]:= FindRoot::lstol: The line search
    decreased the step size to within tolerance specified by AccuracyGoal
    and PrecisionGoal but was unable to find a sufficient decrease in the
    merit function. You may need more than MachinePrecision digits of
    working precision to meet these tolerances. >>




    Out[4]= 3.24659


    The correct answer is 5468.146427955789










    share|improve this question











    $endgroup$















      3












      3








      3





      $begingroup$


      In[3]:= n = 5; n1 = 4; n2 = 6; γ = 0.05; α = 1/370;
      InverseCDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2],
      1 - α - (n - n1)/n2]



      During evaluation of In[3]:= FindRoot::lstol: The line search
      decreased the step size to within tolerance specified by AccuracyGoal
      and PrecisionGoal but was unable to find a sufficient decrease in the
      merit function. You may need more than MachinePrecision digits of
      working precision to meet these tolerances. >>




      Out[4]= 3.24659


      The correct answer is 5468.146427955789










      share|improve this question











      $endgroup$




      In[3]:= n = 5; n1 = 4; n2 = 6; γ = 0.05; α = 1/370;
      InverseCDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2],
      1 - α - (n - n1)/n2]



      During evaluation of In[3]:= FindRoot::lstol: The line search
      decreased the step size to within tolerance specified by AccuracyGoal
      and PrecisionGoal but was unable to find a sufficient decrease in the
      merit function. You may need more than MachinePrecision digits of
      working precision to meet these tolerances. >>




      Out[4]= 3.24659


      The correct answer is 5468.146427955789







      numerics probability-or-statistics precision-and-accuracy






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 17 at 16:56









      Mr.Wizard

      231k294761045




      231k294761045










      asked Jan 15 at 12:26









      Abdul HaqAbdul Haq

      192




      192






















          1 Answer
          1






          active

          oldest

          votes


















          5












          $begingroup$

          Use FindRoot directly with arbitrary-precision



          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          icdf = x /.
          FindRoot[CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], x] ==
          1 - α - (n - n1)/n2, {x, 500},
          WorkingPrecision -> $MachinePrecision]

          (* 5468.146403807255 *)


          Verifying,



          (CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], icdf] // 
          RootApproximant) === 1 - α - (n - n1)/n2

          (* True *)


          Note that while the starting value used in FindRoot needs to be large, it does not have to be particularly close to the actual value.



          EDIT: To "correct" the InverseCDF define your own function



          Clear["Global`*"]

          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          invCDF[dist_, q_, start_: 50, wkprec_: $MachinePrecision] :=
          Module[
          {x, distr = Rationalize[dist], qr = Rationalize[q]},
          Check[InverseCDF[dist, q],
          x /. FindRoot[CDF[distr, x] == qr, {x, start},
          WorkingPrecision -> wkprec]]]

          dist = NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2];


          Exact input to invCDF will output exact output (i.e., unevaluated for your example distribution). Since InverseCDF does not throw an error message, switching to FindRoot does not occur.



          invCDF[dist, 1 - α - (n - n1)/n2]

          (* InverseCDF[NoncentralFRatioDistribution[1, 3, 1600], 461/555] *)


          This is desired for less complicated distributions for which the InverseCDF is known, e.g.,



          invCDF[NormalDistribution, 3/4]

          (* Sqrt[2] InverseErfc[1/2] *)


          Converting the argument for your distribution to a numeric approximation will result in evaluation and the desired switching to FindRoot.



          invCDF[dist, 1 - α - (n - n1)/n2 // N] // Quiet

          (* 5468.146403807255 *)





          share|improve this answer











          $endgroup$













          • $begingroup$
            See edit for "corrected" function.
            $endgroup$
            – Bob Hanlon
            Jan 16 at 15:52










          • $begingroup$
            Thanks a lot for your effort. The problem is you have fixed the starting value at 50 in the findroot function, which will not be the good choice in general. The starting value maybe 0.5. It means, every time we need to put the correct starting value. The built-in inverseCDF function, however, doesn't require any starting value. The problem is thus still there!!
            $endgroup$
            – Abdul Haq
            Jan 17 at 20:19










          • $begingroup$
            The starting value is not fixed at 50 it defaults to 50. You can specify any starting value that you want. The default used by InverseCDF isn't working so I gave you the ability to specify one.
            $endgroup$
            – Bob Hanlon
            Jan 17 at 20:23











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "387"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f189524%2fproblem-with-the-inverse-cdf-of-non-central-f-ratio-distribution%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          5












          $begingroup$

          Use FindRoot directly with arbitrary-precision



          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          icdf = x /.
          FindRoot[CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], x] ==
          1 - α - (n - n1)/n2, {x, 500},
          WorkingPrecision -> $MachinePrecision]

          (* 5468.146403807255 *)


          Verifying,



          (CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], icdf] // 
          RootApproximant) === 1 - α - (n - n1)/n2

          (* True *)


          Note that while the starting value used in FindRoot needs to be large, it does not have to be particularly close to the actual value.



          EDIT: To "correct" the InverseCDF define your own function



          Clear["Global`*"]

          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          invCDF[dist_, q_, start_: 50, wkprec_: $MachinePrecision] :=
          Module[
          {x, distr = Rationalize[dist], qr = Rationalize[q]},
          Check[InverseCDF[dist, q],
          x /. FindRoot[CDF[distr, x] == qr, {x, start},
          WorkingPrecision -> wkprec]]]

          dist = NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2];


          Exact input to invCDF will output exact output (i.e., unevaluated for your example distribution). Since InverseCDF does not throw an error message, switching to FindRoot does not occur.



          invCDF[dist, 1 - α - (n - n1)/n2]

          (* InverseCDF[NoncentralFRatioDistribution[1, 3, 1600], 461/555] *)


          This is desired for less complicated distributions for which the InverseCDF is known, e.g.,



          invCDF[NormalDistribution, 3/4]

          (* Sqrt[2] InverseErfc[1/2] *)


          Converting the argument for your distribution to a numeric approximation will result in evaluation and the desired switching to FindRoot.



          invCDF[dist, 1 - α - (n - n1)/n2 // N] // Quiet

          (* 5468.146403807255 *)





          share|improve this answer











          $endgroup$













          • $begingroup$
            See edit for "corrected" function.
            $endgroup$
            – Bob Hanlon
            Jan 16 at 15:52










          • $begingroup$
            Thanks a lot for your effort. The problem is you have fixed the starting value at 50 in the findroot function, which will not be the good choice in general. The starting value maybe 0.5. It means, every time we need to put the correct starting value. The built-in inverseCDF function, however, doesn't require any starting value. The problem is thus still there!!
            $endgroup$
            – Abdul Haq
            Jan 17 at 20:19










          • $begingroup$
            The starting value is not fixed at 50 it defaults to 50. You can specify any starting value that you want. The default used by InverseCDF isn't working so I gave you the ability to specify one.
            $endgroup$
            – Bob Hanlon
            Jan 17 at 20:23
















          5












          $begingroup$

          Use FindRoot directly with arbitrary-precision



          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          icdf = x /.
          FindRoot[CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], x] ==
          1 - α - (n - n1)/n2, {x, 500},
          WorkingPrecision -> $MachinePrecision]

          (* 5468.146403807255 *)


          Verifying,



          (CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], icdf] // 
          RootApproximant) === 1 - α - (n - n1)/n2

          (* True *)


          Note that while the starting value used in FindRoot needs to be large, it does not have to be particularly close to the actual value.



          EDIT: To "correct" the InverseCDF define your own function



          Clear["Global`*"]

          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          invCDF[dist_, q_, start_: 50, wkprec_: $MachinePrecision] :=
          Module[
          {x, distr = Rationalize[dist], qr = Rationalize[q]},
          Check[InverseCDF[dist, q],
          x /. FindRoot[CDF[distr, x] == qr, {x, start},
          WorkingPrecision -> wkprec]]]

          dist = NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2];


          Exact input to invCDF will output exact output (i.e., unevaluated for your example distribution). Since InverseCDF does not throw an error message, switching to FindRoot does not occur.



          invCDF[dist, 1 - α - (n - n1)/n2]

          (* InverseCDF[NoncentralFRatioDistribution[1, 3, 1600], 461/555] *)


          This is desired for less complicated distributions for which the InverseCDF is known, e.g.,



          invCDF[NormalDistribution, 3/4]

          (* Sqrt[2] InverseErfc[1/2] *)


          Converting the argument for your distribution to a numeric approximation will result in evaluation and the desired switching to FindRoot.



          invCDF[dist, 1 - α - (n - n1)/n2 // N] // Quiet

          (* 5468.146403807255 *)





          share|improve this answer











          $endgroup$













          • $begingroup$
            See edit for "corrected" function.
            $endgroup$
            – Bob Hanlon
            Jan 16 at 15:52










          • $begingroup$
            Thanks a lot for your effort. The problem is you have fixed the starting value at 50 in the findroot function, which will not be the good choice in general. The starting value maybe 0.5. It means, every time we need to put the correct starting value. The built-in inverseCDF function, however, doesn't require any starting value. The problem is thus still there!!
            $endgroup$
            – Abdul Haq
            Jan 17 at 20:19










          • $begingroup$
            The starting value is not fixed at 50 it defaults to 50. You can specify any starting value that you want. The default used by InverseCDF isn't working so I gave you the ability to specify one.
            $endgroup$
            – Bob Hanlon
            Jan 17 at 20:23














          5












          5








          5





          $begingroup$

          Use FindRoot directly with arbitrary-precision



          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          icdf = x /.
          FindRoot[CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], x] ==
          1 - α - (n - n1)/n2, {x, 500},
          WorkingPrecision -> $MachinePrecision]

          (* 5468.146403807255 *)


          Verifying,



          (CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], icdf] // 
          RootApproximant) === 1 - α - (n - n1)/n2

          (* True *)


          Note that while the starting value used in FindRoot needs to be large, it does not have to be particularly close to the actual value.



          EDIT: To "correct" the InverseCDF define your own function



          Clear["Global`*"]

          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          invCDF[dist_, q_, start_: 50, wkprec_: $MachinePrecision] :=
          Module[
          {x, distr = Rationalize[dist], qr = Rationalize[q]},
          Check[InverseCDF[dist, q],
          x /. FindRoot[CDF[distr, x] == qr, {x, start},
          WorkingPrecision -> wkprec]]]

          dist = NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2];


          Exact input to invCDF will output exact output (i.e., unevaluated for your example distribution). Since InverseCDF does not throw an error message, switching to FindRoot does not occur.



          invCDF[dist, 1 - α - (n - n1)/n2]

          (* InverseCDF[NoncentralFRatioDistribution[1, 3, 1600], 461/555] *)


          This is desired for less complicated distributions for which the InverseCDF is known, e.g.,



          invCDF[NormalDistribution, 3/4]

          (* Sqrt[2] InverseErfc[1/2] *)


          Converting the argument for your distribution to a numeric approximation will result in evaluation and the desired switching to FindRoot.



          invCDF[dist, 1 - α - (n - n1)/n2 // N] // Quiet

          (* 5468.146403807255 *)





          share|improve this answer











          $endgroup$



          Use FindRoot directly with arbitrary-precision



          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          icdf = x /.
          FindRoot[CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], x] ==
          1 - α - (n - n1)/n2, {x, 500},
          WorkingPrecision -> $MachinePrecision]

          (* 5468.146403807255 *)


          Verifying,



          (CDF[NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2], icdf] // 
          RootApproximant) === 1 - α - (n - n1)/n2

          (* True *)


          Note that while the starting value used in FindRoot needs to be large, it does not have to be particularly close to the actual value.



          EDIT: To "correct" the InverseCDF define your own function



          Clear["Global`*"]

          n = 5; n1 = 4; n2 = 6; γ = 1/20; α = 1/370;

          invCDF[dist_, q_, start_: 50, wkprec_: $MachinePrecision] :=
          Module[
          {x, distr = Rationalize[dist], qr = Rationalize[q]},
          Check[InverseCDF[dist, q],
          x /. FindRoot[CDF[distr, x] == qr, {x, start},
          WorkingPrecision -> wkprec]]]

          dist = NoncentralFRatioDistribution[1, n1 - 1, n1/γ^2];


          Exact input to invCDF will output exact output (i.e., unevaluated for your example distribution). Since InverseCDF does not throw an error message, switching to FindRoot does not occur.



          invCDF[dist, 1 - α - (n - n1)/n2]

          (* InverseCDF[NoncentralFRatioDistribution[1, 3, 1600], 461/555] *)


          This is desired for less complicated distributions for which the InverseCDF is known, e.g.,



          invCDF[NormalDistribution, 3/4]

          (* Sqrt[2] InverseErfc[1/2] *)


          Converting the argument for your distribution to a numeric approximation will result in evaluation and the desired switching to FindRoot.



          invCDF[dist, 1 - α - (n - n1)/n2 // N] // Quiet

          (* 5468.146403807255 *)






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Jan 16 at 15:51

























          answered Jan 15 at 15:20









          Bob HanlonBob Hanlon

          59.9k33596




          59.9k33596












          • $begingroup$
            See edit for "corrected" function.
            $endgroup$
            – Bob Hanlon
            Jan 16 at 15:52










          • $begingroup$
            Thanks a lot for your effort. The problem is you have fixed the starting value at 50 in the findroot function, which will not be the good choice in general. The starting value maybe 0.5. It means, every time we need to put the correct starting value. The built-in inverseCDF function, however, doesn't require any starting value. The problem is thus still there!!
            $endgroup$
            – Abdul Haq
            Jan 17 at 20:19










          • $begingroup$
            The starting value is not fixed at 50 it defaults to 50. You can specify any starting value that you want. The default used by InverseCDF isn't working so I gave you the ability to specify one.
            $endgroup$
            – Bob Hanlon
            Jan 17 at 20:23


















          • $begingroup$
            See edit for "corrected" function.
            $endgroup$
            – Bob Hanlon
            Jan 16 at 15:52










          • $begingroup$
            Thanks a lot for your effort. The problem is you have fixed the starting value at 50 in the findroot function, which will not be the good choice in general. The starting value maybe 0.5. It means, every time we need to put the correct starting value. The built-in inverseCDF function, however, doesn't require any starting value. The problem is thus still there!!
            $endgroup$
            – Abdul Haq
            Jan 17 at 20:19










          • $begingroup$
            The starting value is not fixed at 50 it defaults to 50. You can specify any starting value that you want. The default used by InverseCDF isn't working so I gave you the ability to specify one.
            $endgroup$
            – Bob Hanlon
            Jan 17 at 20:23
















          $begingroup$
          See edit for "corrected" function.
          $endgroup$
          – Bob Hanlon
          Jan 16 at 15:52




          $begingroup$
          See edit for "corrected" function.
          $endgroup$
          – Bob Hanlon
          Jan 16 at 15:52












          $begingroup$
          Thanks a lot for your effort. The problem is you have fixed the starting value at 50 in the findroot function, which will not be the good choice in general. The starting value maybe 0.5. It means, every time we need to put the correct starting value. The built-in inverseCDF function, however, doesn't require any starting value. The problem is thus still there!!
          $endgroup$
          – Abdul Haq
          Jan 17 at 20:19




          $begingroup$
          Thanks a lot for your effort. The problem is you have fixed the starting value at 50 in the findroot function, which will not be the good choice in general. The starting value maybe 0.5. It means, every time we need to put the correct starting value. The built-in inverseCDF function, however, doesn't require any starting value. The problem is thus still there!!
          $endgroup$
          – Abdul Haq
          Jan 17 at 20:19












          $begingroup$
          The starting value is not fixed at 50 it defaults to 50. You can specify any starting value that you want. The default used by InverseCDF isn't working so I gave you the ability to specify one.
          $endgroup$
          – Bob Hanlon
          Jan 17 at 20:23




          $begingroup$
          The starting value is not fixed at 50 it defaults to 50. You can specify any starting value that you want. The default used by InverseCDF isn't working so I gave you the ability to specify one.
          $endgroup$
          – Bob Hanlon
          Jan 17 at 20:23


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Mathematica Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f189524%2fproblem-with-the-inverse-cdf-of-non-central-f-ratio-distribution%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Mario Kart Wii

          What does “Dominus providebit” mean?

          Antonio Litta Visconti Arese