需要帮助构建蒙特卡罗模拟并用R找到结果的百分位数

时间:2014-03-18 09:19:49

标签: r montecarlo percentile bernoulli-probability

我有一个包含一组事件(大约40项)的CSV文件,所有这些都可以发生或不发生,具体取决于给定的概率。列:事件名称,产量大小,概率。

我对此数据感兴趣的是该集合的总收益大小(该集合的所有收益率之和),以及可能还有每个事件的收益总和。因此,由于事件可能发生在非因此,因此集合的总产量大小可能不同,我需要在集合上进行蒙特卡罗模拟,在概率列上进行伯努利试验。

最后,我需要计算整个集合的收益率或所有蒙特卡罗模拟迭代(场景)中特定事件的百分位数。

我写下来时遇到了麻烦..(我还在学习R,我更习惯于Java / C#等)

我目前制作的代码:

#Generate sample data for a set of events that I want to simulate
eventcol <- c('Event1', 'Event2', 'Event3', 'Event4', 'Event5')
yieldcol <- c(350, 200, 100, 120, 540)
problcol <- c(0.5, 0.2, 0.9, 0.4, 0.7)
events <- data.frame(Name=eventcol, Yield=yieldcol, Probability=problcol)

#Forecast function
forecast <- function(events){
  count <- nrow(events)
  data <- data.frame(Id=seq(1, count))
  data$Name <- events$Name
  data$Yield <- events$Yield
  data$Exists <- rbinom(count,1,events$Probability)
  return(data)
}

#Create Monte Carlo simulation scenarios/realizations
scenarios <- replicate(4, forecast(events))
scenarios

输出如下:

> scenarios
       [,1]      [,2]      [,3]      [,4]     
Id     Integer,5 Integer,5 Integer,5 Integer,5
Name   factor,5  factor,5  factor,5  factor,5 
Yield  Numeric,5 Numeric,5 Numeric,5 Numeric,5
Exists Numeric,5 Numeric,5 Numeric,5 Numeric,5

但是我不知道如何在每个场景中对存在的事件(存在== 1)求和,更不用说在总和上找到百分位数(带有分位数函数)。你会如何处理?

关于数据结构,我有一些想法,但我不确定..

  1. 也许我应该转换预测,然后以某种方式逐个迭代MC场景并对数据求和?

  2. 也许我应该从不存在的结果中筛选出事件(Exists == 0)。但是我该怎么做以及在哪里呢?

  3. 如果结果看起来像这样(或者我也不知道如何实现这一点),这可能也会更有意义:

    Scenario     Name     Yield
    1            Event1   350
    1            Event2   200
    2            Event1   350
    ...
    

    请分享您的想法!

    三江源!

1 个答案:

答案 0 :(得分:0)

是的,现在问题更清楚了!

scenarios输出是列表的集合。 scenarios[3,]包含“潜在收益率”,scenarios[4,]包含&#39;存在&#39;。

每个方案的实际产量可以确定如下:

potential_yields = simplify2array(scenarios[3,])
exists           = simplify2array(scenarios[4,])
actual_yields    = colSums(yields*exists)

确定和绘制分位数:

yield_q  = quantile(actual_yields,probs=0:100/100)
plot(x = 0:100, y = yield_q)

也许这就是你追求的目标。