#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. Понятно. Спасибо за помощь.