В то время как l oop не выполняется правильно в R? - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь создать код, который будет генерировать матрицу отсчетов, которая подсчитывает количество переходов из «состояния 10» в состояние i, где i находится между 1 и 20, где переходы моделируются при определенных условиях. Я достиг следующего этапа моего кода:

A <- matrix(c(0), 1, 50)
M <- matrix(c(0), 1, 20)
A[1, 1] = min(max(rpois(1, 20), 0), 20)

i = 2
while (i < 50) {
  A[1, i] <- min(max(rpois(1, 20)-rbinom(1, A[ , i-1] , .4), 0), 20)
    if (A[1, i] == 10) {
      M[1, A[1, i + 1]] = M[1, A[1, i + 1]] + 1
    }
    i = i + 1
}
  A[1, 50] <- min(max(rpois(1, 20) - rbinom(1, A[, 49], .4), 0), 20)

Проблема в том, что, пока l oop не выполняется должным образом, и мой вывод для M всегда:

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

Я извиняюсь, если мой код грязный, но я не уверен относительно того, где ошибка в логи c моего пока l oop. Любая помощь будет оценена.

1 Ответ

1 голос
/ 25 февраля 2020

Глядя на строку, где вы изменяете M в вашем while

M[1 , A[1 , i + 1]] = M[1,A[1, i + 1]] + 1

, я вижу, что у вас есть A[1 , i + 1] в качестве индекса. A - это также матрица нулей, которую вы изменяете, как показано ниже:

 A[1 ,i] <- min(max(rpois(1,20)-rbinom(1, A[ , i-1] , .4),0),20)

Таким образом, вы меняете значение A[1, i]; однако вы используете A[1 , i + 1], когда хотите изменить M. Поскольку вы не присвоили никаких значений, кроме i-й записи, A[1 , i + 1] равно нулю.

Итак, вы получите:

M[1 , 0] = M[1, 0] + 1

Вот почему M остается такой же. M[1 , 0] равно numeric(0) и M[1, 0] + 1. Вы не присваиваете запись из M и не присваиваете значение.

Чтобы обратиться к другому комментарию под постом, мы можем использовать print и проверить, является ли условие для оператора if когда-либо встречались или нет:

while (i < 50) {
  A[1,i] <- min(max(rpois(1,20)-rbinom(1, A[1,i-1], .4), 0), 20)
    if (A[1, i] == 10) {
        print(paste("i is equal to", i, "and A[1,i]==10 is TRUE"))
      M[1, A[1, i + 1]] = M[1, A[1, i + 1]] + 1
    }
    i = i + 1
}

Вы увидите, что условие выполняется кучу раз.

...