Joint Maximum Likelihood Estimation
This function estimate unidimensional item response models with joint maximum likelihood (JML, see e.g. Linacre, 1994).
tam.jml(resp, group=NULL, adj=.3, disattenuate=FALSE, bias=TRUE,
    xsi.fixed=NULL, xsi.inits=NULL, theta.fixed=NULL, A=NULL, B=NULL, Q=NULL,
    ndim=1, pweights=NULL, constraint="cases", verbose=TRUE, control=list(), version=3)
## S3 method for class 'tam.jml'
summary(object, file=NULL, ...)
## S3 method for class 'tam.jml'
logLik(object, ...)| resp | A matrix of item responses. Missing responses must be declared
as  | 
| group | An optional vector of group identifier | 
| disattenuate | An optional logical indicating whether the person parameters should be disattenuated due to unreliability? The disattenuation is conducted by applying the Kelley formula. | 
| adj | Adjustment constant which is subtracted or added to extreme scores (score of zero or maximum score). The default is a value of 0.3 | 
| bias | A logical which indicates if JML bias should be reduced by multiplying item parameters by the adjustment factor of (I-1)/I | 
| xsi.fixed | An optional matrix with two columns for fixing some of the basis parameters ξ of item intercepts. 1st column: Index of ξ parameter, 2nd column: Fixed value of ξ parameter | 
| xsi.inits | An optional vector of initial ξ parameters. Note that
all parameters must be specified and the vector is not of the
same format as  | 
| theta.fixed | Matrix for fixed person parameters θ. The first
column includes the index whereas the second column includes
the fixed value. This argument can only be applied for  | 
| A | A design array A for item category intercepts. For item i and category k, the threshold is specified as ∑ _j a_{ikj} ξ_j. | 
| B | A design array for scoring item category responses. Entries in B represent item loadings on abilities θ. | 
| Q | A Q-matrix which defines loadings of items on dimensions. | 
| ndim | Number of dimensions in the model. The default is 1. | 
| pweights | An optional vector of person weights. | 
| constraint | Type of constraint for means. Either  | 
| verbose | Logical indicating whether output should
be printed during iterations. This argument replaces  | 
| control | A list of control arguments. See  | 
| version | Version function which should be used.  | 
| object | Object of class  | 
| file | A file name in which the summary output will be written
(only for  | 
| ... | Further arguments to be passed | 
A list with following entries
| item1 | Data frame with item parameters | 
| xsi | Vector of item parameters ξ | 
| errorP | Standard error of item parameters ξ | 
| theta | MLE in final step | 
| errorWLE | Standard error of WLE | 
| WLE | WLE in last iteration | 
| WLEreliability | WLE reliability | 
| PersonScores | Scores for each person (sufficient statistic) | 
| ItemScore | Sufficient statistic for each item parameter | 
| PersonMax | Maximum person score | 
| ItemMax | Maximum item score | 
| deviance | Deviance | 
| deviance.history | Deviance history in iterations | 
| resp | Original data frame | 
| resp.ind | Response indicator matrix | 
| group | Vector of group identifiers (if provided as an argument) | 
| pweights | Vector of person weights | 
| A | Design matrix A of item intercepts | 
| B | Loading (or scoring) matrix B | 
| nitems | Number of items | 
| maxK | Maximum number of categories | 
| nstud | Number of persons in  | 
| resp.ind.list | Like  | 
| xsi.fixed | Fixed ξ item parameters | 
| control | Control list | 
| item | Extended data frame of item parameters | 
| theta_summary | Summary of person parameters | 
| ... | 
This joint maximum likelihood estimation procedure should be compatible with Winsteps and Facets software, see also http://www.rasch.org/software.htm.
Linacre, J. M. (1994). Many-Facet Rasch Measurement. Chicago: MESA Press.
For estimating the same class of models with marginal
maximum likelihood estimation see tam.mml.
#############################################################################
# EXAMPLE 1: Dichotomous data
#############################################################################
data(data.sim.rasch)
resp <- data.sim.rasch[1:700, seq( 1, 40, len=10)  ]  # subsample
# estimate the Rasch model with JML (function 'tam.jml')
mod1a <- TAM::tam.jml(resp=resp)
summary(mod1a)
itemfit <- TAM::tam.fit(mod1a)$fit.item
# compare results with Rasch model estimated by MML
mod1b <- TAM::tam.mml(resp=resp )
# constrain item difficulties to zero
mod1c <- TAM::tam.jml(resp=resp, constraint="items")
# plot estimated parameters
plot( mod1a$xsi, mod1b$xsi$xsi, pch=16,
    xlab=expression( paste( xi[i], " (JML)" )),
    ylab=expression( paste( xi[i], " (MML)" )),
    main="Item Parameter Estimate Comparison")
lines( c(-5,5), c(-5,5), col="gray" )
# Now, the adjustment pf .05 instead of the default .3 is used.
mod1d <- TAM::tam.jml(resp=resp, adj=.05)
# compare item parameters
round( rbind( mod1a$xsi, mod1d$xsi ), 3 )
  ##          [,1]   [,2]   [,3]   [,4]   [,5]  [,6]  [,7]  [,8]  [,9] [,10]
  ##   [1,] -2.076 -1.743 -1.217 -0.733 -0.338 0.147 0.593 1.158 1.570 2.091
  ##   [2,] -2.105 -1.766 -1.233 -0.746 -0.349 0.139 0.587 1.156 1.574 2.108
# person parameters for persons with a score 0, 5 and 10
pers1 <- data.frame( "score_adj0.3"=mod1a$PersonScore, "theta_adj0.3"=mod1a$theta,
           "score_adj0.05"=mod1d$PersonScore, "theta_adj0.05"=mod1d$theta  )
round( pers1[ c(698, 683, 608), ],3  )
  ##       score_adj0.3 theta_adj0.3 score_adj0.05 theta_adj0.05
  ##   698          0.3       -4.404          0.05        -6.283
  ##   683          5.0       -0.070          5.00        -0.081
  ##   608          9.7        4.315          9.95         6.179
## Not run: 
#*** item fit and person fit statistics
fmod1a <- TAM::tam.jml.fit(mod1a)
head(fmod1a$fit.item)
head(fmod1a$fit.person)
#*** Models in which some item parameters are fixed
xsi.fixed <- cbind( c(1,3,9,10), c(-2, -1.2, 1.6, 2 ) )
mod1e <- TAM::tam.jml( resp=resp, xsi.fixed=xsi.fixed )
summary(mod1e)
#*** Model in which also some person parameters theta are fixed
# fix theta parameters of persons 2, 3, 4 and 33 to values -2.9, ...
theta.fixed <- cbind( c(2,3,4,33), c( -2.9, 4, -2.9, -2.9 ) )
mod1g <- TAM::tam.jml( resp=resp, xsi.fixed=xsi.fixed, theta.fixed=theta.fixed )
# look at estimated results
ind.person <- c( 1:5, 30:33 )
cbind( mod1g$WLE, mod1g$errorWLE )[ind.person,]
#############################################################################
# EXAMPLE 2: Partial credit model
#############################################################################
data(data.gpcm, package="TAM")
dat <- data.gpcm
# JML estimation
mod2 <- TAM::tam.jml(resp=dat)
mod2$xsi     # extract item parameters
summary(mod2)
TAM::tam.fit(mod2)    # item and person infit/outfit statistic
#* estimate rating scale model
A <- TAM::designMatrices(resp=dat, modeltype="RSM")$A
#* estimate model with design matrix A
mod3 <- TAM::tam.jml(dat, A=A)
summary(mod3)
#############################################################################
# EXAMPLE 3: Facet model estimation using joint maximum likelihood
#            data.ex10; see also Example 10 in ?tam.mml
#############################################################################
data(data.ex10)
dat <- data.ex10
  ## > head(dat)
  ##  pid rater I0001 I0002 I0003 I0004 I0005
  ##    1     1     0     1     1     0     0
  ##    1     2     1     1     1     1     0
  ##    1     3     1     1     1     0     1
  ##    2     2     1     1     1     0     1
  ##    2     3     1     1     0     1     1
facets <- dat[, "rater", drop=FALSE ] # define facet (rater)
pid <- dat$pid      # define person identifier (a person occurs multiple times)
resp <- dat[, -c(1:2) ]        # item response data
formulaA <- ~ item * rater      # formula
# use MML function only to restructure data and input obtained design matrices
# and processed response data to tam.jml (-> therefore use only 2 iterations)
mod3a <- TAM::tam.mml.mfr( resp=resp, facets=facets, formulaA=formulaA,
             pid=dat$pid,  control=list(maxiter=2) )
# use modified response data mod3a$resp and design matrix mod3a$A
resp1 <- mod3a$resp
# JML
mod3b <- TAM::tam.jml( resp=resp1, A=mod3a$A, control=list(maxiter=200) )
#############################################################################
# EXAMPLE 4: Multi faceted model with some anchored item and person parameters
#############################################################################
data(data.exJ03)
resp <- data.exJ03$resp
X <- data.exJ03$X
#*** (0) preprocess data with TAM::tam.mml.mfr
mod0 <- TAM::tam.mml.mfr( resp=resp, facets=X, pid=X$rater,
                formulaA=~ leader + item + step,
                control=list(maxiter=2) )
summary(mod0)
#*** (1) estimation with tam.jml (no parameter fixings)
# extract processed data and design matrix from tam.mml.mfr
resp1 <- mod0$resp
A1 <- mod0$A
# estimate model with tam.jml
mod1 <- TAM::tam.jml( resp=resp1, A=A1, control=list( Msteps=4, maxiter=100 ) )
summary(mod1)
#*** (2) fix some parameters (persons and items)
# look at indices in mod1$xsi
mod1$xsi
# fix step parameters
xsi.index1 <- cbind( 21:25, c( -2.44, 0.01, -0.15, 0.01,  1.55 ) )
# fix some item parameters of items 1,2,3,6 and 13
xsi.index2 <- cbind( c(1,2,3,6,13), c(-2,-1,-1,-1.32, -1 ) )
xsi.index <- rbind( xsi.index1, xsi.index2 )
# fix some theta parameters of persons 1, 15 and 20
theta.fixed <- cbind(  c(1,15,20), c(0.4, 1, 0 ) )
# estimate model, theta.fixed only works for version=1
mod2 <- TAM::tam.jml( resp=resp1, A=A1, xsi.fixed=xsi.fixed, theta.fixed=theta.fixed,
            control=list( Msteps=4, maxiter=100) )
summary(mod2)
cbind( mod2$WLE, mod2$errorWLE )
## End(Not run)Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.