r - 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
任何可以帮助我或有其他建议的人?对不起,很长的帖子。干杯!
解决方案
由于 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)
}
推荐阅读
- flutter - Flutter - 这是动画页面进度指示器的有效方法吗?
- firebase - Firebase 模拟器从 2 个实时数据库开始?
- assembly - 在特定位置组装打印
- exchange-server - 本地 MS Exchange 2016 上的 30 条消息限制
- python - 在python中获取每个月的最后一个星期五
- gulp - 在具有单个 gulp 文件的多个项目中选择一个项目文件
- asp.net - 使用 OnDataBound asp:net gridview 合并单元格后对网格视图进行排序
- azure - 如何使用 powershell 为应用服务/Web 应用启用存储帐户备份?
- c++ - C++中的显式转换函数
- sql-server - 如何在不添加新行的情况下从 sql 追加文本文件