R: моделирование структурных уравнений, разделение элементов - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь построить модель структурного уравнения в 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)

но выдает только то же сообщение об ошибке, что и выше:

Как я могу заставить эту функцию эффективно разбивать экзамены на участки, соответствующие каждому блоку? Какие ошибки присутствуют в моем коде? Любые предложения или исправления в коде parcelAllocation или критические отзывы о моем подходе SEM к этому вопросу в целом были бы чрезвычайно полезны. Я исчерпывающе искал примеры такой сложной обработки и устранения неполадок для этого сообщения об ошибке и не нашел ни того, ни другого.

Спасибо,

Дэвид

...