function Mb=b_probg(data,m); % B_PROBIT Produces a simulated sample from a probit regression model % using a Gibbs sampling/data augmentation algorithm. % (allows for grouped data) % % input data = [y n x] = [observed_proportions sample_sizes cov_matrix] % simulates probit model (vague prior) using data augmentation % output: % Mb - matrix of simulated values of beta %------------------------------------------------------------- % Jim Albert - May 15, 1998 %------------------------------------------------------------- [N,q1]=size(data); q=q1-2; Y=data(:,1); X=data(:,3:q1); n=data(:,2); % 'MAXIMUM LIKELIHOOD:' [b0,var,dr,drs,dev,h]=probit(data); % STARTING VALUES beta=b0; y=[]; x=[]; for i=1:N s=round(n(i)*Y(i)); f=round(n(i)*(1-Y(i))); y=[y;ones(s,1);zeros(f,1)]; x=[x;ones(n(i),1)*X(i,:)]; end NN=sum(n); Mb=zeros(m,q); aa=chol(inv(x'*x)); h=waitbar(0,'Simulation running ...'); for i=1:m lp=x*beta; % bb=phi(-lp); % SIMULATE tt=(bb.*(1-y)+(1-bb).*y).*rand(NN,1)+bb.*y; % Z z=phiinv(tt)+lp; % mn=(x'*x)\(x'*z); % SIMULATE beta=aa'*randn(q,1)+mn; % BETA Mb(i,:)=beta'; waitbar(i/m) end close(h) function [beta,var,dr,drs,dev,h]=probit(data,b1) % % data matrix of form [y | x] - y is observed proportion % sample size vector n % s=size(data); k=s(2); y=data(:,1); n=data(:,2); x=data(:,3:k); p=(n.*y+.5)./(n+1); eta=phiinv(p); der=pdfnorm(eta); if nargin==1 w=diag(n.*(der.^2)./p./(1-p)); z=eta+(y-p)./der; b1=(x'*w*x)\(x'*w*z); end b0=zeros(size(b1)); % % loop until convergence % it=0; while it<=10 b0=b1; eta=x*b0; p=phi(eta); der=pdfnorm(eta); z=eta+(y-p)./der; w=diag(n.*(der.^2)./p./(1-p)); b1=(x'*w*x)\(x'*w*z); it=it+1; end beta=b1; var=inv(x'*w*x); o1=fix(n.*y+.5); o2=fix(n.*(1-y)+.5); f1=n.*p; f2=n.*(1-p); 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)); w1=sqrt(n.*(der.^2)./p./(1-p)); h=diag(w1)*x*inv(x'*w*x)*x'*diag(w1); drs=dr./sqrt(1-diag(h)); dev=sum(dr.^2); 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);