r - 创建不同大小和长度的 lavaan 和 irt 模型排列

标签 r iteration simulation r-lavaan

希望有人能在这里提供一些指导。

我正在使用 simDesign 包创建一个多变量模拟,我改变了因素的数量以及加载到每个因素上的项目。我想编写一个命令来识别 factornumbers 中存在的因子数量并为它们分配适当的项目(无交叉加载)。我将测试以下条件的所有组合以及更多条件,并且我希望有一个模型命令可以识别不同模型的迭代,因此我不必编写多个模型语句。

factornumbers<-c(1,2,3,5)
itemsperfactor<-c(5,10,30)

lavaan 和 mirt 正在寻找的内容如下:

mirtmodel<-mirt.model('
                    F1=1-15
                    F2=16-30
                    MEAN=F1,F2
                    COV=F1*F2')

lavmodel <- ' F1=~ Item_1 + Item_2 + Item_3 + Item_4 + Item_5 + Item_6 + Item_7 + Item_8 + Item_9 + Item_10 + Item_11 + Item_12 + Item_13 + Item_14 + Item_15
              F2=~ Item_16 + Item_17 + Item_18 + Item_19 + Item_20 + Item_21 + Item_22 + Item_23 + Item_24 + Item_25 + Item_26 + Item_27 + Item_28 + Item_29 + Item_30'

simDesign 包提供了这个示例,我想对其进行扩展,但我不确定我是否具备专业知识:

lavmodel<-paste0('F=~ ', paste0(colnames(dat)[1L], ' + '),
               paste0(colnames(dat)[-1L], collapse = ' + '))

我想要的是单个 mirt 和 lavaan 命令,它可以找到 factornumbers 命令中指定的因子数,并分配数据中指定的正确项目以及 itemsperfactor。

编辑: 我希望模型识别能够确定该条件使用的是哪个因素和项目结构,并用正确的信息填写模型识别。

例如:

mirtmodel<-mirt.model('
                    F1=1-1
                    F2=6-10
                    F3=11-15
                    F4=16-20
                    F5=21-25
                    MEAN=F1,F2,F3,F4,F5
                    COV=F1*F2*F3*F4*F5')

或者

 mirtmodel<-mirt.model('
                    F1=1-30
                    F2=31-60
                    MEAN=F1,F2
                    COV=F1*F2')

还有相应的 lavaan 模型。

最佳答案

这里的想法是将不同的字符串粘贴在一起,以便 condition 输入(相应的 Design 对象的行)是构造合适的模型规范所需的全部内容字符串。为模拟生成语法可以说是模拟中最烦人的部分,但至少在 R 中有大量有用的字符串操作(还有像 stringr 这样的包)。

这是我对您当前使用基本 R 函数寻找的内容的解释。

library(SimDesign)
library(mirt)

Design <- createDesign(factornumbers = c(1,2,3,5),
                       itemsperfactor = c(5,10,30))

gen_syntax_mirt <- function(condition){
    fn <- with(condition, factornumbers)
    ipf <- with(condition, itemsperfactor)
    nitems <- fn * ipf
    maxloads <- sort(seq(nitems, ipf, length.out = fn))
    minloads <- c(1, maxloads[-length(maxloads)] + 1)
    fnames <- paste0('F', 1:fn)
    df <- cbind(fnames, ' = ', minloads, '-', maxloads)
    s1 <- apply(df, 1, paste0, collapse = '')
    s2 <- paste0('MEAN = ', paste0(fnames, collapse = ','))
    s3 <- paste0('COV = ', paste0(fnames, collapse = '*'))
    ret <- paste0(c(s1, s2, s3), collapse = '\n')
    mirt.model(ret)
}

gen_syntax_mirt(Design[1,])
gen_syntax_mirt(Design[10,])

此函数的输入是从 Design 输入到 runSimulation() 的单行,因此您可以在此处看到它可以正常工作。为 lavaan 的语法做一些类似的事情,你就会被设置。

关于r - 创建不同大小和长度的 lavaan 和 irt 模型排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37581529/

相关文章:

xml - 无法转义用于 xml 构造的 html 字符串

r - 如何将两列与偏移数据合并?

jQuery:无法迭代

使用 for 循环进行 Javascript 对象迭代

python - 用于控制多个远程主机的 GUI(使用相同的 GUI 进行模拟和真实硬件)

r - "Result must have length..."错误 'complete.cases'

css - R Shiny 更改 dateRangeInput 小部件的大小和格式

c# - 传递 DataGridViewRow 作为引用

c - 与 Verilog 仿真实时通信

c - 如何在模拟 24 小时之前或之时停止执行的模拟程序