假设我有以下代码,它基本上为我提供了12个月的收入和成本的随机模拟
simulate.revenue<-function() {
return(sapply(rnorm(12,100000,30000),function(x) max(0,x)))
}
simulate.cost<-function() {
return(sapply(rnorm(12,50000,20000),function(x) max(0,x)))
}
sim.run<-function() {
revenue<-simulate.revenue()
cost<-simulate.cost()
profit<-revenue-cost
year.simulation<-data.frame(revenue,cost,profit)
return(year.simulation)
}
现在运行上面的模拟功能10次,我知道我应该:
sim.results<-replicate(10,sim.run())
所以问题是如何进一步处理sim.results说:
答案 0 :(得分:1)
复制结果的结构:
replicate(1, sim.run())
可以轻松地为您提供返回内容的结构:data.frame的每一列的列表项(此处为3个列表项)。运行两个模拟会添加另外3个列表项。
将其转换为正确格式:
要将list
转换为data.frame
使用:
result <- data.frame(matrix(unlist(sim.results), nrow = 12, byrow = FALSE))
在您的情况下,结果data.frame
的每3列对应一个模拟。将模拟再次分成列表:
result_list <- list()
m <- 1
n_simulations <- 10
n_columnsPerSimulation <- 3
for (i in seq(1, n_simulations * n_columnsPerSimulation, n_columnsPerSimulation)){
result_list[[m]] <- result[,seq(i, i+n_columnsPerSimulation-1)]
m <- m + 1
}
这非常难看,但似乎有效。
分析结果:
现在您可以分析每个模拟,例如与sapply / lapply一样,如下例所示:
sapply(result_list, function(x) mean(x[,1]))