我有一个包含一组事件(大约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)求和,更不用说在总和上找到百分位数(带有分位数函数)。你会如何处理?
关于数据结构,我有一些想法,但我不确定..
也许我应该转换预测,然后以某种方式逐个迭代MC场景并对数据求和?
也许我应该从不存在的结果中筛选出事件(Exists == 0)。但是我该怎么做以及在哪里呢?
如果结果看起来像这样(或者我也不知道如何实现这一点),这可能也会更有意义:
Scenario Name Yield
1 Event1 350
1 Event2 200
2 Event1 350
...
请分享您的想法!
三江源!
答案 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)
也许这就是你追求的目标。