ACTUALIZADO
Estoy tratando de encontrar el máximo de estimación de la probabilidad de una función de distribución de probabilidad dada a continuación
g(x)=1Γ(α)γ2α2α−1x2α−1exp{−x22γ2}IIR+(x)g(x)=1Γ(α)γ2α2α−1x2α−1exp{−x22γ2}IIR+(x)
donde α>0α>0 es la forma de parámetros, σ>0σ>0 es el parámetro de escala.
La función de probabilidad está dada entonces por
L(α,γ/x)=n∏i=11Γ(α)γ2α2α−1x2α−1iexp{−x2i2γ2}L(α,γ/x)=n∏i=11Γ(α)γ2α2α−1x2α−1iexp{−x2i2γ2}
Por lo tanto, la probabilidad de la función es entonces L(α,γ/x)=1[Γ(α)]nγ2αn2nα−nexp{−12γ2n∑i=1x2i}(n∏i=1xi)2α−1L(α,γ/x)=1[Γ(α)]nγ2αn2nα−nexp{−12γ2n∑i=1x2i}(n∏i=1xi)2α−1
Ahora, la función de verosimilitud logarítmica denotado por ℓℓ es
ℓ=log[L(α,γ/x)]=−nlog(Γ(α))−2αnlog(γ)−n(α−1)log(2)−12γ2n∑i=1x2i+(2α−1)n∑i=1log(xi)
Las entradas de la puntuación de la función está dada por
∂ℓ∂α=−nψ(α)−2nlog(γ)−nlog(2)+2n∑i=1log(xi) donde ψ(α) es la función digamma y
∂ℓ∂γ=−2αnγ+n∑i=1x2iγ3
La configuración de estas dos ecuaciones a cero y resolver simultáneamente los resultados en un máximo de estimaciones de probabilidad (MLE) de los parámetros, ˆαˆγ. Sin embargo, las ecuaciones obtenidas mediante la configuración de las anteriores derivadas parciales a cero no son en forma cerrada y los valores de los parámetros de α γ debe encontrarse mediante métodos iterativos.
Matriz de información de Fisher se define como Iij=−E{∂2ℓ∂τi∂τjlog[L(xi,→τ)] } dondeτ1=ατ2=γ. Por lo tanto, la matriz de información para la gamma-distribución de rayleigh es dada por,
I=n[ψ1(α)2/γ2/γ4α/γ2]
Estoy tratando de usar Fisher Scoring para encontrar Emv de los parámetros. Aquí está mi código de MATLAB. Yo primero generar 1000 observaciones aleatorias a partir de la gamma-distribución y de ejecutar este código. Mis valores de partida y el resto se da en el código.
clear all;
clc;
%Simulate 1000 sample from Gamma Distribution
n=1000;
alpha=3;
lambda=0.05;
x=gamrnd(alpha,1/lambda,1,n);
figure(1)
histfit(x,8,'gam');
sumlogx=sum(log(x)); sumxsquare=sum(x.^2);
%Initial Values
alpha=mean(x)^2/var(x);
gam=mean(x)/var(x);
theta=[alpha; gam];
S=Inf;
while sum(abs(S) > 10^(-5)) > 0
S=[-n*psi(theta(1))-2*n*log(theta(2))-n*log(2)+2*sumlogx;...
(-2*theta(1)*n/theta(2))+(sumxsquare/(theta(2)^3))];
FIM=n*[psi(1, theta(1)), 2/theta(2);...
2/theta(2), 4*theta(1)/(theta(2)^2)];
theta=theta + FIM\S;
end
alpha_hat=theta(1)
gam_hat=theta(2)
fprintf('alpha_hat=%g, gamma_hat=%g \n', theta(1),theta(2))
Pero por algunas razones que no puedo entender, me estoy poniendo "Error en la utilización de psi X debe ser no negativo." error. Mi α de los valores están siendo negativa en la iteración de alguna manera, y no sé cómo solucionarlo!
Yo también soy ejecución de Newton-Raphson cuyo código de MATLAB es la siguiente
clear all;
clc;
%Simulate 100 sample from Gamma Distribution
n=1000;
alpha=3;
lambda=0.05;
x=gamrnd(alpha,1/lambda,1,n);
figure(1)
histfit(x,8,'gam');
sumlogx=sum(log(x)); sumxsquare=sum(x.^2);
%tuning parameters scale=gamma; shape=alpha
itermin=10^-7;
maxiter=10^7;
sc_init=0.000001;
sh_init=0.000001;
converged=[0;0;sc_init;sh_init];
% pdf
pdf=@(x,gam,alpha) 1/(gamma(alpha)*(gam^(2*alpha))*(2^(alpha-1)))*(x^(2*alpha-1))*exp(-(x^2)/(2*(gam^2)));
%score function is the first partial derivative of the log likelihood function
score=@(gam,alpha) -n*psi(alpha)-2*n*log(gam)-n*log(2)+2*sumlogx;
%Hessian function is the negative of the 2nd
hessian=@(gam,alpha) psi(1, alpha);
sc_loop=2;
scale_hat=zeros(1,maxiter);
scale_hat(1)=sc_init;
while 1==1
sh_loop=2;
shape_hat=zeros(1,maxiter);
shape_hat(1)=sh_init;
while 1==1
%calculate chat as chat_prev+score(chat_prev)/hessian(chat_prev)
shape_hat(sh_loop)=shape_hat(sh_loop-1)+score(scale_hat(sc_loop-1),shape_hat(sh_loop-1))/hessian(scale_hat(sc_loop-1),shape_hat(sh_loop-1));
%test for a convergence
if abs(shape_hat(sh_loop)-shape_hat(sh_loop-1))<itermin
break %the process converged to a c value
elseif sh_loop>maxiter
disp(['max iteration on \alpha achieved:', num2str(maxiter)]);
return
end
sh_loop=sh_loop+1;
end
scale_hat(sc_loop)=(sum(x.^shape_hat(sh_loop-1))/n)^(1/shape_hat(sh_loop-1));
%test for a convergence
if abs(scale_hat(sc_loop)-scale_hat(sc_loop-1))<itermin
break %the process converged to a gamma value
end
converged=[converged,[sc_loop-1;sh_loop-1;scale_hat(sc_loop);shape_hat(sh_loop)]];
sc_loop=sc_loop+1;
end
%final display
disp(repmat('-',[1,30])),disp(' Iteration Scale Shape'),disp(repmat('-',[1,30]))
disp(num2str(converged','%6.4f')),disp(repmat('-',[1,30]))
disp(['Real values: gamma=', num2str(gam),',alpha=',num2str(alpha)])
Estoy recibiendo el mismo "Error en la utilización de psi, X debe ser no negativo." error.
Podría usted ayudarme? Algo está mal con psi función y no sé. Tal vez debería usar la aproximación, pero no estoy seguro de cuánta de la información que voy a perder!