Ошибка при использовании цикла for при создании симуляций

#r #for-loop

#r #for-цикл

Вопрос:

Я пытаюсь использовать цикл for для моделирования 1000 портфелей с 3 облигациями в каждом портфеле и определения вероятности дефолта двух из трех облигаций. Вот мой код (с комментариями):

 #Reproducibility
set.seed(33)
#Number of trials
n<-1000
#Initialize variables
numberofdefaults<-0
counter<-0
portfolio <- 0
for (i in 1:n){
  portfolio[i] <- rbinom(3, 1, prob = 0.127)      # generate three random binomial deviates with probabiltiy of sucess("default" in my case)0.127 and store them in a vector 
  numberofdefaults[i] <- sum(portfolio[i] == 1)      # find the number of defaults in the vector (1 for default) and add them up 
    if (numberofdefaults[i] == 2) {              # if number of defaults is 2, then add 1 to the counter
        counter<-counter 1
    }
}
  

Когда я выполняю код, я продолжаю получать сообщение об ошибке: количество элементов для замены не кратно длине замены

Спасибо, что уделили вам время. Любые предложения будут оценены.

Ответ №1:

Ваш код работает не так, как предполагалось. Портфель — это вектор, поэтому, когда вы запускаете rbinom() , который содержит 3 элемента, вы пытаетесь втиснуть 3 элемента в один элемент (i-й элемент этого конкретного цикла for). Он выдает вам предупреждение о том, что он не может этого сделать (и каждый раз сохраняется только в первом элементе). Вместо этого вы хотите, чтобы портфолио было списком.

 set.seed(33)
#Number of trials
n<-1000
#Initialize variables
numberofdefaults<-0
counter<-0
portfolio <- list() # Change this
for (i in 1:n){
  portfolio[[i]] <- rbinom(3, 1, prob = 0.127)      # Change this 
  numberofdefaults[i] <- sum(portfolio[[i]] == 1)      # Change this
  if (numberofdefaults[i] == 2) {              
    counter<-counter 1
  }
}
  

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

1. Thnx так много. Очень признателен.

2. Возможно, вы захотите выяснить sum(portfolio[[i]] == 1) , выполняет ли он то, что вы хотите, чтобы он делал. Я не совсем понимаю, каково ожидаемое поведение. В противном случае, пожалуйста, отметьте ответ как решение проблемы.

3. Понятно. Спасибо за помощь.