detect_ac {aberrance} | R Documentation |
Detect answer copying
Description
Detect answer copying for all possible source-copier pairs.
Usage
detect_ac(
method,
psi,
xi = NULL,
x = NULL,
d = NULL,
r = NULL,
interval = c(-4, 4),
alpha = 0.05
)
Arguments
method |
The answer copying statistic(s) to compute. Options for score-based statistics are:
Options for score and distractor-based statistics are:
Options for response-based statistics are:
|
psi |
A matrix of item parameters. |
xi |
A matrix of person parameters. If |
x , d , r |
Matrices of raw data. |
interval |
The interval to search for the person parameters. Default is
|
alpha |
Value(s) between 0 and 1 indicating the significance level(s)
used for flagging. Default is |
Value
A list is returned with the following elements:
stat |
A matrix of answer copying statistics. |
pval |
A matrix of p-values. |
flag |
An array of flagging results. The first dimension corresponds to source-copier pairs, the second dimension to methods, and the third dimension to significance levels. |
References
van der Linden, W. J., & Sotaridona, L. (2006). Detecting answer copying when the regular response process follows a known response model. Journal of Educational and Behavioral Statistics, 31(3), 283–304.
Wollack, J. A. (1997). A nominal response model approach for detecting answer copying. Applied Psychological Measurement, 21(4), 307–320.
See Also
detect_as()
to detect answer similarity.
Examples
# Setup for Examples 1 to 3 -------------------------------------------------
# Settings
set.seed(0) # seed for reproducibility
N <- 50 # number of persons
n <- 40 # number of items
# Randomly select 10% sources and 10% copiers
s <- sample(1:N, size = N * 0.10)
c <- sample(setdiff(1:N, s), size = N * 0.10)
# Create vector of indicators (1 = copying pair, 0 = non-copying pair)
pair <- t(combn(N, 2))
pair <- rbind(pair, pair[, 2:1])
ind <- ifelse(1:nrow(pair) %in% apply(
rbind(cbind(s, c), cbind(c, s)), 1, function(p)
which(pair[, 1] == p[1] & pair[, 2] == p[2])), 1, 0)
names(ind) <- paste(pair[, 1], pair[, 2], sep = "-")
# Example 1: Item Scores ----------------------------------------------------
# Generate person parameters for the 3PL model
xi <- cbind(theta = rnorm(N, mean = 0.00, sd = 1.00))
# Generate item parameters for the 3PL model
psi <- cbind(
a = rlnorm(n, meanlog = 0.00, sdlog = 0.25),
b = rnorm(n, mean = 0.00, sd = 1.00),
c = runif(n, min = 0.05, max = 0.30)
)
# Simulate uncontaminated data
x <- sim(psi, xi)$x
# Modify contaminated data by replacing 40% of the copier scores with source
# scores
for (v in 1:length(c)) {
ci <- sample(1:n, size = n * 0.40)
x[c[v], ci] <- x[s[v], ci]
}
# Detect answer copying
out <- detect_ac(
method = c("OMG_S", "GBT_S"),
psi = psi,
x = x
)
# Example 2: Item Scores and Distractors ------------------------------------
# Generate person parameters for the nested logit model
xi <- MASS::mvrnorm(
N,
mu = c(theta = 0.00, eta = 0.00),
Sigma = matrix(c(1.00, 0.80, 0.80, 1.00), ncol = 2)
)
# Generate item parameters for the nested logit model
psi <- cbind(
a = rlnorm(n, meanlog = 0.00, sdlog = 0.25),
b = rnorm(n, mean = 0.00, sd = 1.00),
c = runif(n, min = 0.05, max = 0.30),
lambda1 = rnorm(n, mean = 0.00, sd = 1.00),
lambda2 = rnorm(n, mean = 0.00, sd = 1.00),
lambda3 = rnorm(n, mean = 0.00, sd = 1.00),
zeta1 = rnorm(n, mean = 0.00, sd = 1.00),
zeta2 = rnorm(n, mean = 0.00, sd = 1.00),
zeta3 = rnorm(n, mean = 0.00, sd = 1.00)
)
# Simulate uncontaminated data
dat <- sim(psi, xi)
x <- dat$x
d <- dat$d
# Modify contaminated data by replacing 40% of the copier scores and
# distractors with source scores and distractors
for (v in 1:length(c)) {
ci <- sample(1:n, size = n * 0.40)
x[c[v], ci] <- x[s[v], ci]
d[c[v], ci] <- d[s[v], ci]
}
# Detect answer copying
out <- detect_ac(
method = c("OMG_S", "GBT_S", "OMG_SD", "GBT_SD"),
psi = psi,
x = x,
d = d
)
# Example 3: Item Responses -------------------------------------------------
# Generate person parameters for the nominal response model
xi <- cbind(eta = rnorm(N, mean = 0.00, sd = 1.00))
# Generate item parameters for the nominal response model
psi <- cbind(
lambda1 = rnorm(n, mean = -0.50, sd = 0.50),
lambda2 = rnorm(n, mean = -0.50, sd = 0.50),
lambda3 = rnorm(n, mean = -0.50, sd = 0.50),
lambda4 = rnorm(n, mean = 1.50, sd = 0.50),
zeta1 = rnorm(n, mean = -0.50, sd = 0.50),
zeta2 = rnorm(n, mean = -0.50, sd = 0.50),
zeta3 = rnorm(n, mean = -0.50, sd = 0.50),
zeta4 = rnorm(n, mean = 1.50, sd = 0.50)
)
# Simulate uncontaminated data
r <- sim(psi, xi)$r
# Modify contaminated data by replacing 40% of the copier responses with
# source responses
for (v in 1:length(c)) {
ci <- sample(1:n, size = n * 0.40)
r[c[v], ci] <- r[s[v], ci]
}
# Detect answer copying
out <- detect_ac(
method = c("OMG_R", "GBT_R"),
psi = psi,
r = r
)