R - использовать симсем внутри карты - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть список из более чем 100 моделей SEM, вычисленных в lavaan. В этом примере я собираюсь использовать только две модели:

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-ho c анализ мощности на моих моделях, и для этой цели я использую следующий for l oop:

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 l oop и вместо этого использовать функцию map. Я пробовал следующее:

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

Однако это не работает. Так что я делаю не так?

1 Ответ

1 голос
/ 24 февраля 2020

Я впервые слышу о lavaan, simsem и его моделях, но я пытаюсь помочь вам с 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
...