问题描述
我是一个全新的R用户,试图将具有指定依赖关系的大量数据生成到单个data.frame中。
我当前的代码使用一个for循环,并且可以正常工作(N = 250个id,超过10个复制),但是我必须将其扩展为更大的N和更大的K复制。我尝试使用foreach和函数进行并行处理,但没有取得太大的成功。我无法将复制的数据添加到最后一帧。
任何帮助或指导将不胜感激。
当前代码:
set.seed(0)
Kreps <- 10
id= as.numeric(1:250)
sim=do.call("rbind",replicate(Kreps,data.frame(id),simplify=FALSE))
sim$Krep_num = as.numeric(gl(Kreps,250))
obs1<-nrow(sim)
for(m in 1:Kreps ){
sim$z1= rbinom(obs1,1,0.35)
sim$x1= rbinom(obs1,exp(log(0.10)+ (log(1.15)*sim$z1)))
sim$y= rbinom(obs1,exp(log(0.025)+(log(2)*sim$x1) + (log(1.2)*sim$z1)) )
}
解决方法
在R中加快仿真的主要过程与R中任何代码的矢量化相似。基本上,只要有可能,就使用内部函数而不是SQL Error [21000]: ERROR: more than one row returned by a subquery used as an expression
。有时可以推导数学关系,并且可以从管道中删除多个调用。在这种情况下,只需删除for循环,然后在3次对for-loops
的调用中执行所有模拟,即可大大提高速度。
rbinom
此外,当您要复制数据时,set.seed(0)
Kreps <- 10
id = 1:250
obs1 <- Kreps * length(id)
nsim <- obs1 * Kreps
df <- data.frame(id = rep(id,kreps))
df$z1 <- rbinom(nsim,1,0.35)
df$x1 <- rbinom(nsim,exp(log(.1) + log(1.15) * df$z1))
df$y <- rbinom(nsim,exp(log(.025) + log(2) * df$z1+ log(1.2) * df$x1))
将比rep
快得多。 replicate
仅复制您的数据集,而rep
复制您放置的呼叫。例如。 replicate
大致等于rep(rbinom(1e6),10)
,而x <- rbinom(1e6); unlist(lapply(1:6,function(z)x))
大致等效于replicate(10,rbinom(1e6))
。