Problem with the Inverse CDF of Non-central F Ratio Distribution
$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
numerics probability-or-statistics precision-and-accuracy
$endgroup$
add a comment |
$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
numerics probability-or-statistics precision-and-accuracy
$endgroup$
add a comment |
$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
numerics probability-or-statistics precision-and-accuracy
$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
numerics probability-or-statistics precision-and-accuracy
edited Jan 17 at 16:56
Mr.Wizard♦
231k294761045
231k294761045
asked Jan 15 at 12:26
Abdul HaqAbdul Haq
192
192
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
$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 *)
$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 at50
it defaults to50
. You can specify any starting value that you want. The default used byInverseCDF
isn't working so I gave you the ability to specify one.
$endgroup$
– Bob Hanlon
Jan 17 at 20:23
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
$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 *)
$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 at50
it defaults to50
. You can specify any starting value that you want. The default used byInverseCDF
isn't working so I gave you the ability to specify one.
$endgroup$
– Bob Hanlon
Jan 17 at 20:23
add a comment |
$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 *)
$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 at50
it defaults to50
. You can specify any starting value that you want. The default used byInverseCDF
isn't working so I gave you the ability to specify one.
$endgroup$
– Bob Hanlon
Jan 17 at 20:23
add a comment |
$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 *)
$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 *)
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 at50
it defaults to50
. You can specify any starting value that you want. The default used byInverseCDF
isn't working so I gave you the ability to specify one.
$endgroup$
– Bob Hanlon
Jan 17 at 20:23
add a comment |
$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 at50
it defaults to50
. You can specify any starting value that you want. The default used byInverseCDF
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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