首页 > 解决方案 > R:结构方程建模,项目打包

问题描述

我试图在 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 方法的批判性反馈通常都会非常有帮助。我已经详尽地搜索了如此复杂的包裹示例以及针对此错误消息的故障排除,但都没有找到。

谢谢,

大卫

标签: rstructural-equation-model

解决方案


我不确定自 OP 发布一年多后这会有多大帮助,但我发现很难提供所请求的帮助,因为描述似乎与parcelAllocation(). 您声明您想要“将考试打包成与每个区块对应的包裹”,这意味着您根本不想要随机包裹(这就是此功能的用途)。相反,您应该通过计算综合分数(一个块内考试的总和或平均值)来简单地将这些包裹创建为数据中的新变量,然后使用这些复合作为指标。

其他一些问题:

  • 您似乎希望所有项目(在时间 1 和时间 2)都测量 2 个因素(教师和能力),这两个因素不是特定时间的因素(即,faculty1、faculty2、aptitude1、aptitude2)。
  • 您使用的语法似乎与该parcelAllocation()函数的更新版本相匹配,该版本具有您链接到的文档页面(版本 0.4-12)中不可用的功能。如果您仔细阅读更新文档(版本 0.5-2)中的示例,也许会更清楚该函数的工作原理:

https://www.rdocumentation.org/packages/semTools/versions/0.5-2/topics/parcelAllocation

但同样,听起来您并不是要随机分配宗地,而是要将一个街区内的考试分配给该街区的一个宗地。请参阅这篇文章,了解“代表面的包裹”的优点,在您的情况下,它将包括单个包裹中的所有块内方差来源,从而从构造方差中排除这些来源。

祝你好运,

特伦斯·D·约根森


推荐阅读