我试图在R中构造一组结构方程模型,以解决一组不确定的医学教育数据中潜在变量“能力”与“教职/课程有效性”之间的关系。为了保留尽可能多的数据,我想包括一名医学生在医学院开学的头两年以“成组”形式参加的所有考试的考试成绩(分别表示为MS1和MS2)。每门考试涵盖不同类别的材料,并且考试数量也不同。最终,这将导致建立一个更大的结构模型,以评估上述潜在变量与USMLE STEP1资格考试之间的关系,该考试评估了所有医学院1年级和2年级,并希望能够确定哪些区块与得分上的关系更强该考试由其他潜在变量介导。为简便起见,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个项目(总计在医学院开学前两年(10)的检查次数) STEP1检查):
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)
但它只会产生与上面相同的错误消息:
我如何获得此功能以将检查有效地分成与每个区块相对应的包裹? 我的代码中似乎出现什么错误?通常,对包裹分配代码的任何建议或更正或我对这个问题的SEM方法的关键反馈都将非常有帮助。我已详尽搜索了如此复杂的包裹示例,并针对此错误消息进行了故障排除,但均未找到。
谢谢
大卫
答案 0 :(得分:0)
我不确定自OP以来的一年之后,这将有多大帮助,但是我发现很难提供所请求的帮助,因为该描述似乎与parcelAllocation()
的目的不符。您声明要“将检查分组到与每个块相对应的宗地中”,这意味着您根本不需要任何随机宗地(这是该功能的作用)。取而代之的是,您应该通过计算综合得分(一个区块中各次考试的总和或平均值),简单地将这些宗地创建为数据中的新变量,然后将这些综合用作指标。
其他一些问题:
parcelAllocation()
函数的更新版本匹配,该函数的功能在链接到的文档页面(版本0.4-12)中 不可用。 。如果您浏览更新的文档(版本0.5-2)中的示例,可能会更清楚该函数的工作原理:https://www.rdocumentation.org/packages/semTools/versions/0.5-2/topics/parcelAllocation
但是,这听起来并不是您想要随机分配地块,而是想将一个区块内的检查分配给该区块的包裹。请参见this article,以了解“构面代表宗地”的优势,在您的情况下,它将包含单个宗地中的所有块内方差源,从而将这些源从构造方差中排除。
祝你好运
Terrence D. Jorgensen