Estimates the bifactor model and exploratory factor analysis with marginal maximum likelihood estimation.

This function is simply a wrapper to tam.mml or tam.mml.2pl.

tam.fa(resp, irtmodel, dims=NULL, nfactors=NULL, pid=NULL,
    pweights=NULL, verbose=TRUE, control=list(), ...)

Arguments

resp

Data frame with polytomous item responses \(k=0,...,K\). Missing responses must be declared as NA.

irtmodel

A string which defines the IRT model to be estimated. Options are "efa" (exploratory factor analysis), "bifactor1" (Rasch testlet model in case of dichotomous data; Wang & Wilson, 2005; for polytomous data it assumes item slopes of 1) and "bifactor2" (bifactor model). See Details for more information.

dims

A numeric or string vector which only applies in case of irtmodel="bifactor1" or irtmodel="bifactor2". Different entries in the vector indicate different dimensions of items which should load on the nested factor. If items should only load on the general factor, then an NA must be specified.

nfactors

A numerical value which indicates the number of factors in exploratory factor analysis.

pid

An optional vector of person identifiers

pweights

An optional vector of person weights

verbose

Logical indicating whether output should be printed during iterations. This argument replaces control$progress.

control

See tam.mml for more details. Note that the default is Quasi Monte Carlo integration with 1500 nodes (snodes=1500, QMC=TRUE).

...

Further arguments to be passed. These arguments are used in tam.mml and tam.mml.2pl. For example, beta.inits or xsi.inits can be supplied.

Details

The exploratory factor analysis (irtmodel="efa" is estimated using an echelon form of the loading matrix and uncorrelated factors. The obtained standardized loading matrix is rotated using oblimin rotation. In addition, a Schmid-Leimann transformation (see Revelle & Zinbarg, 2009) is employed.

The bifactor model (irtmodel="bifactor2"; Reise 2012) for dichotomous responses is defined as $$logit P(X_{pi}=1 | \theta_{pg}, u_{p1}, \ldots, u_{pD} )= a_{i0} \theta_{pg} + a_{i1} u_{pd(i) } $$ Items load on the general factor \(\theta_{pg}\) and a specific (nested) factor \(u_{pd(i) }\). All factors are assumed to be uncorrelated.

In the Rasch testlet model (irtmodel="bifactor1"), all item slopes are set to 1 and variances are estimated.

For polytomous data, the generalized partial credit model is used. The loading structure is defined in the same way as for dichotomous data.

Value

The same list entries as in tam.mml but in addition the following statistics are included:

B.stand

Standardized factor loadings of the bifactor model or the exploratory factor analysis.

B.SL

In case of exploratory factor analysis (irtmodel="efa"), loadings form the Schmid-Leimann solution of the psych package.

efa.oblimin

Output from oblimin rotation in exploratory factor analysis which is produced by the GPArotation package

meas

Vector of dimensionality and reliability statistics. Included are the ECV measure (explained common variation; Reise, Moore & Haviland, 2010; Reise, 2012), \(\omega_t\) (Omega Total), \(\omega_a\) (Omega asymptotic) and \(\omega_h\) (Omega hierarchical) (Revelle & Zinbarg, 2009). The reliability of the sum score based on the bifactor model for dichotomous item responses is also included (Green & Yang, 2009).

References

Green, S. B., & Yang, Y. (2009). Reliability of summed item scores using structural equation modeling: An alternative to coefficient alpha. Psychometrika, 74, 155-167. doi:10.1007/s11336-008-9099-3

Reise, S. P. (2012). The rediscovery of bifactor measurement models. Multivariate Behavioral Research, 47(5), 667-696. doi:10.1080/00273171.2012.715555

Reise, S. P., Moore, T. M., & Haviland, M. G. (2010). Bifactor models and rotations: Exploring the extent to which multidimensional data yield univocal scale scores. Journal of Personality Assessment, 92(6), 544-559. doi:10.1080/00223891.2010.496477

Revelle, W., & Zinbarg, R. E. (2009). Coefficients alpha, beta, omega and the glb: Comments on Sijtsma. Psychometrika, 74(1), 145-154. doi:10.1007/s11336-008-9102-z

Wang, W.-C., & Wilson, M. (2005). The Rasch testlet model. Applied Psychological Measurement, 29(2), 126-149. doi:10.1177/0146621604271053

See also

For more details see tam.mml because tam.fa is just a wrapper for tam.mml.2pl and tam.mml.

logLik.tam, anova.tam

Examples

if (FALSE) {
#############################################################################
# EXAMPLE 1: Dataset reading from sirt package
#############################################################################

data(data.read,package="sirt")
resp <- data.read

#***
# Model 1a: Exploratory factor analysis with 2 factors
mod1a <- TAM::tam.fa( resp=resp, irtmodel="efa", nfactors=2  )
summary(mod1a)
# varimax rotation
stats::varimax(mod1a$B.stand)
# promax rotation
stats::promax(mod1a$B.stand)
# more rotations are included in the GPArotation package
library(GPArotation)
# geomin rotation oblique
GPArotation::geominQ( mod1a$B.stand )
# quartimin rotation
GPArotation::quartimin( mod1a$B.stand )

#***
# Model 1b: Rasch testlet model with 3 testlets
dims <- substring( colnames(resp),1,1 )     # define dimensions
mod1b <- TAM::tam.fa( resp=resp, irtmodel="bifactor1", dims=dims )
summary(mod1b)

#***
# Model 1c: Bifactor model
mod1c <- TAM::tam.fa( resp=resp, irtmodel="bifactor2", dims=dims )
summary(mod1c)

#***
# Model 1d: reestimate Model 1c but assume that items 3 and 5 do not load on
#           specific factors
dims1 <- dims
dims1[c(3,5)] <- NA
mod1d <- TAM::tam.fa( resp=resp, irtmodel="bifactor2", dims=dims1 )
summary(mod1d)

#############################################################################
# EXAMPLE 2: Polytomous data
#############################################################################

data(data.timssAusTwn.scored, package="TAM")
dat <- data.timssAusTwn.scored
resp <- dat[, grep("M0", colnames(dat))]

#***
# Model 1a: Rasch testlet model with 2 testlets
dims <- c( rep(1,5), rep(2,6))
mod1a <- TAM::tam.fa( resp=resp, irtmodel="bifactor1", dims=dims )
summary(mod1a)

#***
# Model 1b: Bifactor model
mod1b <- TAM::tam.fa( resp=resp, irtmodel="bifactor2", dims=dims )
summary(mod1b)
}