r-执行模拟并将数据组合为一个数据帧



对于每个报告的研究,我想使用正态或对数正态分布(基于标志)对参数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. 编写一个函数,获取模拟配置数据集的每一行,并将模拟值作为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(.))

最新更新