Можно ли анализировать производительность элементов на разных экзаменах, используя одни и те же вопросы, но в разном порядке в каждой версии?

#r #r-exams

#r #r-экзамены

Вопрос:

Мы провели пять exams2nops экзаменов, используя одни и те же группы предметов в рандомизированном порядке. Все они были элементами schoice. Таким образом, *.rds было получено пять разных файлов, каждый из которых будет использоваться с соответствующими отсканированными экзаменами. Я заметил, что в тех *.rds файлах, которые будут использоваться в nops_eval , есть информация о том *.rmd , что использовалось для создания вопроса этого экзамена. Например.:

введите описание изображения здесь

Однако после создания nops_eval.csv эта информация теряется. Я хотел бы объединить все пять nops_eval.csv файлов, используя *.rmd информацию, соответствующую каждому вопросу. Поскольку один и тот же вопрос (например, упражнение 22) может быть получен из разных *.rmd файлов. Все те же 22 *.rmd файла использовались на всех экзаменах (все имеют одинаковые 22 вопроса, но в разных порядках.

Я хотел бы получить фрейм данных с объединенным csv, чтобы я мог проводить анализ теории ответов элементов и моделирования по Рашу.

Ответ №1:

Да, вы можете объединить информацию из файлов CSV, изменив их порядок на основе информации о файле / имени из файлов RDS. Ниже я проиллюстрирую, как это сделать, используя check.* столбцы из файлов CSV. Обычно они ближе всего к тому, что мне нужно для проведения анализа IRT.

Сначала вы читаете CSV и RDS из первой версии экзамена:

 eval1 <- read.csv2("/path/to/first/nops_eval.csv", dec = ".")
metainfo1 <- readRDS("/path/to/first/exam.rds")
 

Затем вы извлекаете только check.* столбцы и используете имена файлов упражнений в качестве имен столбцов.

 eval1 <- eval1[, paste0("check.", 1:length(metainfo1[[1]]))]
names(eval1) <- sapply(metainfo1[[1]], function(x) x$metainfo$file)
 

Я использую $file здесь, потому что он всегда уникален для всех упражнений. Если $name в вашем случае он также уникален и имеет лучшие метки, вы также можете использовать его вместо этого.

Затем вы делаете то же самое для второй версии экзамена:

 eval2 <- read.csv2("/path/to/second/nops_eval.csv", dec = ".")
metainfo2 <- readRDS("/path/to/second/exam.rds")
eval2 <- eval2[, paste0("check.", 1:length(metainfo2[[1]]))]
names(eval2) <- sapply(metainfo2[[1]], function(x) x$metainfo$file)
 

Если при построении двух версий использовались одни и те же упражнения, имена столбцов eval1 и eval2 совпадают, просто в другом порядке. Тогда вы можете просто сделать

 eval2 <- eval2[, names(eval1)]
 

изменить порядок столбцов eval2 , чтобы они соответствовали eval1 столбцам . Впоследствии вы можете сделать:

 eval <- rbind(eval1, eval2)
 

Если у вас более двух версий экзамена, вы просто повторяете один и тот же код и rbind() все вместе в конце.

Аналогичный код также можно использовать, если упражнения лишь частично перекрываются между версиями упражнения. В этом случае я сначала создаю достаточно большую NA матрицу с объединенными именами файлов упражнений, а затем вставляю результаты:

 n1 <- nrow(eval1)
n2 <- nrow(eval2)
nam <- unique(c(names(eval1), names(eval2)))
eval <- matrix(NA, nrow = n1   n2, ncol = length(nam))
colnames(eval) <- nam
eval[1:n1, names(eval1)] <- as.matrix(eval1)
eval[(n1   1):(n1   n2), names(eval2)] <- as.matrix(eval2)
 

Опять же, вам нужно будет выполнить соответствующую итерацию, чтобы объединить более двух версий.

В любом случае результат eval может быть обработан далее, чтобы стать матрицей IRT для последующего анализа.