/* Do file to fit 2-level 2PL model from: Jeon, M. and Rabe-Hesketh, S. (2012). Profile-likelihood approach for estimating generalized linear mixed models with factor structures. Journal of Educational and Behavioral Statistics 37, 518-542. http://dx.doi.org/10.3102/1076998611417628 */ set memory 500m /* not needed from Stata 12 */ insheet using cito_final.csv ********************************************************************** ** Version 1: use constraints to get same loadings ** at both levels eq alp: i1-i18 constraint def 2 [sid1_1l]i2 = [sch2_1l]i2 constraint def 3 [sid1_1l]i3 = [sch2_1l]i3 constraint def 4 [sid1_1l]i4 = [sch2_1l]i4 constraint def 5 [sid1_1l]i5 = [sch2_1l]i5 constraint def 6 [sid1_1l]i6 = [sch2_1l]i6 constraint def 7 [sid1_1l]i7 = [sch2_1l]i7 constraint def 8 [sid1_1l]i8 = [sch2_1l]i8 constraint def 9 [sid1_1l]i9 = [sch2_1l]i9 constraint def 10 [sid1_1l]i10 = [sch2_1l]i10 constraint def 11 [sid1_1l]i11 = [sch2_1l]i11 constraint def 12 [sid1_1l]i12 = [sch2_1l]i12 constraint def 13 [sid1_1l]i13 = [sch2_1l]i13 constraint def 14 [sid1_1l]i14 = [sch2_1l]i14 constraint def 15 [sid1_1l]i15 = [sch2_1l]i15 constraint def 16 [sid1_1l]i16 = [sch2_1l]i16 constraint def 17 [sid1_1l]i17 = [sch2_1l]i17 constraint def 18 [sid1_1l]i18 = [sch2_1l]i18 * here we use 7 quadrature points at level 2 and 5 at level 3 * (the paper used 8 at each level and this will take 80% longr * but the estimates are quite close gllamm y i1-i18, nocons link(logit) fam(bin) i(sid school) /// eqs(alp alp) constr(2/18) adapt nip(7 5) estimates store multirt1 *************************************************************************** ** Version 2: use B matrix to get same loadings ** at both levels * regress student-level latent variable on school-level latent variable matrix bb = (0,1 \ 0,0) constraint define 1 [b1_2]_cons=1 * discrimination parameters for student-level latent variable eq alp: i1-i18 * school-level latent variable not directly measured generate zero = 0 eq schload: zero gllamm y i1-i18, nocons link(logit) fam(bin) i(sid school) /// eqs(alp schload) bmatrix(bb) constr(1) adapt nip(5 7) /* paper used nip(8) */ estimates store multirt2 estimates table multirt1 multirt2