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

时间:2015-11-10 00:41:43

标签: r simulation

对于每个报告的研究,我想使用正态分布或对数正态分布(基于标志)对参数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 个答案:

答案 0 :(得分:1)

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

  1. 编写一个函数,该函数获取模拟配置数据集的每一行,并将模拟值返回为data_frame(下面为doSim)。这使您可以更轻松地通过仿真配置迭代测试仿真代码。
  2. 使用dplyr将函数的每一行传递给此函数,并将结果收集为data_frame
  3. 以下是一些示例代码:

    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(.))