首页 > 解决方案 > R:使用 while 循环更新列表对象的问题

问题描述

我目前正在尝试使用在市场开放时运行的 while 循环模拟 R 中的(随机)市场:而时间少于 600 分钟。

在这个市场上,任何时候都可能发生四种事件中的一种:供应的诞生、需求的诞生、供应的死亡或需求的死亡。这些都是使用 rexp() 命令从指数分布中提取的,具有它们自己的强度。它们的数量和各自的价格均来自它们自己的正态分布(仅大于 0 的值),然后根据首先绘制的事件更新时间。

然后我想更新这些强度(使用 cox 回归),为此我需要存储有关每个事件的先前信息,最好是在一个列表中,以便我可以从生活用品中抽取样本和删除它们,以模仿购买。我基本上想跟踪给定时间市场上“活着”的东西。这是我的一些代码:

TIME <- 0
count <- 1
...
my.stores <- c()

        while(TIME < 600){
          time.supply.birth <- rexp(1, intensity1)
          time.supply.death <- rexp(1, intensity2)
          time.demand.birth <- rexp(1, intensity3)
          time.demand.death <- rexp(1, intensity4)


          case1 <- time.supply.birth == min(time.supply.birth, time.demand.birth, time.supply.death, time.demand.death)
          case2 <- time.supply.death == min(time.supply.birth, time.demand.birth, time.supply.death, time.demand.death)
          case3 <- time.demand.birth == min(time.supply.birth, time.demand.birth, time.supply.death, time.demand.death)
          case4 <- time.demand.death == min(time.supply.birth, time.demand.birth, time.supply.death, time.demand.death)

          TIME <- TIME + time.supply.birth*case1 + time.supply.death*case2 + time.demand.birth*case3 + time.demand.death*case4

          if(case1 == T){
            amount.supply.birth <- rnorm() # with values
            price.supply.birth <- rnorm()
            count.supply.birth.event <- count.supply.birth.event + 1
            my.stores[[count]]$amount.supply.birth <- c(my.stores[[count-1]]$amount.supply.birth, amount.supply.birth)
            my.stores[[count]]$price.supply.birth <- c(my.stores[[count-1]]$price.supply.birth, price.supply.birth)
} else if(case2 ==T) {
# Death supply event: here a sample from the living supplies should be drawn
} else if(case3 == T){
# Similar to case 1
} else if(case4 == T){
# similar to case 2
} else{
}
count <- count + 1
}

我的问题是我什至无法在列表中存储任何信息,因为 while 循环在一次迭代后立即中断,这导致列表 my.stores 的长度仅为 1 - 我敢打赌这与我的索引有关列表,但我不知道如何绕过它。我收到以下警告:

Error in my.stores[[count - 1]] : 
  attempt to select less than one element in get1index <real>

当我打印列表时,我得到以下信息:

> my.stores[[1]]
$amount.demand.birth
[1] 6.044815

假设我用数量和价格绘制了一个 demand.birth,然后下一次迭代我同样绘制了一个 supply.birth,我会喜欢这样的:

> my.stores[[1]]
$amount.demand.birth
[1] 6.044815
$amount.supply.birth
[1] 0
$price.demand.birth
[1] 50.78
$price.supply.birth
[1] 0

> my.stores[[2]]
$amount.demand.birth
[1] 6.044815
[2] 6.044815
$amount.supply.birth
[1] 0
[2] 7.1312
$price.demand.birth
[1] 50.78
[2] 50.78
$price.supply.birth
[1] 0
[2] 95.00

任何可以帮助我或有其他建议的人?对不起,很长的帖子。干杯!

标签: reventssimulation

解决方案


由于 my.stores[[0]] 无效,您是否尝试过:

        if (count==1) {
        my.stores[[count]]$amount.supply.birth <-  amount.supply.birth
        my.stores[[count]]$price.supply.birth <- price.supply.birth
    }
    else {
            my.stores[[count]]$amount.supply.birth <- c(my.stores[[count-1]]$amount.supply.birth, amount.supply.birth)
            my.stores[[count]]$price.supply.birth <- c(my.stores[[count-1]]$price.supply.birth, price.supply.birth)
    }

推荐阅读