function [phat, pci] = betafit(x,alpha)
%BETAFIT Parameter estimates and confidence intervals for beta distributed data.
% BETAFIT(X) Returns the maximum likelihood estimates of the
% parameters of the beta distribution given the data in the vector, X.
%
% [PHAT, PCI] = BETAFIT(X,ALPHA) gives MLEs and 100(1-ALPHA)
% percent confidence intervals given the data. By default, the
% optional parameter ALPHA = 0.05 corresponding to 95% confidence intervals.
%
% This function requires all X values to be greater than 0 and
% less than 1. You can restrict the fit to valid values by typing
%
% BETAFIT(X(X>0 & X<1))
%
% If values are equal to 0 or 1 up to a precision of 1e-6, you
% can round the X values away from 0 and 1 by typing
%
% BETAFIT(MAX(1e-6, MIN(1-1e-6,X)))
%
% See also BETACDF, BETAINV, BETALIKE, BETAPDF, BETARND, BETASTAT, MLE.
% Reference:
% [1] Hahn, Gerald J., & Shapiro, Samuel, S.
% "Statistical Models in Engineering", Wiley Classics Library
% John Wiley & Sons, New York. 1994 p. 95.
% Copyright 1993-2004 The MathWorks, Inc.
% $Revision: 2.15.2.2 $ $Date: 2004/07/05 17:02:13 $
if nargin < 2
alpha = 0.05;
end
p_int = [alpha/2; 1-alpha/2];
if min(size(x)) > 1
error('stats:betafit:VectorRequired','The first input must be a vector.');
end
x = x(~isnan(x));
if ((min(x) <= 0) | (max(x) >= 1))
error('stats:betafit:BadData',...
'All values must be larger than 0 and smaller than 1.');
end
n = length(x);
if (min(x) == max(x))
error('stats:betafit:BadData',...
'Cannot fit a beta distribution if all values are the same.');
end
% Initial Estimates.
tmp1 = prod((1-x) .^ (1/n));
tmp2 = prod(x .^ (1/n));
tmp3 = (1 - tmp1 - tmp2);
ahat = 0.5*(1-tmp1) / tmp3;
bhat = 0.5*(1-tmp2) / tmp3;
%this sets up constraint to be >1 for both alpha and beta
ahat = ahat-1;
if ahat<1 ahat=0; end
bhat = bhat-1;
if bhat<1 bhat=0; end
pstart = [ahat bhat];
ld = sum(log(x));
l1d = sum(log(1-x));
phat = fminsearch(@betalik2,pstart,optimset('display','none'),ld,l1d,n);
if nargout == 2
[logL,info]=betalike(phat,x);
sigma = sqrt(diag(info));
pci = norminv([p_int p_int],[phat; phat],[sigma';sigma']);
end