| [av,gv,th_m,th_s,av_m,av_s2]=item_r_h(y,ab,m) |
function [av,gv,th_m,th_s,av_m,av_s2]=item_r_h(y,ab,m)
% item_r_h - fits a 2-parameter probit item response model of the form
%
% p_ij = phi(a_i t_j - g_i)
%
% where the a_i are iid N(m, s)
% m is flat, and variance s^2 is Inverse Gamma(a,b)
%
% command: [av,gv,th_m,th_s,av_m,av_s2]=item_r_h(y,ab,m)
%
% input: y - binary data matrix where rows are subjects and columns are items
% ab - vector [a b] of hyperparameters of prior on variance s^2
% m - number of iterations (default is 500)
%
% output: av - matrix of simulated values of a_i - each row is a simulated vector
% gv - matrix of simulated values of g_i
% th_m, th_s - vectors of means and standard deviations of the t_j
% av_m - vector of simulated values of hyperparameter m
% av_s2 - vector of simulated values of hyperparameter s^2
if nargin==2, m=500; end % default is 500 Gibbs cycles
s=size(y); n=s(1); k=s(2);
pa=ab(1); pb=ab(2);
mu=0; var=1; % hyperparameters of theta prior
a=2*ones(1,k); %
phat=(sum(y)+.5)/(n+1); % initial estimates
g=-phiinv(phat)*sqrt(5); %
th=zeros(n,1); %
a_m=mean(a);
a_s2=1;
av=zeros(m,k); %
gv=av; % set up storage
th_m=zeros(1,n); %
th_s=zeros(1,n); %
av_s2=zeros(m,1); %
av_m=zeros(m,1); %
h=waitbar(0,'Simulation in progress');
for kk=1:m % MAIN ITERATION LOOP
lp=th*a-ones(n,1)*g; %
bb=phi(-lp); % simulate latent
u=rand(n,k); % data z
tt=(bb.*(1-y)+(1-bb).*y).*u+bb.*y; %
z=phiinv(tt)+lp; %
v=1/sum(a.^2); %
pvar=1/(1/v+1/var); % simulate theta
mn=sum(((ones(n,1)*a).*(z+ones(n,1)*g))')'; % assuming N(mu,var) prior
pmean=(mn+mu/var)*pvar; %
th=randn(n,1)*sqrt(pvar)+pmean; %
x=[th -ones(n,1)]; %
pp=[1/a_s2 0;0 0]; % prior precison matrix
pm=[a_m 0]'; % prior mean vector
amat=chol(inv(x'*x+pp)); %
bz=(x'*x+pp)\(x'*z+pp*pm*ones(1,k)); % simulate {alpha, gamma)
beta=amat'*randn(2,k)+bz; %
a=beta(1,:); g=beta(2,:); %
a_m=mean(a)+randn*sqrt(a_s2/k);
b1=pb+.5*sum((a-a_m).^2);
a1=pa+k/2;
a_s2=b1/rgam(1,a1);
av(kk,:)=a; %
gv(kk,:)=g; % store simulated values
th_m=th_m+th'; %
th_s=th_s+th'.^2; %
av_s2(kk)=a_s2;
av_m(kk)=a_m;
waitbar(kk/m);
end
close(h)
th_m=th_m/m; % compute mean and standard
th_s=sqrt(th_s.^2/m-th_m.^2); % deviation of simulated theta values
t='1';
for i=2:k
t=str2mat(t,num2str(i));
end
clf
gm=mean(gv); am=mean(av);
gr=max(gm)-min(gm); ar=max(am)-min(am);
ax=[min(gm)-.1*gr max(gm)+.1*gr min(am)-.1*ar max(am)+.1*ar];
text(mean(gv),mean(av),t)
axis(ax)
xlabel('DIFFICULTY');ylabel('DISCRIMINATION')
function val=phi(x)
val=.5*(1+erf(x/sqrt(2)));
function val=phiinv(x)
val=sqrt(2)*erfinv(2*x-1);
function rn=rgam(n,alpha)
% generates a vector of n gamma(alpha) variates
a=alpha-1;
rn=zeros(n,1);
while prod(rn)==0
v1=-log(rand(n,1));
v2=-log(rand(n,1));
id=v2>=(a*(v1-log(v1)-1));
rn=rn+v1.*id.*(rn==0);
end
rn=rn*alpha;
|
|