我需要通过多次迭代实验来运行蒙特卡罗模拟。 MonteCarlo软件包的功能似乎很适合这个问题。该实验涉及每次迭代一个接一个地创建4个矩阵(a,b,c和d)。
矩阵a:
random.sample <- sample(1:100, 1000, replace = TRUE)
a = matrix(random.sample, nrow = 10, ncol = 10, byrow = TRUE)
矩阵b:
b <- apply(a[, 1:10], 2, SMA, n=3)
Matrix c:
c <- pmax(a, b)
概率序列:
probability.sequence <- seq(0.1, 0.90, 0.1)
矩阵d:
d <- apply(c, 2, quantile, probs = probability.sequence, na.rm = TRUE)
我想在给定的时间内迭代创建矩阵 a 到 d , n 。每次迭代都应该生成一个新的矩阵 d ,其中包含来自相应矩阵 c 的百分位计算。我想聚合迭代过程的结果,以便得到所有矩阵 d 的90%百分位数的均值,方差,置信上限和置信下限。
(近似)期望的输出:
str(monte.carlo.aggregate.results)
num [1, 1:4] 65 15 85 45
monte.carlo.aggregate.results
mean variance Upper CL Lower CL
[1,] 65 15 85 45
我已阅读?MonteCarlo
并且努力在函数中包含矩阵a到d的创建,以便与MonteCarlo包中包含的MonteCarlo()
函数一起使用。有没有人建议设置此过程以便与MonteCarlo()
一起使用,或者可能是涉及自定义for循环的替代解决方案?
答案 0 :(得分:1)
如果你不坚持使用MonteCarlo
包(这对我来说很新并且看起来很有趣),你可以将你的代码包装成一个函数。
首先,创建一个只有90%-row的随机矩阵。然后,在指定金额后,您可以执行迭代并将其打包到包含lapply()
的列表中。最后,使用您的(圆形)统计信息创建另一个矩阵。
这样的事情:
set.seed(54897) # setting seed for sake of reproducibility
probability.sequence <- seq(0.1, 0.90, 0.1)
# iteration function
mx <- function(X, n) {
random.sample <- sample(1:1e2, 1e3, replace = TRUE)
a = matrix(random.sample, nrow = 10, ncol = 10, byrow = TRUE)
b <- apply(a[ ,1:10], 2, SMA, n = 3)
c <- pmax(a, b)
d <- apply(c, 2, quantile, probs = probability.sequence, na.rm = TRUE)
return(d[9, ]) # returns only the desired 90 % row
}
# amount of iterations
amount <- 1e3
# iteration
mx.lst <- lapply(1:amount, mx)
# matrix for statistics
r = matrix(NA, nrow = 1, ncol = 4,
dimnames = list(NULL, c("mean", "variance", "Upper CL", "Lower CL")))
r[, 1] <- (mean(unlist(lapply(mx.lst, mean)))) # mean
r[, 2] <- sqrt(var(unlist(lapply(mx.lst, mean)))) # variance
r[, 3] <- r[, 1] - 1.96 * sqrt(r[, 2]) # lower CI 95 %
r[, 4] <- r[, 1] + 1.96 * sqrt(r[, 2]) # upper CI 95 %
# output
(monte.carlo.aggregate.results <- round(r, 0))
# mean variance Upper CL Lower CL
# [1,] 82 3 78 86
str(monte.carlo.aggregate.results)
# num 1, 1:4] 82 3 78 86
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:4] "mean" "variance" "Upper CL" "Lower CL"
# speed test
amount <- 1e4
system.time(mx.lst <- lapply(1:amount, mx))
# user system elapsed
# 48.21 0.00 48.31
注意:请检查自己使用的置信区间公式是否符合您的需求。