相关文章推荐
温文尔雅的青蛙  ·  并购重组潮起!重塑投行生态,推动业务转型_山 ...·  9 月前    · 
性感的毛衣  ·  嗅球体积对上呼吸道感染后嗅觉障碍患者的预后评 ...·  1 年前    · 
发呆的小蝌蚪  ·  有哪些优雅炫丽的植物名称? - 知乎·  2 年前    · 
有腹肌的充值卡  ·  从多边市场到产业平台――长沙马栏山视频文创园 ...·  2 年前    · 
俊秀的回锅肉  ·  原神同人图搬运帖(持续更新) - 知乎·  2 年前    · 
Code  ›  R语言使用Rasch模型分析学生答题能力|附代码数据开发者社区
r语言 能力模型
https://cloud.tencent.com/developer/article/2188508
热心的楼梯
1 年前
拓端

R语言使用Rasch模型分析学生答题能力|附代码数据

原创
前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
腾讯云架构师技术同盟
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 腾讯云架构师技术同盟
返回腾讯云官网
拓端
首页
学习
活动
专区
工具
TVP 腾讯云架构师技术同盟
返回腾讯云官网
社区首页 > 专栏 > R语言使用Rasch模型分析学生答题能力|附代码数据

R语言使用Rasch模型分析学生答题能力|附代码数据

原创
作者头像
拓端
发布 于 2022-12-07 23:52:56
发布 于 2022-12-07 23:52:56
483 0
举报
文章被收录于专栏: 拓端tecdat

全文链接: http://tecdat.cn/?p=10175

最近我们被客户要求撰写关于Rasch的研究报告,包括一些图形和统计输出。

几个月以来,我一直对序数回归与项目响应理论(IRT)之间的关系感兴趣

在这篇文章中,我重点介绍Rasch分析。

最近,我花了点时间尝试理解不同的估算方法。三种最常见的估算方法是:

  • 联合最大似然(JML)
  • 条件逻辑回归,在文献中称为条件最大似然(CML)。
  • 标准多层次模型,在测量文献中称为边际最大似然(MML)。

阅读后,我决定尝试进行Rasch分析,生成多个Rasch输出。

例子

需要ggplot2和dplyr才能创建图表。

代码语言: javascript
复制
library(Epi) # 用于带对比的条件逻辑回归library(lme4) # glmerlibrary(ggplot2) # 用于绘图library(dplyr) # 用于数据操作

数据。

代码语言: javascript
复制
raschdat1 <- as.data.frame(raschdat)

CML估算

代码语言: javascript
复制
res.rasch <- RM(raschdat1)

系数

代码语言: javascript
复制
coef(res.rasch)beta V1      beta V2      beta V3      beta V4      beta V51.565269700  0.051171719  0.782190094 -0.650231958 -1.300578876beta V6      beta V7      beta V8      beta V9     beta V100.099296282  0.681696827  0.731734160  0.533662275 -1.107727126beta V11     beta V12     beta V13     beta V14     beta V15
-0.650231959  0.387903893 -1.511191830 -2.116116897  0.339649394beta V16     beta V17     beta V18     beta V19     beta V20-0.597111141  0.339649397 -0.093927362 -0.758721132  0.681696827beta V21     beta V22     beta V23     beta V24     beta V250.936549373  0.989173502  0.681696830  0.002949605 -0.814227487beta V26     beta V27     beta V28     beta V29     beta V301.207133468 -0.093927362 -0.290443234 -0.758721133  0.731734150

使用回归

代码语言: javascript
复制
raschdat1.long$tot <- rowSums(raschdat1.long) # 创建总分c(min(raschdat1.long$tot), max(raschdat1.long$tot)) #最小和最大分数[1]  1 26raschdat1.long$ID <- 1:nrow(raschdat1.long) #创建IDraschdat1.long <- tidyr::gather(raschdat1.long, item, value, V1:V30) # 宽数据转换为长数据# 转换因子类型raschdat1.long$item <- factor(
  raschdat1.long$item, levels = p

条件最大似然

代码语言: javascript
复制
# 回归系数item1        item2        item3        item4        item50.051193209  0.782190560 -0.650241362 -1.300616876  0.099314453item6        item7        item8        item9       item100.681691285  0.731731557  0.533651426 -1.107743224 -0.650241362item11       item12       item13       item14       item150.387896763 -1.511178125 -2.116137610  0.339645555 -0.597120333item16       item17       item18       item19       item200.339645555 -0.093902568 -0.758728000  0.681691285  0.936556599item21       item22       item23       item24       item250.989181510  0.681691285  0.002973418 -0.814232531  1.207139323item26       item27       item28       item29        -0.093902568 -0.290430680 -0.758728000  0.731731557

请注意,item1是V2而不是V1,item29是V30。要获得第一个题目V1的难易程度,只需将题目1到题目29的系数求和,然后乘以-1。

代码语言: javascript
复制
sum(coef(res.clogis)[1:29]) * -1[1] 1.565278# 再确认两个模型是否等效res.rasch$loglik #Rasch对数似然[1] -1434.482# 条件逻辑对数似然,第二个值是最终模型的对数似然res.clogis$loglik[1] -1630.180 -1434.482#还可以比较置信区间,方差,...#clogistic可让您检查分析的实际样本量:res.clogis$n[1] 3000

显然,所有数据(30 * 100)都用于估算。这是因为没有一个参与者在所有问题上都得分为零,在所有问题上都得分为1(最低为1,最高为30分中的26分)。所有数据都有助于估计,因此本示例中的方差估计是有效的。

联合极大似然估计

代码语言: javascript
复制
# 标准逻辑回归,请注意使用对比res.jml 
# 前三十个系数(Intercept)        item1        item2        item3        item4
-3.688301292  0.052618523  0.811203577 -0.674538589 -1.348580496      item5        item6        item7        item8        item90.102524596  0.706839644  0.758800752  0.553154545 -1.148683041     item10       item11       item12       item13       item14
-0.674538589  0.401891360 -1.566821260 -2.193640539  0.351826379     item15       item16       item17       item18       item19
-0.619482689  0.351826379 -0.097839229 -0.786973625  0.706839644     item20       item21       item22       item23       item240.971562267  1.026247034  0.706839644  0.002613624 -0.844497142     item25       item26       item27       item28       item291.252837340 -0.097839229 -0.301589647 -0.786973625  0.758800752

item29与V30相同。差异是由估算方法的差异引起的。要获得第一个问题V1的难易程度,只需将问题1到问题29的系数求和,然后乘以-1。

代码语言: javascript
复制
sum(coef(res.j[1] 1.625572

多层次逻辑回归或MML

我希望回归系数是问题到达时的难易程度, glmmTMB() 不提供对比选项。我要做的是运行 glmer() 两次,将第一次运行的固定效果和随机效果作为第二次运行的起始值。

使用多层次模型复制Rasch结果

提供个体-问题映射:

代码语言: javascript
复制
plot(res.rasch)

要创建此图,我们需要问题难度(回归系数* -1)和个体能力(随机截距)。


极端的分数是不同的。这归因于MML的差异。由于CML不提供人为因素,因此必须使用两步排序过程。

问题特征曲线

问题特征曲线:

代码语言: javascript
复制
plot(res.rasch)

在这里,我们需要能够根据学生的潜能来预测学生正确答题的概率。我所做的是使用逻辑方程式预测概率。获得该数值,就很容易计算预测概率。由于我使用循环来执行此操作,因此我还要计算问题信息,该信息是预测概率乘以1-预测概率。

代码语言: javascript
复制
## GGPLOT可视化ggplot(test.info.df, aes(x = theta, y = prob, colour = reorder(item, diff, mean))) +
  geom_line() +ct response", colour = "Item",

下面将逐项绘制

代码语言: javascript
复制
ggplot(test.info.df, aes(x = theta, y = prob)) + geom_line() +
  scale_x_continuous(breaks = seq(-6, 6, 2), limits = c(-4, 4)) +
  scale_y_continuous(labels = percent, breaks = seq(0, 1, .

个体参数图

代码语言: javascript
复制
plot(person.parameter(res.rasch))

我们需要估计的个体能力:

代码语言: javascript
复制
ggplot(raschdat1.long, aes(x = tot, y = ability)) +
  geom_point(shape = 1, size = 2) + geom_line() +
  scale_x_continuous(breaks = 1:26) + 
 
推荐文章
温文尔雅的青蛙  ·  并购重组潮起!重塑投行生态,推动业务转型_山西监管局
9 月前
性感的毛衣  ·  嗅球体积对上呼吸道感染后嗅觉障碍患者的预后评估 - PMC
1 年前
发呆的小蝌蚪  ·  有哪些优雅炫丽的植物名称? - 知乎
2 年前
有腹肌的充值卡  ·  从多边市场到产业平台――长沙马栏山视频文创园研究--传媒--人民网
2 年前
俊秀的回锅肉  ·  原神同人图搬运帖(持续更新) - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号