Problems using `fitdist` to Rician distribution

5 Ansichten (letzte 30 Tage)
Morten Nissov
Morten Nissov am 8 Jun. 2021
Kommentiert: Jeff Miller am 10 Jun. 2021
I am having some problems fitting a rician distribution to a set of positive values. Attempting to make the fit returns
>> p_hat = fitdist(data, 'Rician')
Error using prob.RicianDistribution>checkargs (line 197)
The parameter S must be a nonnegative finite numeric scalar.
Error in prob.RicianDistribution (line 101)
checkargs(s,sigma)
Error in prob.RicianDistribution.makeFitted (line 175)
pd = prob.RicianDistribution(p(1),p(2));
Error in prob.RicianDistribution.fit (line 157)
pd = prob.RicianDistribution.makeFitted(p,nll,cov,x,cens,freq);
Error in fitdist>localfit (line 245)
pd = feval(fitter,x,'cens',c,'freq',f,varargin{:});
Error in fitdist (line 192)
pd = localfit(dist,fitter,x,cens,freq,args{:});
looking at the histogram the data itself looks plausibly Rician, if you ask me. At least close enough such that it should be able to fit parameters.
  1 Kommentar
Scott MacKenzie
Scott MacKenzie am 8 Jun. 2021
I have an observation, but no answer unfortunately.
If you add 1 to data then the fitdist function succeeds. There are no negative values in the sample data, so it is not clear why this works, but it does. Good luck.
load data; % your data
data = data + 1; % no error if data shifted up by 1
pd = fitdist(data, 'rician');
x_values = linspace(min(data), max(data));
y = pdf(pd,x_values);
plot(x_values,y,'LineWidth',2)

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Jeff Miller
Jeff Miller am 9 Jun. 2021
I'm not sure why you are getting that error message, but Rician(6.5538e-05,0.11714) looks quite good:
In case you are curious, to get that, I used the following with Cupid:
load('temp');
histogram(data,'normalization','pdf');
ricianMatlab = makedist('Rician','s',1,'sigma',1);
ricianCupid = dMATLABc(ricianMatlab,'rr',[eps eps],[+inf +inf]);
ricianCupid.EstML(data)
% ans = 'Rician(6.5538e-05,0.11714)'
x=0.001:0.01:0.5;
pdfx = ricianCupid.PDF(x);
hold on
plot(x,pdfx,'-')
  3 Kommentare
Morten Nissov
Morten Nissov am 9 Jun. 2021
Update: cupid actually didn't work particularly well for me, lots of time spent on "nonconverging solutions", and the fmincon based implementation I made works much faster.
That being said it does not arrive at the same scale value, instead finding
s, sigma = [0.004262570706511949018835405667005, 0.11710438287452787364806283676444]
where the negative log-likelihoods of the fits are
  • mine: -1.1845646696986895651804161389009
  • cupid: -1.1845646810421814887348546108115
Jeff Miller
Jeff Miller am 10 Jun. 2021
Yes, I also got some complaints from fminsearch.
Great that your fmincon based implementation works faster, but doesn't it look like cupid finds slightly better estimates (i.e., search ending in a slightly lower min)?

Melden Sie sich an, um zu kommentieren.

Produkte


Version

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by