R语言 使用map()查找使用pw的样本大小范围

carvr3hs  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(149)

我想使用map2pmap返回一个样本大小范围,以查找一个大小范围的效应。
我定义了一个效应量向量和一个匹配的可接受功效向量。

f<-seq(0.1, 0.6, 0.1)
p<-seq(0.7, 0.9, length.out=6)

我用expand.grid()得到一个对矩阵。

out<-expand.grid(f, p)

现在,我想把这个输入到map2pmap(我不确定是哪个)以返回样本大小的向量,但是我目前的工作返回了一个空列表。
我错过了什么?

library(pwr)
library(purrr)
map2(.x=out$f, .y=out$p, ~ pwr.anova.test(k=5, f=.x, power=.y))
sd2nnvve

sd2nnvve1#

我们可以使用pmap_dbl
在您的代码中,map2正在对两个向量out$fout$p进行迭代,但它没有返回一个命名列表或一个可以组合的向量。

  • 我们可以使用purrr中的pmap_dbl,通过将.default参数设置为5(因为k=5)来获得样本大小向量
  • 我们使用一个匿名函数~,它有两个参数..1..2,这两个参数是该函数第一个和第二个参数的占位符。
  • $n用于从pwr.anova.test()函数的输出中提取样本大小n。然后,将生成的n值传递给pmap_dbl函数以进行每次迭代。

这将返回效应量和功效的每个组合的样本量向量,如果出现任何错误,将使用默认值5。

library(pwr)
library(purrr)
pmap_dbl(out, ~ pwr.anova.test(k = 5, f = ..1, power = ..2)$n, .default = 5)
[1] 194.600370  49.369740  22.484423  13.084963   8.744943   6.397528
 [7] 211.003706  53.470142  24.306075  14.108628   9.398865   6.850309
[13] 229.437469  58.078205  26.353394  15.259232  10.133978   7.359474
[19] 250.729687  63.400866  28.718269  16.588445  10.983451   7.948001
[25] 276.315019  69.796826  31.560185  18.185947  12.004511   8.655601
[31] 309.051431  77.980467  35.196566  20.230229  13.311453   9.561547
68de4m5k

68de4m5k2#

您的错误在于未能检查out Dataframe 。expand.grid不假定其参数的名称为列名,因此out的列名为“Var1”和“Var2”

library(pwr)
library(purrr)

> str(out)
'data.frame':   36 obs. of  2 variables:
 $ Var1: num  0.1 0.2 0.3 0.4 0.5 0.6 0.1 0.2 0.3 0.4 ...
 $ Var2: num  0.7 0.7 0.7 0.7 0.7 0.7 0.74 0.74 0.74 0.74 ...
 - attr(*, "out.attrs")=List of 2
  ..$ dim     : int [1:2] 6 6
  ..$ dimnames:List of 2
  .. ..$ Var1: chr [1:6] "Var1=0.1" "Var1=0.2" "Var1=0.3" "Var1=0.4" ...
  .. ..$ Var2: chr [1:6] "Var2=0.70" "Var2=0.74" "Var2=0.78" "Var2=0.82" ...

# This succeeds

res <- map2(.x=out$Var1, .y=out$Var2, ~ pwr.anova.test(k=5, f=.x, power=.y)$n)

# The pwr.anova.test()$n pulls the element for the necessary sample size
# If you wanted the resulting value to be a atomic vector you could use unlist
res <- unlist(res)

# Or you could succeed with this code to get the names as you expected. Your code would have gotten a list of 36 lists, each with 5 elements, since you did not extract the sample size.

out <- expand.grid(f=f, p=p) 

# Note that if you had added `$n` immediately after the closing paren of 
# the `pwr.anova.test` call, you would have gotten a list of values.
# `unlist()`- it would get you the vector you were hoping for.

相关问题