代码之家  ›  专栏  ›  技术社区  ›  user315648

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

  •  1
  • user315648  · 技术社区  · 11 年前

    我有一个CSV文件,其中包含一组事件(大约40个项目),根据给定的概率,所有事件都可能发生或不发生。列:事件名称、产量大小、概率。

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

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

    我很难把它写下来。。(我还在学习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
    

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

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

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

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

    如果结果是这样的话(但我也不知道如何实现这一点),这可能会更有意义:

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

    请分享您的想法!

    谢谢你!

    1 回复  |  直到 11 年前
        1
  •  0
  •   koekenbakker    11 年前

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

    这个 scenarios 输出是列表的集合。 scenarios[3,] 包含“潜在产量”, scenarios[4,] 包含“exists”。

    每种情况下的实际产量可确定如下:

    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)
    

    也许这就是你想要的。