r - 模拟多项选择测试的相关答案
问题描述
我正在尝试模拟多项选择题测试 (MCQ) 的答案。目前,我正在使用以下代码来模拟只有两个问题的 MCQ 的答案:
answers <- data.frame(
Q1 = sample(LETTERS[1:5],10,replace = T, prob=c(0.1,0.6,0.1,0.1,0.1)),
Q2 = sample(LETTERS[1:5],10,replace = T, prob=c(0.5,0.1,0.1,0.2,0.1)))
答案 B 和 A 分别是 Q1 和 Q2 的正确答案。
我的困难是在问题的答案之间引入相关性,例如,一个好学生倾向于选择所有问题的正确答案。我怎样才能做到这一点?
解决方案
这是一种使用 应用协方差矩阵的Sigma=
方法MASS::mvrnorm
。
n <- 15
r <- .9
set.seed(42)
library('MASS')
M <- abs(mvrnorm(n=n, mu=c(1, 500), Sigma=matrix(c(1, r, r, 1), nrow=2),
empirical=TRUE)) |>
as.data.frame() |>
setNames(c('Q1', 'Q2'))
cut
我们通过沿自定义quantile
s 匹配随机数(取自 OP)来获得相关级别 A、...、B ,
f <- \(x, q) cut(x, breaks=c(0, quantile(x, cumsum(q))), include.lowest=T,
labels=LETTERS[1:5])
p1 <- c(0.1, 0.6, 0.1, 0.1, 0.1)
p2 <- c(0.5, 0.1, 0.1, 0.2, 0.1)
在Map()
通话中。
dat <- Map(f, M, list(p1, p2)) |>
as.data.frame()
dat
# Q1 Q2
# 1 A A
# 2 B A
# 3 E E
# 4 D E
# 5 A A
# 6 B A
# 7 C D
# 8 B A
# 9 B A
# 10 B A
# 11 B C
# 12 B B
# 13 E D
# 14 B A
# 15 C D
查看
dat_check <- lapply(dat, as.integer) |> as.data.frame()
cor(dat_check) ## correlation
# Q1 Q2
# Q1 1.00000 0.85426
# Q2 0.85426 1.00000
lapply(dat, table) ## students' answers
# $Q1
#
# A B C D E
# 2 8 2 1 2
#
# $Q2
#
# A B C D E
# 8 1 1 3 2
推荐阅读
- javascript - 如何使用 localeStorage 使语言不会改变?
- google-apps-script - 如果列值超过阈值,则将 G-Sheet 列值替换为单元格中“n”个先前值的平均值
- javascript - CSS 错误:“不要在选择器中使用 ID”我该如何解决这个问题?
- maven - 如何在 pom.xml 中为 java-maven 项目构建打包类型 CBA
- python - Python将变量分配给数据框
- python - 我有两个数据框 DF1 和 DF2,在特定索引处将满足 DF2 条件的行追加到 DF1 的最佳方法是什么?
- javascript - 用 JavaScript 中的条件检查间隔
- javascript - 缺少数据时jquery数据表消失
- powershell - Renaming largest files that contain distinct sub strings of predetermined length in powershell
- wordpress - WP查询数组中的数组