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)
但是,这是行不通的。那我做错了什么?
这是我第一次听说 lavaan
、simsem
及其模型,但我想在 purrr 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
我有一份在 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)
但是,这是行不通的。那我做错了什么?
这是我第一次听说 lavaan
、simsem
及其模型,但我想在 purrr 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