蒙特卡罗模拟代码:在R中生成给定大小的样本

Mik*_*e L 3 r montecarlo

我首先使用以下代码生成500个均匀分布的0到1之间随机数的样本:

set.seed(1234)
X<-runif(500, min=0, max=1)
Run Code Online (Sandbox Code Playgroud)

现在,我需要编写一个伪代码,为MC模拟生成10000个N = 500的样本,计算新创建的X的平均值,并将迭代次数和平均值存储在结果对象中.我从未尝试过这个,到目前为止,我有这个:

n.iter <-(10000*500)
results <- matrix (0, n.iter, 4)
Run Code Online (Sandbox Code Playgroud)

最后,一旦完成,我将运行它,然后获得应计样本均值的中位数,平均值和最小值/最大值,并将它们保存到名为MC.table的数据帧中.(另请注意,上面,我不知道为什么矩阵代码中有"4" - 我正在处理前面的例子).任何建议或帮助将不胜感激.

编辑:我有一个可行的例子,但我真的不明白它是怎么回事,所以请详细说明它的有效性:

Ni <- 10000
n <- 500
c <- 0

for (i in n){
for (j in 1:Ni){
c <- c+ 1
d <- data.frame (x= , y= )
results [c,1] <- c
results [c,2] <- j
results [c,3] <- i
results [c,4] <- something( d$x, d$y)
rm (d) } }
Run Code Online (Sandbox Code Playgroud)

如果你甚至可以花时间来解释这意味着什么,那对我来说还有很长的路要走!谢谢!

Fra*_*ank 5

您可以尝试使用可以使用data.table的软件包install.packages("data.table").安装完成后,你会运行像...

> require(data.table)
> dt <- data.table(x=runif(500*10000),iter=rep(1:500,each=10000))
                  # x iter
      # 1: 0.48293196    1
      # 2: 0.61935416    1
      # 3: 0.99831614    1
      # 4: 0.26944687    1
      # 5: 0.38027524    1
     # ---                
# 4999996: 0.11314160  500
# 4999997: 0.07958396  500
# 4999998: 0.97690312  500
# 4999999: 0.81670765  500
# 5000000: 0.62934609  500
> summaries <- dt[,list(mean=mean(x),median=median(x)),by=iter]
     # iter      mean    median
  # 1:    1 0.5005310 0.5026592
  # 2:    2 0.4971551 0.4950034
  # 3:    3 0.4977677 0.4985360
  # 4:    4 0.5034727 0.5052344
  # 5:    5 0.4999848 0.4971214
 # ---                         
# 496:  496 0.5013314 0.5048186
# 497:  497 0.4955447 0.4941715
# 498:  498 0.4983971 0.4910115
# 499:  499 0.5000382 0.4997024
# 500:  500 0.5009614 0.4988237
> min_o_means <- min(summaries$mean)
# [1] 0.4914826
Run Code Online (Sandbox Code Playgroud)

我认为语法相当简单.您可能想要使用?(例如?rep)查找某些函数.以#开头的行只显示生成的对象.在data.tables中,左边的:数字只是行号,---表示在显示中跳过的行.

  • 很好,但我认为这对于第一个计时器来说太过分了.:)你也可以添加一个`for`和`apply`解决方案. (2认同)