循环内部循环(或最好是解决方法)进行蒙特卡罗模拟

时间:2017-01-20 18:30:36

标签: r montecarlo risk-analysis

这个问题与我在Cross Validated部分中提到的问题有关,但是这个问题主要集中在R编码上。

我正在尝试进行蒙特卡罗模拟以创建聚合年度损失分布。它从离散分布(在这种情况下是泊松)中绘制随机数量的损失频率,然后对于每个损失,它从连续分布(例如,对数正态)中为每个损失绘制随机严重性

这不是很长或很复杂的代码,但是我难以解决问题。

首先我要说的是:我是在R中编写循环的初学者(我不使用lapplysapply函数for)。我设法为每一个产生了具有一定严重性的随机数量的损失,我有两个版本:

(这部分适用于两个版本,我现在正在使用“训练”值)

lambda=5 # lambda for poisson distribution
lnormpar1=2 #mean for lognormal distribution
lnormpar2=1 #standard deviation for lognormal distribution
simvect=10 #number of repeteation for monte carlo simulation

版本1:

  vec.f=c()
  for(z in 1:1){
    vec.f[z]<- qpois(runif(1, min=0, max=1),lambda)
  }
  output=matrix(ncol=1,nrow=vec.f)
  for(i in 1:vec.f){
    output[i]<- qlnorm(runif(1, min=0, max=1),meanlog=lnormpar1, sdlog=lnormpar2)
  }
output

或更短但我不确定更方便的版本2:

output2=c()
for(i in 1:qpois(runif(1, min=0, max=1),lambda)){
  output2[i]<- qlnorm(runif(1, min=0, max=1),meanlog=lnormpar1, sdlog=lnormpar2)
}
as.data.frame(output2)

他们都做同样的事情 - 生成具有指定严重性的随机丢失数量的“列”,使用我在此处发布的参数示例如下:

Ver1 with matrix:

          [,1]
[1,]  3.825669
[2,]  6.612618
[3,] 31.890079
[4,]  3.400814
[5,] 11.453274
[6,] 12.498189
[7,]  3.773497

版本2:

    output2
1 18.632316
2 18.808997
3  1.526787
4  2.377593
5  5.786662

这些只是随机生成的数字来表示这些代码的工作原理。我的问题是,我想我已将这些循环置于另一个循环中,该循环将重复这些操作一定次数(由最终版本中simvect=nn=10^5 n=10^6确定。我希望它看起来像这样(手工制作):

1.1 1.2 1.3
1.3 1.4 2.0
2.0 N/A 1.2
N/A N/A 3.0
N/A N/A 1.9

所以我想生成随机字符串,然后重复这个过程并将这些2加在一起以创建数据框或获得更好的解释 - 矩阵的行数等于最大绘制的频率数,而colnumber等于所选的重复次数(此处表示为simvect

这是很长的帖子,但我相信它解释了我的问题。提前谢谢大家!

1 个答案:

答案 0 :(得分:1)

我并不完全明白你最终想要达到的目标,但这就是我想出的。希望它有所帮助!

lambda=5 # lambda for poisson distribution
lnormpar1=2 #mean for lognormal distribution
lnormpar2=1 #standard deviation for lognormal distribution
simvect=1000000 #number of repeteation for monte carlo simulation

Vec和输出在我们循环时为我们保留值:

Vec=rep(0,simvect)       # first component
for(z in 1:simvect){
    Vec[z]<- qpois(runif(1, min=0, max=1),lambda)
}
Vec    # printing (not necessary)

output = rep(0,simvect)   # second component
for(i in 1:simvect){
  output[i]<- qlnorm(runif(1, min=0, max=1),meanlog=lnormpar1, sdlog=lnormpar2)
}

matrix(c(Vec,output), ncol=2)    # merging them