执行模拟并将数据合并到一个数据框中

Performing simulations and combining the data into one data frame

对于每项报告的研究,我想使用正态分布或对数正态分布(基于标志)对参数 X 进行 1000 次模拟,然后将所有模拟组合到一个数据框中。我正在寻找一种自动执行此操作的方法。

我有一个包含以下列的数据框:

SOURCE  NSUB   MEAN   SD   DIST
Study1  10     1.5    0.3  0
Study2  5      2.5    0.4  1
Study1  4      3.5    0.3  0

DIST==0时为正态分布,DIST==1时为对数正态分布

我能够进行模拟并使用硬编码将它们组合起来:例如:

#for Study1:
set.seed <-1
NSUB <- 10
MEAN <- 1.5
SD   <- 0.3
DIST <- 0   #Normal distribution

df1 <- data.frame("SOURCE"="Study1","NSUB"=NSUB,"DIST"=DIST, "VALUE" = rnorm(1000, mean=MEAN, sd=SD))

#For study2
set.seed <-2
NSUB <- 5
MEAN <- 2.5
SD   <- 0.4
DIST <- 1   #log-normal distribution
df2 <- data.frame("SOURCE"="Study2","NSUB"=NSUB,"DIST"=DIST, "VALUE" = rlnorm(1000, meanlog=log(MEAN), sdlog=SD))

#Combine all
dfall <- rbind(df1,df2)

但是,这对我来说会很乏味,我有很多报告的参数均值和 SD。我需要有关如何使其自动化的帮助,以便它对每一行进行 1000 次模拟(使用 MEAN 和 SD),然后将所有模拟数据组合到一个数据框中。

为了实现可读和通用的代码,您应该在这里做两件事:

  1. 编写一个函数,将模拟配置数据集的每一行和 returns 模拟值作为 data_frame(下面的 doSim)。这使得在模拟配置上的迭代中单独测试模拟代码变得更加容易。
  2. 使用dplyr将函数的每一行传递给这个函数,并将结果收集起来作为data_frame

下面是一些示例代码:

library(dplyr)

# read in the simultation configuration dataset
dfX = read.table(textConnection("
                 SOURCE  NSUB   MEAN   SD   DIST
Study1  10     1.5    0.3  0
Study2  5      2.5    0.4  1
Study1  4      3.5    0.3  0"),
                 header = TRUE, stringsAsFactors = FALSE)

# write a function that takes each row of the configuration
#   data.frame and returns the simulations
doSim = function(simConfig, seed = 12345) {
  set.seed(seed)
  dist = if(simConfig[["DIST"]] == 0) rnorm else rlnorm
  mean = if(simConfig[["DIST"]] == 0) simConfig[["MEAN"]] else log(simConfig[["MEAN"]]) 
  return(
    data_frame(
      source = simConfig[["SOURCE"]],
      nsub = simConfig[["NSUB"]],
      value = dist(1000, mean = mean, sd = simConfig[["SD"]])
    )
  )
}

# test the function
doSim(dfX[1, ])

# apply over dfX
dfX %>%
  rowwise() %>%
  do(doSim(.))