R: Проблемы с обновлением объектов списка с помощью цикла while - PullRequest
0 голосов
/ 03 мая 2018

В настоящее время я пытаюсь смоделировать (случайный) рынок в R, используя цикл while, который работает, когда рынок открыт: время меньше 600 минут.

На этом рынке в любое время может произойти только одно из четырех событий: рождение предложения, рождение спроса, смерть предложения или смерть спроса. Все они взяты из экспоненциальных распределений с использованием команды rexp () с собственной интенсивностью. Их суммы и соответствующие цены взяты из их собственного нормального распределения (только значения больше 0), и затем время обновляется в зависимости от того, какое из событий было нарисовано первым.

Затем я хотел бы обновить эти интенсивности (используя регрессию Кокса), и чтобы это произошло, мне нужно сохранить предыдущую информацию о каждом из событий, предпочтительно в списке, чтобы я мог, например, извлечь образцы из живые припасы и убрать их, подражать покупке. Я в основном хочу отслеживать то, что «живо» на рынке в данный момент времени. Вот часть моего кода:

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

Скажем, я рисую сумму спроса и рождения с суммой и ценой, а затем на следующей итерации я аналогично рисую поставку. Я хотел бы что-то вроде:

> 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

Кто-нибудь, кто может мне помочь с этим или у кого есть другие предложения? Извините за длинный пост. Ура!

1 Ответ

0 голосов
/ 03 мая 2018

Поскольку 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)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...