ParcelAllocation函数的难点

ie3xauqp  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(98)

我想做一个结构方程模型,有几个潜在的变量与项目包裹。一些包裹应随机创建。我目前正在努力与“parcelAllocation”函数(semTools),希望有人能帮助我!
我的主数据集称为“Mydata”。我有三个潜在变量(MAAS,PFS和SFS),我想为它们创建随机项目包。

  • MAAS有15个项目(Mydata$MAAS_1至Mydata$MAAS_15),我需要3个宗地,每个宗地5个项目
  • PFS有7个项目(Mydata$PFS_1至Mydata$PFS_7),我需要3个宗地,每个宗地有2-3个项目
  • SFS有7个项目(Mydata$SFS_1至Mydata$SFS_7),我需要3个宗地,每个宗地有2-3个项目

我一直在尝试使用作者所解释的parcelAllocation函数,但我似乎很难理解它(或它的输出)。
这是我尝试的代码:

# Specify item-level models for each variable
item.syntaxMaas <- paste0("MAAS = ~ MAAS_", 1:15)
item.syntaxPfs <- paste0("PFS = ~ PFS_", 1:7)
item.syntaxSfs <- paste0("SFS = ~ SFS_", 1:7)

cat(item.syntax, sep = "\n")

# Create parcels for MAAS variable

maas.parcel.names <- paste0("maas.par", 1:3)
maas.mod.parcels <- 'MAAS = ~ maas.par1 + maas.par2 + maas.par3'

# Create parcels for PFS variable
pfs.parcel.names <- paste0("pfs.par", 1:3)
pfs.mod.parcels <- 'PFS =~ pfs.par1 + pfs.par2 + pfs.par3'

# Create parcels for SFS variable
sfs.parcel.names <- paste0("sfs.par", 1:3)
sfs.mod.parcels <- 'SFS =~ sfs.par1 + sfs.par2 + sfs.par3'

# Allocate indicators to parcels using parallel computing
maas.parcels <- parcelAllocation(maas.mod.parcels, data = Mydata, 
                  nAlloc = 100, parcel.names = maas.parcel.names, 
                  item.syntax = item.syntaxMaas, std.lv = TRUE)
                              

pfs.parcels <- parcelAllocation(pfs.mod.parcels, data = Mydata, 
                                nAlloc = 100, parcel.names = 
                                pfs.parcel.names, 
                                item.syntax = item.syntaxPfs, 
                                std.lv = TRUE, parallel = "snow")

sfs.parcels <- parcelAllocation(sfs.mod.parcels, data = Mydata, 
                    nAlloc = 100, parcel.names = sfs.parcel.names, 
                    item.syntax = item.syntaxSfs, std.lv = TRUE, 
                    parallel = "snow")

我只想知道哪些项分配给了哪个宗地,但运行

maas.parcels

我得到这个输出:


.
我不明白输出的意思。我在哪里可以看到哪些物品被分配到哪个包裹?是否有其他功能?或者我做错了什么?
啊,我希望包裹是平均分的项目进入他们。我没有找到一个论据。有可能得到吗?

yshpjwxd

yshpjwxd1#

我只想知道哪些项目分配给了哪个包裹
您请求了nAlloc = 100分配,因此该问题有100个答案。由于分配是随机的,因此没有一个答案提供信息。但如果您对该算法有纯粹的学术兴趣,则可以在R控制台上使用print(parcelAllocation)查看函数的内容。以assignments <- list()开头的部分创建随机分配方案。因此您可以编写自己的函数来返回该对象。

getAlloc <- function (model, data, parcel.names, item.syntax,
                      nAlloc = 100, fun = "sem", ...) {
    if (nAlloc < 2) 
        stop("Minimum of two allocations required.")
    if (!fun %in% c("sem", "cfa", "growth", "lavaan")) 
        stop("'fun' argument must be either 'lavaan', 'cfa', 'sem', or 'growth'")
    lavArgs <- list(...)
    lavArgs$model <- item.syntax
    lavArgs$data <- data
    lavArgs$do.fit <- FALSE
    item.fit <- do.call(fun, lavArgs)
    item.PT <- parTable(item.fit)
    if (is.character(model)) {
        ptArgs <- formals(lavaanify)
        fitArgs <- lavInspect(item.fit, "call")[-1]
        sameArgs <- intersect(names(ptArgs), names(fitArgs))
        ptArgs[sameArgs] <- fitArgs[sameArgs]
        ptArgs$model <- model
        if (is.null(ptArgs$model.type)) 
            ptArgs$model.type <- "sem"
        if (ptArgs$model.type != "growth") 
            ptArgs$model.type <- "sem"
        ptArgs$ngroups <- lavInspect(item.fit, "ngroups")
        PT <- do.call("lavaanify", ptArgs)
    }
    else if (is.data.frame(model)) {
        PT <- model
    }
    else stop("'model' argument must be a character string of lavaan model", 
        " syntax or a lavaan parameter table.  See ?lavaanify help page.")
    factorNames <- lavNames(PT, type = "lv")
    if (!all(sort(lavNames(item.PT, type = "lv")) == sort(factorNames))) {
        stop("'model' and 'item.syntax' arguments specify different factors.\n", 
            "'model' specifies: ", paste(sort(factorNames), collapse = ", "), 
            "\n", "'item.syntax' specifies: ", paste(sort(lavNames(item.PT, 
                type = "lv")), collapse = ", "))
    }
    assignments <- list()
    for (i in factorNames) {
        parcels <- PT$rhs[PT$lhs == i & PT$op == "=~"]
        items <- item.PT$rhs[item.PT$lhs == i & item.PT$op == 
            "=~"]
        assignments[[i]]$parcels <- setdiff(parcels, names(data))
        assignments[[i]]$items <- setdiff(items, parcels)
        if (length(assignments[[i]]$parcels) == 0L) {
            factorNames <- factorNames[-which(factorNames == 
                i)]
            next
        }
        nItems <- length(assignments[[i]]$items)
        nParcels <- length(assignments[[i]]$parcels)
        assignments[[i]]$nPerParcel <- rep(nItems%/%nParcels, 
            nParcels)
        if (nItems%%nParcels > 0) 
            for (j in 1:(nItems%%nParcels)) {
                assignments[[i]]$nPerParcel[j] <- assignments[[i]]$nPerParcel[j] + 
                  1
            }
        names(assignments[[i]]$nPerParcel) <- assignments[[i]]$parcels
    }
  return(assignments)
}

## run it, on all your data rather than 1 factor at a time
allItems   <- c(item.syntaxMaas, item.syntaxPfs, item.syntaxSfs)
allParcels <- c(maas.parcel.names, pfs.parcel.names, sfs.parcel.names)
allModels <- c(maas.mod.parcels, pfs.mod.parcels, sfs.mod.parcels)
getAlloc(allModels, data = Mydata,
         nAlloc = 3, # short, for an example
         parcel.names = allParcels,
         item.syntax  = allItems)

我不明白输出是什么意思
您是否已阅读帮助页参考资料部分的文章?
这将告诉你输出的内容,它只是显示不同随机分配的结果有多大的变异性,这就是这个函数的目的。
如果你想得到一个解决方案/拟合模型来从你的数据中得出推论,它考虑了包裹分配的不确定性,那么你可以使用cfa.mi()sem.mi()来汇总不同分配的结果,如帮助页面示例所示,并在2016年的论文中讨论。
我希望宗地是进入其中的项目的平均得分
这是函数内部的工作。

相关问题