TAM — tam.linking" />
tam.linking.Rd
Performs linking of fitted unidimensional item response models in TAM
according to the Stocking-Lord and the Haebara method (Kolen & Brennan, 2014;
Gonzales & Wiberg, 2017).
Several studies can either be linked by a chain of linkings of two studies
(method="chain"
) or a joint linking approach (method="joint"
)
comprising all pairwise linkings.
The linking of two studies is implemented in the tam_linking_2studies
function.
tam.linking(tamobj_list, type="Hae", method="joint", pow_rob_hae=1, eps_rob_hae=1e-4, theta=NULL, wgt=NULL, wgt_sd=2, fix.slope=FALSE, elim_items=NULL, par_init=NULL, verbose=TRUE) # S3 method for tam.linking summary(object, file=NULL, ...) # S3 method for tam.linking print(x, ...) tam_linking_2studies( B1, AXsi1, guess1, B2, AXsi2, guess2, theta, wgt, type, M1=0, SD1=1, M2=0, SD2=1, fix.slope=FALSE, pow_rob_hae=1) # S3 method for tam_linking_2studies summary(object, file=NULL, ...) # S3 method for tam_linking_2studies print(x, ...)
tamobj_list | List of fitted objects in TAM |
---|---|
type | Type of linking method: |
method | Chain linking ( |
pow_rob_hae | Power for robust Heabara linking |
eps_rob_hae | Value \(\varepsilon\) for numerical approximation of loss function \(|x|^p\) in robust Haebara linking |
theta | Grid of \(\theta\) points. The default is |
wgt | Weights defined for the |
wgt_sd | Standard deviation for \(\theta\) grid used for linking function |
fix.slope | Logical indicating whether the slope transformation constant is fixed to 1. |
elim_items | List of vectors refering to items which should be removed from linking (see Model 'lmod2' in Example 1) |
par_init | Optional vector with initial parameter values |
verbose | Logical indicating progress of linking computation |
object | Object of class |
x | Object of class |
file | A file name in which the summary output will be written |
... | Further arguments to be passed |
B1 | Array \(B\) for first study |
AXsi1 | Matrix \(A \xi\) for first study |
guess1 | Guessing parameter for first study |
B2 | Array \(B\) for second study |
AXsi2 | Matrix \(A \xi\) for second study |
guess2 | Guessing parameter for second study |
M1 | Mean of first study |
SD1 | Standard deviation of first study |
M2 | Mean of second study |
SD2 | Standard deviation of second study |
The Haebara linking is defined by minimizing the loss function
$$\sum_i \sum_k \int \left ( P_{ik} ( \theta ) - P_{ik}^\ast ( \theta ) \right )^2 $$
A robustification of Haebara linking minimizes the loss function
$$\sum_i \sum_k \int \left ( P_{ik} ( \theta ) - P_{ik}^\ast ( \theta ) \right )^p $$
with a power \(p\) (defined in pow_rob_hae
) smaller than 2. He, Cui and
Osterlind (2015) consider \(p=1\).
List containing entries
List containing transformed item parameters
List containing results of each linking in the linking chain
Mean and standard deviation for each study after linking
Transformation constants for item parameters
Transformation constants for person parameters
Battauz, M. (2015). equateIRT: An R package for IRT test equating. Journal of Statistical Software, 68(7), 1-22. doi: 10.18637/jss.v068.i07
Gonzalez, J., & Wiberg, M. (2017). Applying test equating methods: Using R. New York, Springer. doi: 10.1007/978-3-319-51824-4
He, Y., Cui, Z., & Osterlind, S. J. (2015). New robust scale transformation methods in the presence of outlying common items. Applied Psychological Measurement, 39(8), 613-626. doi: 10.1177/0146621615587003
Kolen, M. J., & Brennan, R. L. (2014). Test equating, scaling, and linking: Methods and practices. New York, Springer. doi: 10.1007/978-1-4939-0317-7
Weeks, J. P. (2010). plink: An R package for linking mixed-format tests using IRT-based methods. Journal of Statistical Software, 35(12), 1-33. doi: 10.18637/jss.v035.i12
Linking or equating of item response models can be also conducted with plink (Weeks, 2010), equate, equateIRT (Battauz, 2015), equateMultiple, kequate and irteQ packages.
See also the sirt::linking.haberman
,
sirt::invariance.alignment
and sirt::linking.haebara
functions
in the sirt package.
if (FALSE) { ############################################################################# # EXAMPLE 1: Linking dichotomous data with the 2PL model ############################################################################# data(data.ex16) dat <- data.ex16 items <- colnames(dat)[-c(1,2)] # fit grade 1 rdat1 <- TAM::tam_remove_missings( dat[ dat$grade==1, ], items=items ) mod1 <- TAM::tam.mml.2pl( resp=rdat1$resp[, rdat1$items], pid=rdat1$dat$idstud ) summary(mod1) # fit grade 2 rdat2 <- TAM::tam_remove_missings( dat[ dat$grade==2, ], items=items ) mod2 <- TAM::tam.mml.2pl( resp=rdat2$resp[, rdat2$items], pid=rdat2$dat$idstud ) summary(mod2) # fit grade 3 rdat3 <- TAM::tam_remove_missings( dat[ dat$grade==3, ], items=items ) mod3 <- TAM::tam.mml.2pl( resp=rdat3$resp[, rdat3$items], pid=rdat3$dat$idstud ) summary(mod3) # define list of fitted models tamobj_list <- list( mod1, mod2, mod3 ) #-- link item response models lmod <- TAM::tam.linking( tamobj_list) summary(lmod) # estimate WLEs based on transformed item parameters parm_list <- lmod$parameters_list # WLE grade 1 arglist <- list( resp=mod1$resp, B=parm_list[[1]]$B, AXsi=parm_list[[1]]$AXsi ) wle1 <- TAM::tam.mml.wle(tamobj=arglist) # WLE grade 2 arglist <- list( resp=mod2$resp, B=parm_list[[2]]$B, AXsi=parm_list[[2]]$AXsi ) wle2 <- TAM::tam.mml.wle(tamobj=arglist) # WLE grade 3 arglist <- list( resp=mod3$resp, B=parm_list[[3]]$B, AXsi=parm_list[[3]]$AXsi ) wle3 <- TAM::tam.mml.wle(tamobj=arglist) # compare result with chain linking lmod1b <- TAM::tam.linking(tamobj_list) summary(lmod1b) #-- linking with some eliminated items # remove three items from first group and two items from third group elim_items <- list( c("A1", "E2","F1"), NULL, c("F1","F2") ) lmod2 <- TAM::tam.linking(tamobj_list, elim_items=elim_items) summary(lmod2) #-- Robust Haebara linking with p=1 lmod3a <- TAM::tam.linking(tamobj_list, type="RobHae", pow_rob_hae=1) summary(lmod3a) #-- Robust Haeabara linking with initial parameters and prespecified epsilon value par_init <- lmod3a$par lmod3b <- TAM::tam.linking(tamobj_list, type="RobHae", pow_rob_hae=.1, eps_rob_hae=1e-3, par_init=par_init) summary(lmod3b) ############################################################################# # EXAMPLE 2: Linking polytomous data with the partial credit model ############################################################################# data(data.ex17) dat <- data.ex17 items <- colnames(dat)[-c(1,2)] # fit grade 1 rdat1 <- TAM::tam_remove_missings( dat[ dat$grade==1, ], items=items ) mod1 <- TAM::tam.mml.2pl( resp=rdat1$resp[, rdat1$items], pid=rdat1$dat$idstud ) summary(mod1) # fit grade 2 rdat2 <- TAM::tam_remove_missings( dat[ dat$grade==2, ], items=items ) mod2 <- TAM::tam.mml.2pl( resp=rdat2$resp[, rdat2$items], pid=rdat2$dat$idstud ) summary(mod2) # fit grade 3 rdat3 <- TAM::tam_remove_missings( dat[ dat$grade==3, ], items=items ) mod3 <- TAM::tam.mml.2pl( resp=rdat3$resp[, rdat3$items], pid=rdat3$dat$idstud ) summary(mod3) # list of fitted TAM models tamobj_list <- list( mod1, mod2, mod3 ) #-- linking: fix slope because partial credit model is fitted lmod <- TAM::tam.linking( tamobj_list, fix.slope=TRUE) summary(lmod) # WLEs can be estimated in the same way as in Example 1. ############################################################################# # EXAMPLE 3: Linking dichotomous data with the multiple group 2PL models ############################################################################# data(data.ex16) dat <- data.ex16 items <- colnames(dat)[-c(1,2)] # fit grade 1 rdat1 <- TAM::tam_remove_missings( dat[ dat$grade==1, ], items=items ) # create some grouping variable group <- ( seq( 1, nrow( rdat1$dat ) ) %% 3 ) + 1 mod1 <- TAM::tam.mml.2pl( resp=rdat1$resp[, rdat1$items], pid=rdat1$dat$idstud, group=group) summary(mod1) # fit grade 2 rdat2 <- TAM::tam_remove_missings( dat[ dat$grade==2, ], items=items ) group <- 1*(rdat2$dat$dat$idstud > 500) mod2 <- TAM::tam.mml.2pl( resp=rdat2$resp[, rdat2$items], pid=rdat2$dat$dat$idstud, group=group) summary(mod2) # fit grade 3 rdat3 <- TAM::tam_remove_missings( dat[ dat$grade==3, ], items=items ) mod3 <- TAM::tam.mml.2pl( resp=rdat3$resp[, rdat3$items], pid=rdat3$dat$idstud ) summary(mod3) # define list of fitted models tamobj_list <- list( mod1, mod2, mod3 ) #-- link item response models lmod <- TAM::tam.linking( tamobj_list) ############################################################################# # EXAMPLE 4: Linking simulated dichotomous data with two groups ############################################################################# library(sirt) #*** simulate data N <- 3000 # number of persons I <- 30 # number of items b <- seq(-2,2, length=I) # data for group 1 dat1 <- sirt::sim.raschtype( rnorm(N, mean=0, sd=1), b=b ) # data for group 2 dat2 <- sirt::sim.raschtype( rnorm(N, mean=1, sd=.6), b=b ) # fit group 1 mod1 <- TAM::tam.mml.2pl( resp=dat1 ) summary(mod1) # fit group 2 mod2 <- TAM::tam.mml.2pl( resp=dat2 ) summary(mod2) # define list of fitted models tamobj_list <- list( mod1, mod2 ) #-- link item response models lmod <- TAM::tam.linking( tamobj_list) summary(lmod) # estimate WLEs based on transformed item parameters parm_list <- lmod$parameters_list # WLE grade 1 arglist <- list( resp=mod1$resp, B=parm_list[[1]]$B, AXsi=parm_list[[1]]$AXsi ) wle1 <- TAM::tam.mml.wle(tamobj=arglist) # WLE grade 2 arglist <- list( resp=mod2$resp, B=parm_list[[2]]$B, AXsi=parm_list[[2]]$AXsi ) wle2 <- TAM::tam.mml.wle(tamobj=arglist) summary(wle1) summary(wle2) # estimation with linked and fixed item parameters for group 2 B <- parm_list[[2]]$B xsi.fixed <- cbind( 1:I, -parm_list[[2]]$AXsi[,2] ) mod2f <- TAM::tam.mml( resp=dat2, B=B, xsi.fixed=xsi.fixed ) summary(mod2f) }