Этот вопрос связан с тем, который я задал в разделе Cross Validated, однако он строго ориентирован на кодирование R.Петля внутри петли (или желательно обходной путь) для моделирования monte carlo
Я пытаюсь сделать monte carlo для создания совокупного распределения ежегодных потерь. Он набирает случайное число частот потерь из дискретного распределения (в данном случае Пуассона), а затем для каждой потери он получает произвольную степень тяжести для каждого из непрерывного распределения (например, log-normal)
Это не очень длинный или сложный фрагмент кода, однако я столкнулся с проблемой.
Сначала я должен сказать: я начинаю писать контуры в R (я не использую или 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
ver1:
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
VER2:
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 совместно созданный кадр данных или получить лучшее объяснение - матрицу с числом строки равны максимальному количеству набранных частот и кол-вом равно выбранному числу повторений (обозначается здесь как simvect
)
Это длинный пост, но я считаю, что это объясняет мою проблему. Спасибо всем заранее!
добавить комментарий здесь, потому что я не хочу, чтобы другой вопрос, есть ли способ, чтобы улучшить производительность (сделать это быстрее) R для 10^6 итераций? Или рекомендуется использовать другое программное обеспечение/среду/язык? – Alexandros