2017-01-20 23 views
1

Этот вопрос связан с тем, который я задал в разделе 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)

Это длинный пост, но я считаю, что это объясняет мою проблему. Спасибо всем заранее!

+0

добавить комментарий здесь, потому что я не хочу, чтобы другой вопрос, есть ли способ, чтобы улучшить производительность (сделать это быстрее) R для 10^6 итераций? Или рекомендуется использовать другое программное обеспечение/среду/язык? – Alexandros

ответ

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