MATLAB Answers

Fit data to beta distribution

조회 수: 37(최근 30일)
Noam Omer
Noam Omer 18 Feb 2021
댓글: Noam Omer 24 Feb 2021
I'm trying to fit beta distribution parameters to a [1X60] size vector (provided below as x) using betafit() funciton but the obtained parameters do not make sense (alpha=0.3840 beta= 23.4999), presenting a distribution which is far from representing the data. Nevertheless, by manually selecting the parameters (alpha=3 beta=3.5) I was managed to get a propper fit quite easily.
Is there any automated way to fit propper beta distribution parameters for this vector?
(I was able to simulate data from beta distribution and fit it successfully with this function, but from some reason the function is "not working" when applied to my data)
Thanks
The vector
x=[0.033280 0.049990 0.074000 0.082480 0.086050 0.082780 0.077200 0.067750 0.059840 0.053020 0.046540 0.041610 0.031640 0.027930 0.023980 0.021130 ...
0.018620 0.013620 0.011490 0.009930 0.008620 0.007670 0.005640 0.004970 0.004370 0.003880 0.003340 0.003230 0.002870 0.002580 0.002390 0.002180 ...
0.001490 0.001330 0.001160 0.001000 0.000920 0.000810 0.000730 0.000650 0.000570 0.000520 0.000450 0.000400 0.000370 0.000360 0.000310 0.000270
000290 0.000280 0.000260 0.000270 0.000240 0.000200 0.000160 0.000150 0.000130 0.000160 0.000820 0.001010];
The time vector
t=[0 0.0169491525423729 0.0338983050847458 0.0508474576271187 0.0677966101694915 0.0847457627118644 0.101694915254237 0.118644067796610 0.135593220338983 0.152542372881356 0.169491525423729 0.186440677966102 0.203389830508475 0.220338983050847 0.237288135593220 0.254237288135593 0.271186440677966 0.288135593220339 0.305084745762712 0.322033898305085 0.338983050847458 0.355932203389831 0.372881355932203 0.389830508474576 0.406779661016949 0.423728813559322 0.440677966101695 0.457627118644068 0.474576271186441 0.491525423728814 0.508474576271186 0.525423728813559 0.542372881355932 0.559322033898305 0.576271186440678 0.593220338983051 0.610169491525424 0.627118644067797 0.644067796610169 0.661016949152542 0.677966101694915 0.694915254237288 0.711864406779661 0.728813559322034 0.745762711864407 0.762711864406780 0.779661016949153 0.796610169491525 0.813559322033898 0.830508474576271 0.847457627118644 0.864406779661017 0.881355932203390 0.898305084745763 0.915254237288136 0.932203389830508 0.949152542372881 0.966101694915254 0.983050847457627 1];
Code line
betafit(x)
Output
ans =
0.3840 23.4999
  댓글 수: 3
Ive J
Ive J 21 Feb 2021
I believe there is a misunderstanding here. betafit gives you MLE parameters best fitted to your x vector and not t.
x_new = linspace(min(x), max(x), 100);
pd = betafit(x);
yAutoFit = betapdf(x_new, pd(1), pd(1));
yManFit = betapdf(x_new, 2, 15);
histogram(x)
line(x_new, yAutoFit, 'color', 'k', 'LineWidth', 1.5)
line(x_new, yManFit, 'color', 'r', 'LineWidth', 1.5)

댓글을 달려면 로그인하십시오.

채택된 답변

Jeff Miller
Jeff Miller 22 Feb 2021
There is information here about how to fit a univariate distribution from an empirical CDFs with MATLAB. Unfortunately, it is a bit complicated because the beta distribution belongs to the group of "Non-Location-Scale Families" discussed starting about half-way down the page.
Alternatively, you could use Cupid, with commands something like this:
x = x / sum(x); % normalize for sum to 1
ECDF = cumsum(x);
myBeta = Beta(1,1); % arbitrary starting parameters
myBeta.EstPctile(t,ECDF) % Estimate parameters from the ECDF, which produces estimates of 1.1889,7.985
myBeta.PlotDens
This produces the attached graph.
I don't think this is quite right, though, because I don't think the t values and probabilities correspond exactly. In particular, I doubt that you really have a probability of 0.033280 at exactly t=0, since that is the minimum for the beta distribution.
  댓글 수: 1
Noam Omer
Noam Omer 24 Feb 2021
Thanks for introducing me the Cupid- it was what I needed.
Problem solved!

댓글을 달려면 로그인하십시오.

추가 답변(2개)

Noam Omer
Noam Omer 21 Feb 2021
It seems like I did not explain myself well enough.
The time vector (t) indicates time intervals and x indicates the number of observations which ocurred during each time interval e.g., between times t(1)=0 and t(2)=0.0169491525423729 the relative number of observations was 3.33280% (in percentage out of the total number of observations).
Based on your answer I understand that the betafit may not be helpful for my task. So, assuming that I don't have the raw data but only the distribution of the data, do you know any funciton that might to the job?
Thanks
  댓글 수: 1
Jeff Miller
Jeff Miller 21 Feb 2021
Sorry, I misunderstood the original question. I thought x gave data values and did not realize they gave bin probabilities, with t defining the bin boundaries. betafit would only be appropriate with the data values, not the bin probabilities.
Since you have only bins and their probabilties, your best bet is to estimate from the empirical CDF:
But if the x values represent observed bin probabilities, why don't they sum to 1?

댓글을 달려면 로그인하십시오.


Noam Omer
Noam Omer 22 Feb 2021
Thanks because I manually excluded an outlier from measurement. To overcome this x could be normalized: x/sum(x).
Any suggestion how to estimate from the empirical CDF?
Thanks

Community Treasure Hunt

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

Start Hunting!

Translated by