Re: FindFit, Weibull

*To*: mathgroup at smc.vnet.net*Subject*: [mg92900] Re: [mg92868] FindFit, Weibull*From*: Darren Glosemeyer <darreng at wolfram.com>*Date*: Fri, 17 Oct 2008 05:25:03 -0400 (EDT)*References*: <200810160904.FAA18690@smc.vnet.net>

P_ter wrote: > I found some data which seemed to fit a WeibullDistribution. The data are: > pr= {16, 34, 53, 75, 93, 120}; > After adding the median rank to the data: > praxis={{16, 0.109101}, {34, 0.26445}, {53, 0.421407}, {75, 0.578593}, {93, 0.73555}, {120, 0.890899}}; > I checked with LeastSquares the parameters: > \[Alpha]=1.4301;\[Beta] = 76.318. > So far ok. > But the following did not work: > fit2 = {a, b} /. FindFit[praxis, CDF[WeibullDistribution[a, b], x], {a ,b}, {x}] > > So, I used the parameters in the Weibull CDF and the times from pr to get: > praxis1= {{16, 0.106157}, {34, 0.27559}, {53, 0.451308}, {75, 0.623149}, {93, 0.73256}, {120, 0.848082}} > (something went wrong with editing, so maybe I sent a by accident an unfinished message) > I checked with FindFit and it worked. But then I gave extra some variations: > praxis2 = {#, RandomReal[{0.95, 1.05}] CDF[WeibullDistribution[1.4, 76.318], #]} & /@ pr; > fit4 = {a,b} /. FindFit[praxis2, CDF[WeibullDistribution[a,b], x], {a,b}, {x}] > After a few times trying the two above lines FindFit did not work. > It could be ok. But it seems to me that FindFit with a such a small relative variation in the data from 0.95 to 1.05 should still work. > How can I use FindFit in the case of praxis in a safe way? > Thanks in advance. > P_ter > There are two problems I can see. First, a and b need to be constrained to be positive. The FindFit::nrlnum message and failure happen because the algorithm reaches a negative value of b, which results in complex values. Second, the default starting values of 1 for each parameter are far from the optimum curve. With better non-default starting values a good result can be obtained. In[1]:= praxis = {{16, 0.109101}, {34, 0.26445}, {53, 0.421407}, {75, 0.578593}, {93, 0.73555}, {120, 0.890899}}; In[2]:= fit2 = FindFit[ praxis, {CDF[WeibullDistribution[a, b], x], a > 0 && b > 0}, {{a, 1}, {b, 80}}, {x}] Out[2]= {a -> 1.52051, b -> 77.4766} Note that the result given is different from the least squares result quoted in your message. In[3]:= ls = {a -> 1.4301, b -> 76.318} Out[3]= {a -> 1.4301, b -> 76.318} If we check the sum of squared errors, we see that the FindFit result gives a smaller value and so is a better fit in the sense of distance from the cdf curve. In[4]:= Map[((CDF[WeibullDistribution[a, b], #[[1]]] /. fit2) - #[[2]])^2 &, praxis] // Total Out[4]= 0.0032187 In[5]:= Map[((CDF[WeibullDistribution[a, b], #[[1]]] /. ls) - #[[2]])^2 &, praxis] // Total Out[5]= 0.00426419 I suspect the least squares solution given solves a slightly different problem, that is to say the condition for optimality for that solution is probably something other than minimizing the sum of squared errors from the cdf. Darren Glosemeyer Wolfram Research

**References**:**FindFit, Weibull***From:*P_ter <petervansummeren@gmail.com>