R语言mirt包如何将多个独立线图合并至同一坐标系
mirt包合并theta标准误曲线的实现方法
mirt包输出的SingleGroupClass类对象自带的plot方法基于base绘图系统,默认每次调用会新建绘图画布,无法直接叠加图层,可通过以下两种方法实现多曲线同坐标系绘制:
方法1:直接叠加原生绘图(最快实现)
直接调用mirt自带绘图逻辑,绘制第一张图后,给第二张图添加add = TRUE参数,即可将曲线叠加到现有画布,注意两个绘图调用的theta_lim参数保持一致即可:
# 绘制第一条曲线,初始化画布 plot(fit.SKIDDETdisc, type = "infoSE", theta_lim = c(-4,4), col = "#2c7fb8", lwd = 2, main = "") # 叠加第二条曲线 plot(fit.SKIDNAdisc, type = "infoSE", theta_lim = c(-4,4), col = "#d95f02", lwd = 2, add = TRUE) # 添加图例 legend("topright", legend = c("SKIDDetachmentdisc模型", "SKIDNAdisc模型"), col = c("#2c7fb8", "#d95f02"), lwd = 2)
该方法完全复用mirt内置的计算逻辑,生成的曲线和单独绘制单图的效果完全一致,不需要额外做数据处理。
方法2:提取计算结果自定义绘图(自由度最高)
如果需要用ggplot2自定义绘图风格,或者做更复杂的图形调整,可以先提取两个模型的测试信息值,手动计算SE(标准误为测试信息平方根的倒数,即 $SE(\theta)=1/\sqrt{I(\theta)}$),整理成数据框后再绘图:
library(mirt) library(ggplot2) # 生成和绘图范围一致的theta序列 theta_seq <- matrix(seq(-4, 4, length.out = 200)) # 分别计算两个模型对应theta取值的SE se_det <- 1/sqrt(testinfo(fit.SKIDDETdisc, Theta = theta_seq)) se_na <- 1/sqrt(testinfo(fit.SKIDNAdisc, Theta = theta_seq)) # 整理为数据框 plot_df <- data.frame( theta = as.numeric(theta_seq), SKIDDetachmentdisc = se_det, SKIDNAdisc = se_na )
整理完数据后,既可以用base绘图,也可以直接用ggplot2绘制:
# ggplot2绘制示例 ggplot(plot_df, aes(x = theta)) + geom_line(aes(y = SKIDDetachmentdisc, color = "SKIDDetachmentdisc"), linewidth = 1) + geom_line(aes(y = SKIDNAdisc, color = "SKIDNAdisc"), linewidth = 1) + labs(x = expression(theta), y = expression(SE(theta)), color = "模型") + xlim(-4, 4) + theme_bw()
注意:如果需要绘制的是测验信息曲线而非SE曲线,只需要去掉计算SE的步骤,直接用
testinfo()输出的信息值绘图即可。
内容的提问来源于stack exchange,提问作者C K
相关产品推荐
相关产品推荐

