【问题标题】:How do I specifiy where results will be stored when performing a simulation?执行模拟时如何指定结果的存储位置?
【发布时间】:2019-12-12 21:06:47
【问题描述】:

我目前正在执行下面的模拟。我做过一次,希望能重复 100 次。但是,在 100 次模拟中,我得到了相同的结果。我很难知道 for 循环结果的存储位置或方式。我是 R 中的一个大人物,所以完全不知道我下面的代码有什么问题。

#### Repeating the simulation for 100 times
nsims= 100
incomes_priv = matrix(NA, 36, nsims)# store priv income results
incomes_pub=matrix(NA,36, nsims)#to store pub income results
savings_priv= matrix(NA, 36, nsims)#to store savings from priv
savings_public=matrix(NA,36 ,nsims)#to store savings from pub

set.seed(500)

for (j in 1:nsims){{
  print(j)

  for(i in 1:36){incomes_pub100= rnorm(36 ,29200, 10000)
  income_priv100=rnorm(36,25500, 17000)
    saved_pub100=prop.saved *income_pub100
    saved_pri100=prop.saved *income_priv100}


  incomes_pri <- incomes_priv100
  incomes_pub<- income_pub100
  savings_priv <- saved_pri100
  savings_pub<- saved_pub100
}  

【问题讨论】:

  • 我明白你想要做什么,但你为什么要这样做?
  • 我认为有一种更简单的方法可以做到这一点,但您的最终目标是什么?您或许可以简化整个流程
  • 在循环之前也不会调用prop.saved
  • 也是为了回答你的问题,结果存储在incomes_priincomes_pubsavings_privsavings_pub中,但是它是将原始矩阵覆盖到向量中跨度>

标签: r simulation


【解决方案1】:

您没有索引这些矩阵中您希望存储结果的位置,因此您每次都在覆盖它们。试试:

#### Repeating the simulation for 100 times
nsims          = 100
incomes_priv   = matrix(NA, 36, nsims)  # store priv income results
incomes_pub    = matrix(NA, 36, nsims)  # to store pub income results
savings_priv   = matrix(NA, 36, nsims)  # to store savings from priv
savings_pub    = matrix(NA, 36, nsims)  # to store savings from pub
prop.saved     = .1

set.seed(500)

for(j in 1:nsims){
  print(j)

  for(i in 1:36){
    income_pub100  = rnorm(1, 29200, 10000) 
    income_priv100 = rnorm(1, 25500, 17000)
    saved_pub100   = prop.saved *income_pub100
    saved_pri100   = prop.saved *income_priv100

    incomes_priv[i,j] <- income_priv100
    incomes_pub[i,j]  <- income_pub100
    savings_priv[i,j] <- saved_pri100
    savings_pub[i,j]  <- saved_pub100
  }
}  

关键是我添加了[i,j] 来指示每个矩阵中应该存储结果的何处。这样,您不会在每次通过循环时覆盖矩阵。 (我还清理了很多代码,例如不匹配的大括号,并使代码在视觉上更好地排序。)

【讨论】:

  • 莫妮卡,谢谢你的帮助。我现在收到一条错误消息:项目数不是替换长度的倍数。
  • @Lorato,“gung”不是“Monica”。要了解我更改用户名和头像的原因,请参阅here
  • 作为记录,我没有运行此代码,它的效率相当低且有很多错误。我只是修复了明显的问题,将代码保持在您可能会感到舒适的结构中。关于您的明确问题,最大的问题是您没有下标 ([i,j]),因此您在每次迭代时都覆盖了变量。 @akash87 给出了更合理的代码。我会尝试运行它以查看是否可以识别问题。
  • 所以,我首先注意到的是prop.saved 没有在这里定义。 (大概是您没有复制到 Q 中的代码。我将其定义为 .1
  • 谢谢,我认为主要问题是我不知道我在做什么哈哈
【解决方案2】:

为了简化您的代码,我会这样做

nr <- 36
nsims <- 100
incomes_priv <- matrix(rnorm(nr*nsims, 29200, 10000), nr, nsims)
incomes_pub  <- matrix(rnorm(nr*nsims, 25500, 17000), nr, nsims)
savings_priv <- prop.saved * incomes_priv
savings_pub  <- prop.saved * incomes_pub

这应该会导致一些接近的结果。当您可以一次随机生成所有值并将它们相应地放入矩阵中时,不确定为什么需要一次迭代一个值/一列。

【讨论】:

  • 谢谢@akash87。我主要关注以这种方式编写代码的课堂笔记。还不能在没有大量重复注释的情况下使用 R。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
相关资源
最近更新 更多