1

我有一个包含一组事件(约 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

但是我不知道如何对每个场景确实存在的事件(Exists == 1)求和 Yield,更不用说在总和上找到一个百分位数(带有分位数函数)。你会怎么做呢?

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

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

  2. 也许我应该从结果中过滤掉不存在的事件(Exists == 0)。但是我应该如何以及在哪里做呢?

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

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

请分享你的想法!

谢谢!

4

1 回答 1

0

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

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

每种方案的实际收益率可以确定如下:

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)

也许这就是你所追求的。

于 2014-03-18T12:57:28.263 回答