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 - 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 - 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 - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....