【问题标题】:Error for using for-loop when producing simulations生成模拟时使用 for 循环的错误
【发布时间】:2020-09-28 08:07:18
【问题描述】:

我正在尝试使用 for 循环模拟 1,000 个投资组合,每个投资组合中有 3 只债券,并找出三分之二的债券违约的概率。 这是我的代码(使用 cmets):

#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
    }
}

当我执行代码时,我不断收到一条错误消息:要替换的项目数不是替换长度的倍数

非常感谢您抽出宝贵的时间。任何建议将不胜感激。

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    您的代码未按预期工作。 Portfolio 是一个向量,因此当您运行具有 3 个元素的 rbinom() 时,您试图将 3 个元素塞入一个元素(该特定 for 循环的第 i 个元素)。它给你一个警告,它不能这样做(并且每次只存储在第一个元素中)。相反,您希望 Portfolio 成为一个列表。

    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
      }
    }
    

    【讨论】:

    • 非常感谢。非常感谢。
    • 您可能想调查sum(portfolio[[i]] == 1) 是否正在做您希望它做的事情。我不清楚预期的行为是什么。否则,请将答案标记为解决问题。
    • 明白。感谢您的帮助。
    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    相关资源
    最近更新 更多