r-用于蒙特卡罗模拟的环内循环(或者最好是变通方法)



这个问题与我在"交叉验证"部分中提出的一个问题有关,但它严格集中在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)

它们都做同样的事情——使用我在这里发布的参数生成具有指定严重性的随机损失数量的"列"。示例如下:

带矩阵的版本1:

[,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

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

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

我不完全理解你最终想要实现什么,但这就是我想到的。希望它能有所帮助!

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

相关内容

最新更新