No BSD License  

Highlights from
Ordinal Data Modeling

image thumbnail
from Ordinal Data Modeling by Valen Johnson
Companion Software

[beta,var,fp,dev_df,pr,dr,adr]=breg_mle(data,link)
function [beta,var,fp,dev_df,pr,dr,adr]=breg_mle(data,link)

% MLE Finds maximum likelihood estimates for a binary regression model
%
%  [BETA,VAR,FP,DEV_DF,PR,DR,ADR]=mle(DATA,LINK) returns mle BETA, variance-
%  covariance matrix VAR, fitted probabilities FP, deviance and degrees of
%  freedom DEV_DF, Pearson residuals PR, deviance residuals DR, adjusted deviance
%  residuals ADR, where DATA is data matrix [y n x], and LINK is the link function
%  'l' (logit), 'p', (probit), or 'c' (complementary log-log).

%-------------------------------------------------------------  
%  Jim Albert - May 15, 1998
%-------------------------------------------------------------

s=size(data); k=s(2);
y=data(:,1); n=data(:,2); x=data(:,3:k);

p=(n.*y+.5)./(n+1);
eta=gi(p,link); de=d(eta,link);
w=diag(n.*de.^2./p./(1-p));
z=eta+(y-p)./de;
b1=(x'*w*x)\(x'*w*z);
b0=zeros(size(b1));
%
% loop until convergence
%
it=0;
while (it<=10)*(norm(b1-b0)>.001*norm(b0))
	b0=b1;
	eta=x*b0;
   p=g(eta,link); de=d(eta,link); 
   w=diag(n.*de.^2./p./(1-p));
   z=eta+(y-p)./de;
   b1=(x'*w*x)\(x'*w*z);
	it=it+1;
end
beta=b1;
var=inv(x'*w*x);

eta=x*beta;
fp=g(eta,link);

pr=n.*(y-fp)./sqrt(n.*fp.*(1-fp));

o1=fix(n.*y+.5); o2=fix(n.*(1-y)+.5);
f1=n.*fp; f2=n.*(1-fp);

i1=(o1==0); i2=(o2==0); i3=(o1>0)&(o2>0);
dr=zeros(size(o1));
o=o1(i3); f=f1(i3); N=n(i3);
dr(i3)=((o>f)-(f>o)).*sqrt(2*o.*log(o./f)+2*(N-o).*log((N-o)./(N-f)));
o=o1(i1); f=f1(i1); N=n(i1);
dr(i1)=-sqrt(2*N.*log(N./(N-f)));
o=o1(i2); f=f1(i2); N=n(i2);
dr(i2)=sqrt(2*N.*log(N./f));

adr=dr+(1-2*fp)./(6*sqrt(n.*fp.*(1-fp)));

dev=sum(dr.^2); df=s(1)-length(beta);
dev_df=[dev df];


function eta=gi(p,link)

if link=='l'
   eta=log(p./(1-p));
elseif link=='p'
   eta=phiinv(p);
elseif link=='c'
   eta=log(-log(1-p));
end

function p=g(eta,link)

if link=='l'
   p=exp(eta)./(1+exp(eta));
elseif link=='p'
   p=phi(eta);
elseif link=='c'
   p=1-exp(-exp(eta));
end

function val=d(eta,link)

if link=='l'
   p=exp(eta)./(1+exp(eta));
   val=p.*(1-p);
elseif link=='p'
   val=pdfnorm(eta);
elseif link=='c'
   val=exp(eta-exp(eta));
end

function val=pdfnorm(x,mu,sigma)

if nargin==1, mu=0; sigma=1; end

val=1/sqrt(2*pi)./sigma.*exp(-.5./sigma.^2.*(x-mu).^2);

function val=phi(x)
val=.5*(1+erf(x/sqrt(2)));

function val=phiinv(x)
val=sqrt(2)*erfinv(2*x-1);

Contact us at files@mathworks.com