Converting a lavaan Model into a mirt Model
Converts a lavaan
model into a mirt
model.
Optionally, the model can be estimated with the
mirt::mirt
function
(est.mirt=TRUE
) or just mirt
syntax
is generated (est.mirt=FALSE
).
Extensions of the lavaan
syntax include guessing and slipping
parameters (operators ?=g1
and ?=s1
)
and a shortage operator for item groups (see __
).
See TAM::lavaanify.IRT
for more details.
lavaan2mirt(dat, lavmodel, est.mirt=TRUE, poly.itemtype="gpcm", ...)
dat |
Dataset with item responses |
lavmodel |
Model specified in |
est.mirt |
An optional logical indicating whether the model
should be estimated with |
poly.itemtype |
Item type for polytomous data. This can
be |
... |
Further arguments to be passed for estimation in
|
This function uses the lavaan::lavaanify
(lavaan) function.
Only single group models are supported (for now).
A list with following entries
mirt |
Object generated by |
mirt.model |
Generated |
mirt.syntax |
Generated |
mirt.pars |
Generated parameter specifications
in |
lavaan.model |
Used |
dat |
Used dataset. If necessary, only items used in the model are included in the dataset. |
See https://lavaan.ugent.be/ for lavaan resources.
See https://groups.google.com/forum/#!forum/lavaan
for discussion about the lavaan package.
See mirt.wrapper
for convenience wrapper functions
for mirt::mirt
objects.
See TAM::lavaanify.IRT
for extensions of lavaanify
.
See tam2mirt
for converting fitted objects in the TAM
package into fitted mirt::mirt
objects.
## Not run: ############################################################################# # EXAMPLE 1: Convert some lavaan syntax to mirt syntax for data.read ############################################################################# library(mirt) data(data.read) dat <- data.read #****************** #*** Model 1: Single factor model lavmodel <- " # omit item C3 F=~ A1+A2+A3+A4 + C1+C2+C4 + B1+B2+B3+B4 F ~~ 1*F " # convert syntax and estimate model res <- sirt::lavaan2mirt( dat, lavmodel, verbose=TRUE, technical=list(NCYCLES=3) ) # inspect coefficients coef(res$mirt) mirt.wrapper.coef(res$mirt) # converted mirt model and parameter table cat(res$mirt.syntax) res$mirt.pars #****************** #*** Model 2: Rasch Model with first six items lavmodel <- " F=~ a*A1+a*A2+a*A3+a*A4+a*B1+a*B2 F ~~ 1*F " # convert syntax and estimate model res <- sirt::lavaan2mirt( dat, lavmodel, est.mirt=FALSE) # converted mirt model cat(res$mirt.syntax) # mirt parameter table res$mirt.pars # estimate model using generated objects res2 <- mirt::mirt( res$dat, res$mirt.model, pars=res$mirt.pars ) mirt.wrapper.coef(res2) # parameter estimates #****************** #*** Model 3: Bifactor model lavmodel <- " G=~ A1+A2+A3+A4 + B1+B2+B3+B4 + C1+C2+C3+C4 A=~ A1+A2+A3+A4 B=~ B1+B2+B3+B4 C=~ C1+C2+C3+C4 G ~~ 1*G A ~~ 1*A B ~~ 1*B C ~~ 1*C " res <- sirt::lavaan2mirt( dat, lavmodel, est.mirt=FALSE ) # mirt syntax and mirt model cat(res$mirt.syntax) res$mirt.model res$mirt.pars #****************** #*** Model 4: 3-dimensional model with some parameter constraints lavmodel <- " # some equality constraints among loadings A=~ a*A1+a*A2+a2*A3+a2*A4 B=~ B1+B2+b3*B3+B4 C=~ c*C1+c*C2+c*C3+c*C4 # some equality constraints among thresholds A1 | da*t1 A3 | da*t1 B3 | da*t1 C3 | dg*t1 C4 | dg*t1 # standardized latent variables A ~~ 1*A B ~~ 1*B C ~~ 1*C # estimate Cov(A,B) and Cov(A,C) A ~~ B A ~~ C # estimate mean of B B ~ 1 " res <- sirt::lavaan2mirt( dat, lavmodel, verbose=TRUE, technical=list(NCYCLES=3) ) # estimated parameters mirt.wrapper.coef(res$mirt) # generated mirt syntax cat(res$mirt.syntax) # mirt parameter table mirt::mod2values(res$mirt) #****************** #*** Model 5: 3-dimensional model with some parameter constraints and # parameter fixings lavmodel <- " A=~ a*A1+a*A2+1.3*A3+A4 # set loading of A3 to 1.3 B=~ B1+1*B2+b3*B3+B4 C=~ c*C1+C2+c*C3+C4 A1 | da*t1 A3 | da*t1 C4 | dg*t1 B1 | 0*t1 B3 | -1.4*t1 # fix item threshold of B3 to -1.4 A ~~ 1*A B ~~ B # estimate variance of B freely C ~~ 1*C A ~~ B # estimate covariance between A and B A ~~ .6 * C # fix covariance to .6 A ~ .5*1 # set mean of A to .5 B ~ 1 # estimate mean of B " res <- sirt::lavaan2mirt( dat, lavmodel, verbose=TRUE, technical=list(NCYCLES=3) ) mirt.wrapper.coef(res$mirt) #****************** #*** Model 6: 1-dimensional model with guessing and slipping parameters #****************** lavmodel <- " F=~ c*A1+c*A2+1*A3+1.3*A4 + C1__C4 + a*B1+b*B2+b*B3+B4 # guessing parameters A1+A2 ?=guess1*g1 A3 ?=.25*g1 B1+C1 ?=g1 B2__B4 ?=0.10*g1 # slipping parameters A1+A2+C3 ?=slip1*s1 A3 ?=.02*s1 # fix item intercepts A1 | 0*t1 A2 | -.4*t1 F ~ 1 # estimate mean of F F ~~ 1*F # fix variance of F " # convert syntax and estimate model res <- sirt::lavaan2mirt( dat, lavmodel, verbose=TRUE, technical=list(NCYCLES=3) ) # coefficients mirt.wrapper.coef(res$mirt) # converted mirt model cat(res$mirt.syntax) ############################################################################# # EXAMPLE 2: Convert some lavaan syntax to mirt syntax for # longitudinal data data.long ############################################################################# data(data.long) dat <- data.long[,-1] #****************** #*** Model 1: Rasch model for T1 lavmodel <- " F=~ 1*I1T1 +1*I2T1+1*I3T1+1*I4T1+1*I5T1+1*I6T1 F ~~ F " # convert syntax and estimate model res <- sirt::lavaan2mirt( dat, lavmodel, verbose=TRUE, technical=list(NCYCLES=20) ) # inspect coefficients mirt.wrapper.coef(res$mirt) # converted mirt model cat(res$mirt.syntax) #****************** #*** Model 2: Rasch model for two time points lavmodel <- " F1=~ 1*I1T1 +1*I2T1+1*I3T1+1*I4T1+1*I5T1+1*I6T1 F2=~ 1*I3T2 +1*I4T2+1*I5T2+1*I6T2+1*I7T2+1*I8T2 F1 ~~ F1 F1 ~~ F2 F2 ~~ F2 # equal item difficulties of same items I3T1 | i3*t1 I3T2 | i3*t1 I4T1 | i4*t1 I4T2 | i4*t1 I5T1 | i5*t1 I5T2 | i5*t1 I6T1 | i6*t1 I6T2 | i6*t1 # estimate mean of F1, but fix mean of F2 F1 ~ 1 F2 ~ 0*1 " # convert syntax and estimate model res <- sirt::lavaan2mirt( dat, lavmodel, verbose=TRUE, technical=list(NCYCLES=20) ) # inspect coefficients mirt.wrapper.coef(res$mirt) # converted mirt model cat(res$mirt.syntax) #-- compare estimation with smirt function # define Q-matrix I <- ncol(dat) Q <- matrix(0,I,2) Q[1:6,1] <- 1 Q[7:12,2] <- 1 rownames(Q) <- colnames(dat) colnames(Q) <- c("T1","T2") # vector with same items itemnr <- as.numeric( substring( colnames(dat),2,2) ) # fix mean at T2 to zero mu.fixed <- cbind( 2,0 ) # estimate model in smirt mod1 <- sirt::smirt(dat, Qmatrix=Q, irtmodel="comp", est.b=itemnr, mu.fixed=mu.fixed ) summary(mod1) ############################################################################# # EXAMPLE 3: Converting lavaan syntax for polytomous data ############################################################################# data(data.big5) # select some items items <- c( grep( "O", colnames(data.big5), value=TRUE )[1:6], grep( "N", colnames(data.big5), value=TRUE )[1:4] ) # O3 O8 O13 O18 O23 O28 N1 N6 N11 N16 dat <- data.big5[, items ] library(psych) psych::describe(dat) #****************** #*** Model 1: Partial credit model lavmodel <- " O=~ 1*O3+1*O8+1*O13+1*O18+1*O23+1*O28 O ~~ O " # estimate model in mirt res <- sirt::lavaan2mirt( dat, lavmodel, technical=list(NCYCLES=20), verbose=TRUE) # estimated mirt model mres <- res$mirt # mirt syntax cat(res$mirt.syntax) ## O=1,2,3,4,5,6 ## COV=O*O # estimated parameters mirt.wrapper.coef(mres) # some plots mirt::itemplot( mres, 3 ) # third item plot(mres) # item information plot(mres,type="trace") # item category functions # graded response model with equal slopes res1 <- sirt::lavaan2mirt( dat, lavmodel, poly.itemtype="graded", technical=list(NCYCLES=20), verbose=TRUE ) mirt.wrapper.coef(res1$mirt) #****************** #*** Model 2: Generalized partial credit model with some constraints lavmodel <- " O=~ O3+O8+O13+a*O18+a*O23+1.2*O28 O ~ 1 # estimate mean O ~~ O # estimate variance # some constraints among thresholds O3 | d1*t1 O13 | d1*t1 O3 | d2*t2 O8 | d3*t2 O28 | (-0.5)*t1 " # estimate model in mirt res <- sirt::lavaan2mirt( dat, lavmodel, technical=list(NCYCLES=5), verbose=TRUE) # estimated mirt model mres <- res$mirt # estimated parameters mirt.wrapper.coef(mres) #*** generate syntax for mirt for this model and estimate it in mirt package # Items: O3 O8 O13 O18 O23 O28 mirtmodel <- mirt::mirt.model( " O=1-6 # a(O18)=a(O23), t1(O3)=t1(O18), t2(O3)=t2(O8) CONSTRAIN=(4,5,a1), (1,3,d1), (1,2,d2) MEAN=O COV=O*O ") # initial table of parameters in mirt mirt.pars <- mirt::mirt( dat[,1:6], mirtmodel, itemtype="gpcm", pars="values") # fix slope of item O28 to 1.2 ind <- which( ( mirt.pars$item=="O28" ) & ( mirt.pars$name=="a1") ) mirt.pars[ ind, "est"] <- FALSE mirt.pars[ ind, "value"] <- 1.2 # fix d1 of item O28 to -0.5 ind <- which( ( mirt.pars$item=="O28" ) & ( mirt.pars$name=="d1") ) mirt.pars[ ind, "est"] <- FALSE mirt.pars[ ind, "value"] <- -0.5 # estimate model res2 <- mirt::mirt( dat[,1:6], mirtmodel, pars=mirt.pars, verbose=TRUE, technical=list(NCYCLES=4) ) mirt.wrapper.coef(res2) plot(res2, type="trace") ## End(Not run)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.