if (FALSE) {
#############################################################################
# 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")
}
Run the code above in your browser using DataLab