这个问题与我在Cross Validated部分中提到的问题有关,但是这个问题主要集中在R编码上。
我正在尝试进行蒙特卡罗模拟以创建聚合年度损失分布。它从离散分布(在这种情况下是泊松)中绘制随机数量的损失频率,然后对于每个损失,它从连续分布(例如,对数正态)中为每个损失绘制随机严重性
这不是很长或很复杂的代码,但是我难以解决问题。
首先我要说的是:我是在R中编写循环的初学者(我不使用lapply
或sapply
函数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=n
或n=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
)
这是很长的帖子,但我相信它解释了我的问题。提前谢谢大家!
答案 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