Skip to main content

probability or statistics - FindDistributionParameters fails with custom distribution?


Context


I would like to find the MaximumLikelihood solution of a customized PDF


Let's start with a built in PDF. Following the documentation


dat = RandomVariate[LaplaceDistribution[2, 1], 1000];
param=FindDistributionParameters[dat, LaplaceDistribution[μ, σ],
ParameterEstimator -> {"MaximumLikelihood", Method -> "NMaximize"}]


(* {μ->2.27258,σ->0.521354} *)


Show[Plot[
PDF[LaplaceDistribution[μ, σ] /. param, x], {x, -5, 5}],
Histogram[dat, Automatic, "PDF"]]

Mathematica graphics


works as expected. It finds a good estimator of $\mu$ and $\sigma$.


The problem


Now let me do the same with a customized PDF. Here I just impose that my custom PDF cannot be evaluated before it is given numerical values.


Clear[myLaplaceDistribution];

myLaplaceDistribution[μ_?NumberQ, σ_?NumberQ] :=
LaplaceDistribution[μ, σ]

Then


dat = RandomVariate[LaplaceDistribution[2, 1], 10];
FindDistributionParameters[dat, myLaplaceDistribution[μ, σ],
ParameterEstimator -> {"MaximumLikelihood", Method -> "NMaximize"}]

does not return a maximum likelihood estimate.


I am using 10.3.0 for Mac OS X x86 (64-bit) (October 9, 2015)



Question:



Any suggestions on how to make FindDistributionParameters work with unevaluated PDFs?



PS: I am aware of this https://mathematica.stackexchange.com/a/107914/1089 but here this question is a bit more general than simply a transformed distribution? And I have tried


dat = RandomVariate[LaplaceDistribution[2, 1], 10];
FindDistributionParameters[dat,
myLaplaceDistribution[μ, σ], {{μ,
Mean[dat]}, {σ, Mean[dat]}},
ParameterEstimator -> {"MaximumLikelihood", Method -> "NMaximize"}]


it does not seems to help.


Update


This related answer https://mathematica.stackexchange.com/a/61426/1089 does not seem to help.


If I define explicitly the domain for the PDF


  Clear[myLaplaceDistribution2];
myLaplaceDistribution2[μ_?NumberQ, σ_?NumberQ] :=
ProbabilityDistribution[
PDF[LaplaceDistribution[μ, σ], x], {x, -Infinity,
Infinity}, Assumptions -> (μ ∈ Reals && σ > 0)]


It still fails


dat = RandomVariate[LaplaceDistribution[2, 1], 10];
FindDistributionParameters[dat,
myLaplaceDistribution2[μ, σ], {{μ,
Mean[dat]}, {σ, Mean[dat]}},
ParameterEstimator -> {"MaximumLikelihood", Method -> "NMaximize"}]

As @J.M. points out one can use the fact that Mathematica can cope with the fact the PDF need not be normalized. As follows


Clear[myLaplaceDistribution3];

myLaplaceDistribution3[μ_, σ_] =
ProbabilityDistribution[
2 PDF[LaplaceDistribution[μ, σ],
x], {x, -∞, ∞},
Assumptions -> (μ ∈ Reals && σ > 0),
Method -> "Normalize"]

(Note the factor of 2 in front of PDF to make the PDF not normalized.)


Then


dat = RandomVariate[LaplaceDistribution[2, 1], 10];

FindDistributionParameters[dat, myLaplaceDistribution3[μ, σ],
ParameterEstimator -> {"MaximumLikelihood"}]

works.



I still think there must be situations where the PDF cannot be known before its arguments are known, and where Maximum likelihood analysis would make sense?



Note that I can always make my own:


MyFindDistributionParameters[data_, distrib_, var_] :=
NMaximize[{Total[Log@ PDF[distrib, #] & /@ data],

DistributionParameterAssumptions[distrib]}, var][[2]];

MyFindDistributionParameters[dat,LaplaceDistribution[μ, σ], {μ, σ}]

but I was hoping Mathematica would provide me with a more efficient algorithm? (this seems to be 10 times slower than the built in function).



Answer



If you follow @J.M. 's advice removing ?NumberQ from the definition of the probability distribution makes everything work fine:


Clear[myLaplaceDistribution];
SeedRandom[12345];
myLaplaceDistribution[μ_, σ_] := LaplaceDistribution[μ, σ]

dat = RandomVariate[LaplaceDistribution[2, 1], 10];
FindDistributionParameters[dat, myLaplaceDistribution[μ, σ],
ParameterEstimator -> {"MaximumLikelihood", Method -> "NMaximize"}]
(* {μ -> 1.8804870321227085,σ -> 0.7153183538699862} *)

I don't know what you mean by "Here I just impose that my custom PDF cannot be evaluated before it is given numerical values." Your first example doesn't have the two parameters evaluated as numbers and it works fine:


param=FindDistributionParameters[dat, LaplaceDistribution[μ, σ],
ParameterEstimator -> {"MaximumLikelihood", Method -> "NMaximize"}]

Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Adding a thick curve to a regionplot

Suppose we have the following simple RegionPlot: f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}] Now I'm trying to change the curve defined by $y=g[x]$ into a thick black curve, while leaving all other boundaries in the plot unchanged. I've tried adding the region $y=g[x]$ and playing with the plotstyle, which didn't work, and I've tried BoundaryStyle, which changed all the boundaries in the plot. Now I'm kinda out of ideas... Any help would be appreciated! Answer With f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 You can use Epilog to add the thick line: RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}, PlotPoints -> 50, Epilog -> (Plot[g[x], {x, 0, 2}, PlotStyle -> {Black, Thick}][[1]]), PlotStyle -> {Directive[Yellow, Opacity[0.4]], Directive[Pink, Opacity[0.4]],