对于每个报告的研究,我想使用正态分布或对数正态分布(基于标志)对参数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),然后将所有模拟数据组合在一个数据框中。
答案 0 :(得分:1)
为了实现可读和通用的代码,你应该在这里做两件事:
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(.))