我试图在 R 中为一组去识别的医学教育数据中的潜在变量“能力”和“教师/课程有效性”之间的关系构建一个结构方程模型。为了尽可能多地保留数据,我想包括医学生在医学院前两年参加的所有考试的考试成绩(表示为 MS1 和 MS2)。每组考试涵盖不同的类别材料,并有不同数量的考试。最终,这将导致一个更大的结构模型评估上述潜在变量与评估所有医学院第 1 年和第 2 年的 USMLE STEP1 资格考试之间的关系,并希望确定哪些模块与这次考试,由其他潜变量介导。为方便起见,data.frame 中的每个考试all.exams由哪个块指定,并以块中的顺序指定:
head(all.exams)
BLK1.1 BLK1.2 BLK1.3 BLK1.4 BLK2.1 BLK2.2 BLK2.3 BLK3.1 BLK3.2
66 66.7 87.8 50.0 82.4 81.8 100.0 87.2 83.3 69.7
67 100.0 95.9 100.0 97.1 100.0 100.0 94.9 100.0 100.0
68 100.0 91.9 66.7 88.2 100.0 100.0 94.9 91.7 97.0
69 100.0 93.2 83.3 95.6 81.8 100.0 97.4 95.8 93.9
70 100.0 89.2 83.3 85.3 100.0 100.0 87.2 87.5 100.0
71 91.7 90.5 83.3 88.2 90.9 83.3 94.9 95.8 100.0
BLK3.3 BLK4.1 BLK4.2 BLK5.1 BLK5.2 MS2BLK1.1 MS2BLK1.2 MS2BLK1.3
66 81.3 100 80.3 90.5 100.0 85 81 82
67 95.8 100 94.4 100.0 100.0 99 98 96
68 87.5 100 87.3 81.0 66.7 90 93 93
69 89.6 100 88.7 100.0 100.0 93 84 90
70 85.4 100 85.9 90.5 100.0 97 87 88
71 87.5 100 90.1 95.2 100.0 95 89 89
MS2BLK1.4 MS2BLK2.1 MS2BLK2.2 MS2BLK2.3 MS2BLK3.1 MS2BLK3.2
66 90.8 82 74.3 89.3 78.4 80.0
67 100.0 95 100.0 98.7 99.2 95.2
68 95.4 94 95.7 93.3 95.2 95.2
69 95.4 91 97.1 93.3 84.8 92.0
70 93.9 94 92.9 94.7 85.6 82.4
71 95.4 94 92.9 93.3 92.0 92.0
MS2BLK4.1 MS2BLK4.2 MS2BLK4.3 MS2BLK5.1 MS2BLK5.2 MS2BLK5.3 STEP1
66 75.6 80.3 82.3 82.4 74 93 193
67 97.5 93.8 97.5 100.0 100 99 251
68 89.9 95.1 84.8 93.6 94 93 242
69 85.7 92.6 91.1 88.0 91 95 226
70 82.4 81.5 92.4 90.4 94 93 233
71 89.9 88.9 83.5 96.0 97 90 231
这是应用“项目打包”的理想数据集,因为我们更感兴趣的是潜在变量和每个考试“块”之间的因子负载,而不是每个单独的考试和每个考试之间的关系。潜变量。
semTools有一个函数parcelAllocation
https://www.rdocumentation.org/packages/semTools/versions/0.4-12/topics/parcelAllocation
它允许用户将 SEM 中的清单变量组合成每个潜在变量的指定数量的包裹,以及每个包裹内的指定数量的项目。根据 semTools 注释中包含的示例,项目语法应如下所示:
item.syntax.full <- c(paste0("faculty =~ BLK1.", 1:4),
paste0("faculty =~ BLK2.", 1:3),
paste0("faculty=~BLK3.",1:3),
paste0("faculty=~BLK4.",1:2),
paste0("faculty=~BLK5.",1:2),
paste0("faculty=~MS2BLK1.",1:4),
paste0("faculty=~MS2BLK2.",1:3),
paste0("faculty=~MS2BLK3.",1:2),
paste0("faculty=~MS2BLK4.",1:3),
paste0("faculty=~MS2BLK5.",1:3),
paste0("aptitude =~ BLK1.", 1:4),
paste0("aptitude =~ BLK2.", 1:3),
paste0("aptitude=~BLK3.",1:3),
paste0("aptitude=~BLK4.",1:2),
paste0("aptitude=~BLK5.",1:2),
paste0("aptitude=~MS2BLK1.",1:4),
paste0("aptitude=~MS2BLK2.",1:3),
paste0("aptitude=~MS2BLK3.",1:2),
paste0("aptitude=~MS2BLK4.",1:3),
paste0("aptitude=~MS2BLK5.",1:3)
)
lavaan语法/样式模型由代码指定:
parcel.model="
faculty=~par1+par2+par3+par4+par5+par6+par7+par8+par9par10
aptitude=~par11+par12+par13+par14+par15+par16+par17+par18+par19+par20
"
使用semTools parcelAllocation 函数,以下代码应适合具有两个潜在变量的lavaan类型结构方程模型,以及包含函数中nPerPar命令指定的清单项/变量数量的十个包裹:
parcelAllocation(model=parcel.model,dataset=all.exams[,-30],nPerPar = list(c(4,3,3,2,2,4,3,2,3,3),c(4,3,3,2,2,4,3,2,3,3)),facPlc = list(apt.names,fac.names),nAlloc=20,syntax=item.syntax.full)
在哪里,
fac.names=colnames(all.exams)
fac.names=c("faculty",fac.names[-30])
apt.names=colnames(all.exams)
apt.names=c("aptitude",apt.names[-30])
####the names of the latent variables and all of the manifest variables to be parceled- we exclude "STEP1" because it is not included in the lavaan model or the item.syntax####
但是,当我运行上面的代码时,我收到以下错误消息:
Error in parcelAllocation(model = parcel.model, dataset = all.exams, nPerPar = list(c(4, :
** WARNING! ** Parcels incorrectly specified. Check input!
我尝试创建一个更简单的结构模型,每个潜在变量 3 个包裹,每个包裹分别有 3、3 和 4 个项目(总计在 STEP1 考试之前的医学院前两年的考试次数(10)) :
parcel.model.simp="
faculty=~par1+par2+par3
aptitude=~par4+par5+par6
"
并使用适当调整的parcelAllocation代码:
parcelAllocation(model=parcel.model.simp,dataset=all.exams[,-30],nPerPar = list(c(3,3,4),c(3,3,4)),facPlc = list(apt.names,fac.names),nAlloc=20,syntax=item.syntax.full)
但它只会产生与上面相同的错误消息:
如何获得此功能以有效地将考试打包成与每个区块对应的包裹?我的代码中似乎存在哪些错误?对 parcelAllocation 代码的任何建议或更正,或对我对这个问题的 SEM 方法的批判性反馈通常都会非常有帮助。我已经详尽地搜索了如此复杂的包裹示例以及针对此错误消息的故障排除,但都没有找到。
谢谢,
大卫