1

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

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

它不是很长或很复杂的一段代码,但是我遇到了一个问题。

首先我应该说的是:我是在 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:

          [,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=n位置n=10^5n=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

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

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

4

1 回答 1

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 和 output 在我们循环时为我们保留值:

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
于 2017-03-29T05:15:50.273 回答