проблема с циклом while в r

#r

#r

Вопрос:

я пытаюсь заставить этот цикл в моей программе r работать, но он не дает мне желаемых результатов. Я пытаюсь смоделировать договор страхования, в котором имеется n ценных бумаг, которые имеют фиксированный вектор вероятности дефолта (данные [i, 2]) и вектор выплат (данные [i, 1]).

мне нужно оценить величину стоп-лоссов на уровне ценных бумаг и на уровне портфеля. чтобы сделать это, я создал два цикла while для условных векторов каждого уровня (которые будут введены в функцию пользователем), один цикл while для сканирования различных ценных бумаг и последний цикл для моделирования различных сценариев. я попытался использовать возможности матрицы R, чтобы помочь упорядочить результаты.

проблема с этим кодом заключается в том, что оператор if ведет себя странно, неправильно активируя и фильтруя. это приводит к замедлению работы программы и получению плохих результатов. он всегда заполняет столбец индивидуальной защиты, а не обусловливает его вектором вероятности (данные[i,2]). в нем много движущихся частей, но в целом это простая модель.

  y = years
nr=nrow(data1)
nc=ncol(data1)
isl =  individualStopLoss
asl = aggregateStoploss
Lasl = length(asl)
LIsl = length(isl)
claims = vector(mode = "logical",length= asl)
 individualProtection = matrix(0,ncol=LIsl,nrow=y)
 aggregateProtection = matrix(0,ncol=Lasl ,nrow=y)
expectedClaims = data1[,1]*data1[,2]
expectedClaims = sum(expectedClaims)
k = 1
m=1
    while (k<=y)
        {j = 1
         m = 1
         runi = runif(nr, min=0, max=1)
         while (m<=Lasl)
            {while (j<=LIsl)
                     {i=1
                       while (i<=nr) 
                           {if ( runi[i] < data1[i,2] )
                               {individualProtection[k,j] = individualProtection[k,j]   max(data1[i,1]-isl[j],0) 
                               claims[k] = claims[k]   data1[i,1]
                               i=i 1
                                }
                                else{i= i 1}
                           }
                        j=j 1
                     }        
            aggregateProtection[k,m]= aggregateProtection[k,m]   max(claims[k] - expectedClaims*asl[m],0)
            m = m 1
            }
        k = k 1
        }
  

Комментарии:

1. (1) Очень помогло бы сделать ваш пример воспроизводимым, чтобы другие действительно могли запускать ваш код. Попробуйте предоставить небольшой объем ваших данных (data1, years, isl, asl). (2) Если вы считаете, что оператор if вычисляется неправильно, вы всегда можете ввести несколько операторов cat(), чтобы проверить, каковы runi[i] и data1[i, 2] при запуске программы.

2. Не могли бы вы предоставить упрощенный числовой пример того, что вы ожидаете получить от ваших результирующих векторов, aggregateProtection и claims которые будут даны data1[i,1] = 1,2,3 и data1[i,2] = 3,2,1 или что-то подобное, что обеспечивает более четкое объяснение чисел, которые вы пытаетесь получить?

Ответ №1:

Просто пример, который поможет вам предоставить воспроизводимый пример, будет удален при обновлении вашего вопроса.

 data1 <- cbind(rnorm(1000),rnorm(1000))
y = sample(rep(1990:2011,1000),1000)
nr=nrow(data1)
nc=ncol(data1)
isl =  rnorm(500)
asl = rnorm(500)
Lasl = length(asl)
LIsl = length(isl)