##
## (1) examples based on dataset fractions.subtraction.data
##
## dataset fractions.subtraction.data and corresponding Q-Matrix
fraction.subtraction.data
fraction.subtraction.qmatrix
## Misspecification in parameter specification for method din()
## leads to warnings and terminates estimation procedure. E.g.,
# See Q-Matrix specification
fractions.dina.warning1 <- din(data = fraction.subtraction.data,
q.matrix = t(fraction.subtraction.qmatrix))
# See guess.init specification
fractions.dina.warning2 <- din(data = fraction.subtraction.data,
q.matrix = fraction.subtraction.qmatrix, guess.init = rep(1.2,
ncol(fraction.subtraction.data)))
# See rule specification
fractions.dina.warning3 <- din(data = fraction.subtraction.data,
q.matrix = fraction.subtraction.qmatrix, rule = c(rep("DINA",
10), rep("DINO", 9)))
## Parameter estimation of DINA model
# rule = "DINA" is default
fractions.dina <- din(data = fraction.subtraction.data,
q.matrix = fraction.subtraction.qmatrix, rule = "DINA")
fractions.dina # see print.din
attributes(fractions.dina)
str(fractions.dina)
## For instance accessing the guessing parameters through
## assignment
fractions.dina$guess
## corresponding summaries, including diagnostic accuracies,
## summary of skill pattern distribution and information
## criteria AIC and BIC
summary(fractions.dina)
## In particular, accessing detailed summary through assignment
detailed.summary.fs <- summary(fractions.dina)
str(detailed.summary.fs)
## Diagnostic accuracy of item 8 seems to low. This is also
## visualized in the first plot
plot(fractions.dina)
## The reason therefore is a high guessing parameter
round(fractions.dina$guess[,1], 2)
## Set an upper boundary for the guessing parameter of
## item 5, 8 and 9
fractions.dina.bound <- din(data = fraction.subtraction.data,
q.matrix = fraction.subtraction.qmatrix, constraint.guess =
matrix(c(5,8,9, rep(0.2, 3)), ncol = 2))
fractions.dina.bound
detailed.summary.fs.bound <- summary(fractions.dina.bound)
## This improves the diagnostic accuracies
summary(detailed.summary.fs$IDI[1,])
summary(detailed.summary.fs.bound$IDI[1,])
## The second plot shows the expected (MAP) and observed skill
## probabilities. The third plot visualizes the skill pattern
## occurrence probabilities; Only the 'highest' are labeled; it
## is obvious that the skill class '11111111' (all skills are
## mastered) is the most probable in this population. The fourth
## plot shows the skill probabilities conditional on response
## patterns; in this population the skills 3 and 6 seem to be
## mastered easier than the others. The fifth plot shows the
## skill probabilities conditional on a specified response
## pattern; it is shown whether a skill is mastered (above
## .5+'uncertainty') unclassifiable (within the boundaries) or
## not mastered (below .5-'uncertainty'). In this case, the
## fifteenth respondent was chosen; if no response pattern is
## specified, the plot will not be shown (of course)
pattern <- paste(fraction.subtraction.data[15,], collapse = "")
#uncertainty = 0.1, highest = 0.05 are default
plot(fractions.dina.bound, uncertainty = 0.1, highest = 0.05,
pattern = pattern)
##
## (2) examples based on dataset sim.dina
##
# DINA Model
d1 <- din(sim.dina, q.matr = sim.qmatrix, rule = "DINA",
conv.crit = 0.01, maxit = 500, progress = TRUE)
summary(d1)
# Mixed DINA and DINO Model
d1b <- din(sim.dina, q.matr = sim.qmatrix, rule =
c(rep("DINA", 7), rep("DINO", 2)), conv.crit = 0.01,
maxit = 500, progress = FALSE)
summary(d1b)
# DINO Model
d2 <- din(sim.dina, q.matr = sim.qmatrix, rule = "DINO",
conv.crit = 0.01, maxit = 500, progress = FALSE)
summary(d2)
# Comparison of DINA and DINO estimates
lapply(list("guessing" = rbind("DINA" = d1$guess[,1],
"DINO" = d2$guess[,1]), "slipping" = rbind("DINA" =
d1$slip[,1], "DINO" = d2$slip[,1])), round, 2)
# Comparison of the information criteria
c("DINA"=d1$AIC, "MIXED"=d1b$AIC, "DINO"=d2$AIC)
# following estimates:
d1$coef # guessing and slipping parameter
d1$guess # guessing parameter
d1$slip # slipping parameter
d1$skill.patt # probabilities for skills
d1$attribute.patt # attribute pattern with probabilities
d1$subj.pattern # pattern per subject
# posterior probabilities for every response pattern
d1$posterior
##
## (3) examples based on dataset sim.dino
##
# DINO Estimation
d3 <- din(sim.dino, q.matr = sim.qmatrix, rule = "DINO",
conv.crit = 0.005, progress = FALSE)
# Mixed DINA and DINO Model
d3b <- din(sim.dino, q.matr = sim.qmatrix, rule =
c(rep("DINA", 4), rep("DINO", 5)), conv.crit = 0.001,
progress = FALSE)
# DINA Estimation
d4 <- din(sim.dino, q.matr = sim.qmatrix, rule = "DINA",
conv.crit = 0.005, progress = FALSE)
# Comparison of DINA and DINO estimates
lapply(list("guessing" = rbind("DINO" = d3$guess[,1],
"DINA" = d4$guess[,1]), "slipping" = rbind("DINO" =
d3$slip[,1], "DINA" = d4$slip[,1])), round, 2)
# Comparison of the information criteria
c("DINO"=d3$AIC, "MIXED"=d3b$AIC, "DINA"=d4$AIC)
##
## (4) example estimation with weights based on dataset sim.dina
##
# Here, a weighted maximum likelihood estimation is used
# This could be useful for survey data.
# i.e. first 200 persons have weight 2, the other have weight 1
(weights <- c(rep(2, 200), rep(1, 200)))
d5 <- din(sim.dina, sim.qmatrix, rule = "DINA", conv.crit =
0.005, weights = weights, progress = FALSE)
# Comparison of the information criteria
c("DINA"=d1$AIC, "WEIGHTS"=d5$AIC)
##
## (5) example estimation within a Balanced Incomplete
## Block (BIB) Design generated on dataset sim.dina
##
# generate BIB data
# The next example shows that the din and nida functions
# work for (relatively arbitrary) missing value pattern
# Here, a missing by design is generated in the dataset dinadat.bib
sim.dina.bib <- sim.dina
sim.dina.bib[1:100, 1:3] <- NA
sim.dina.bib[101:300, 4:8] <- NA
sim.dina.bib[301:400, c(1,2,9)] <- NA
d6 <- din(sim.dina.bib, sim.qmatrix, rule = "DINA",
conv.crit = 0.0005, weights = weights, maxit=200)
d7 <- din(sim.dina.bib, sim.qmatrix, rule = "DINO",
conv.crit = 0.005, weights = weights)
# Comparison of DINA and DINO estimates
lapply(list("guessing" = rbind("DINA" = d6$guess[,1],
"DINO" = d7$guess[,1]), "slipping" = rbind("DINA" =
d6$slip[,1], "DINO" = d7$slip[,1])), round, 2)
Run the code above in your browser using DataLab