执行模拟并将数据合并到一个数据框中
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),然后将所有模拟数据组合到一个数据框中。
为了实现可读和通用的代码,您应该在这里做两件事:
- 编写一个函数,将模拟配置数据集的每一行和 returns 模拟值作为
data_frame
(下面的 doSim
)。这使得在模拟配置上的迭代中单独测试模拟代码变得更加容易。
- 使用
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(.))
对于每项报告的研究,我想使用正态分布或对数正态分布(基于标志)对参数 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),然后将所有模拟数据组合到一个数据框中。
为了实现可读和通用的代码,您应该在这里做两件事:
- 编写一个函数,将模拟配置数据集的每一行和 returns 模拟值作为
data_frame
(下面的doSim
)。这使得在模拟配置上的迭代中单独测试模拟代码变得更加容易。 - 使用
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(.))