R - 在地图中使用 simsem

R - use simsem within map

我有一份在 lavaan 中计算的 100 多个 SEM 模型的列表。对于这个例子,我将只使用两个模型:

fit.model1.cfa <- '
    ind60 =~ x1 + x2 + x3
    dem60 =~ y1 + y2 + y3 + y4
    dem65 =~ y5 + y6 + y7 + y8
    ind60 ~~ ind60
    dem60 ~~ dem60
    dem65 ~~ dem65' %>%
       sem(PoliticalDemocracy)

fit.model2.cfa <- '
    ind60 =~ x1 + x2
    dem60 =~ y1 + y2 + y3
    dem65 =~ y5 + y6 + y7
    ind60 ~~ ind60
    dem60 ~~ dem60
    dem65 ~~ dem65' %>%
       sem(PoliticalDemocracy)

模型实际上是什么并不那么重要。现在我们将他们加入一个列表:

models <- list(fit.model1.cfa, fit.model2.cfa)

我想对我的模型进行 post-hoc 功率分析,为此我使用以下 for 循环:

pwr <- list()

for(i in 1:2){
   sim(nRep = 1000, model = models[[i]], n = models[[i]]@SampleStats@ntotal, generate = models[[i]]) %>%
       getPower() -> pwr[[i]]
}

但是,我想避免 for 循环,而是使用 map 函数。我正在尝试以下操作:

models %>%
   map(., sim, nRep = 1000, model = ., n = pluck(pluck(., "SampleStats"), "ntotal"), generate = .) %>%
   map(getPower)

但是,这是行不通的。那我做错了什么?

这是我第一次听说 lavaansimsem 及其模型,但我想在 map 方面为您提供帮助。我用 nRep = 10 做了一个简单的解决方案只是为了测试,你可以用 nRep = 1000 复制它。另外,返回了很多警告和进度,但为了干净起见,我在下面的示例中删除了它们。

library(tidyverse, verbose = F)
library(lavaan)
library(simsem)

fit.model1.cfa <- '
    ind60 =~ x1 + x2 + x3
    dem60 =~ y1 + y2 + y3 + y4
    dem65 =~ y5 + y6 + y7 + y8
    ind60 ~~ ind60
    dem60 ~~ dem60
    dem65 ~~ dem65' %>%
  sem(PoliticalDemocracy)

fit.model2.cfa <- '
    ind60 =~ x1 + x2
    dem60 =~ y1 + y2 + y3
    dem65 =~ y5 + y6 + y7
    ind60 ~~ ind60
    dem60 ~~ dem60
    dem65 ~~ dem65' %>%
  sem(PoliticalDemocracy)

models <- list(model1 = fit.model1.cfa, model2 = fit.model2.cfa)


power <- map(models, function(x){

  n <- x@SampleStats@ntotal

  z <- sim(model = x, nRep = 10, n = n, generate = x)

  getPower(z)

})

power

#> $model1
#>    ind60=~x2    ind60=~x3    dem60=~y2    dem60=~y3    dem60=~y4    dem65=~y6 
#>          1.0          1.0          1.0          1.0          1.0          1.0 
#>    dem65=~y7    dem65=~y8 ind60~~ind60 dem60~~dem60 dem65~~dem65       x1~~x1 
#>          1.0          1.0          1.0          1.0          1.0          1.0 
#>       x2~~x2       x3~~x3       y1~~y1       y2~~y2       y3~~y3       y4~~y4 
#>          0.5          1.0          1.0          1.0          1.0          1.0 
#>       y5~~y5       y6~~y6       y7~~y7       y8~~y8 ind60~~dem60 ind60~~dem65 
#>          1.0          1.0          1.0          1.0          1.0          1.0 
#> dem60~~dem65 
#>          1.0 
#> 
#> $model2
#>    ind60=~x2    dem60=~y2    dem60=~y3    dem65=~y6    dem65=~y7 ind60~~ind60 
#>          1.0          1.0          1.0          1.0          1.0          1.0 
#> dem60~~dem60 dem65~~dem65       x1~~x1       x2~~x2       y1~~y1       y2~~y2 
#>          1.0          1.0          0.4          0.4          0.8          1.0 
#>       y3~~y3       y5~~y5       y6~~y6       y7~~y7 ind60~~dem60 ind60~~dem65 
#>          1.0          1.0          1.0          1.0          0.9          1.0 
#> dem60~~dem65 
#>          1.0