monte carlo模拟中的循环内部循环(或更好的解决方法)
这个问题与我在交叉验证部分中提出的一个问题有关,但它严格地集中在R编码上 我正在尝试进行蒙特卡罗模拟,以创建累计年度损失分布。它从离散分布(在本例中为泊松分布)中提取随机数损失频率,然后从连续分布(例如对数正态分布)中为每个损失提取随机严重性 它不是很长或很复杂的一段代码,但是我遇到了一个难题 首先我要说的是:我是在R中编写循环的初学者(我不使用monte carlo模拟中的循环内部循环(或更好的解决方法),r,montecarlo,risk-analysis,R,Montecarlo,Risk Analysis,这个问题与我在交叉验证部分中提出的一个问题有关,但它严格地集中在R编码上 我正在尝试进行蒙特卡罗模拟,以创建累计年度损失分布。它从离散分布(在本例中为泊松分布)中提取随机数损失频率,然后从连续分布(例如对数正态分布)中为每个损失提取随机严重性 它不是很长或很复杂的一段代码,但是我遇到了一个难题 首先我要说的是:我是在R中编写循环的初学者(我不使用lappy或sapply函数只for)。我设法为每个损失生成了具有一定严重性的随机数,我有两个版本: (本部分适用于两个版本,我现在使用“培训”值) 第
lappy
或sapply
函数只for
)。我设法为每个损失生成了具有一定严重性的随机数,我有两个版本:
(本部分适用于两个版本,我现在使用“培训”值)
第1版:
第2版:
这些只是随机生成的数字,用来表示这些代码是如何工作的。我的问题是,我想我已经将这些循环放入另一个循环中,该循环将重复这些操作一定次数(由最终版本中的simvect=n
确定,其中n=10^5
或n=10^6
)。我希望它看起来像这样(手工制作):
所以我想生成随机字符串,然后重复这个过程,并将这两个字符串相加,以创建一个数据帧或得到更好的解释-矩阵的行数等于最大绘制频率数,列数等于选择的重复次数(此处表示为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
Vec=rep(0,simvect)#第一个组件
for(1中的z:simvect){
Vec[z]我在这里添加了评论,因为我不想再问另一个问题,是否有任何方法可以提高R在10^6次迭代中的性能(使其更快)?或者建议使用不同的软件/环境/语言?
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,] 3.825669
[2,] 6.612618
[3,] 31.890079
[4,] 3.400814
[5,] 11.453274
[6,] 12.498189
[7,] 3.773497
output2
1 18.632316
2 18.808997
3 1.526787
4 2.377593
5 5.786662
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
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=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