这个问题与我在"交叉验证"部分中提出的一个问题有关,但它严格集中在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)
它们都做同样的事情——使用我在这里发布的参数生成具有指定严重性的随机损失数量的"列"。示例如下:
带矩阵的版本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^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
)
这是一篇很长的帖子,但我相信它解释了我的问题。提前感谢大家!
我不完全理解你最终想要实现什么,但这就是我想到的。希望它能有所帮助!
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