Переназначить значения в цикле в R - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно умножить матрицу estado на матрицу matriz_de перехода и переназначить переменную estado на результат умножения, я должен сделать это 1000 раз, и мне нужно повторить моделирование100 раз.

Т.е. умножьте матрицу estado на переход matriz_de_ 1000 раз и посмотрите, сходится ли значение estado, затем повторите эту операцию 100 раз.

У меня естьпробовал с циклами for, но способ, которым я переназначаю значения переменной estado, не работает, так как я продолжаю получать те же самые результаты, даже если, когда я делаю это вручную, кажется, что он работает.

This is my code:

    nombre_estados <- c("Estado 1","Estado 2","Estado 3")
    matriz_de_transicion <- matrix(c(0.2,0.7,0.1,
                                     0.3,0.7,0.0,
                                     0.1,0.4,0.5), 
                            byrow = T,nrow = 3, dimnames = list(nombre_estados,nombre_estados))
    estado <- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1)

    estado <- estado %*% matriz_de_transicion
    estado # 0.26     0.67     0.07
    estado <- estado %*% matriz_de_transicion
    estado # 0.26    0.679    0.061
   # repeat this 1000 times

Большое спасибо за ответы, как я могу затем добавить эти окончательные estados в матрицу 100 x 3 ?.Я создал матрицу 100 x 3:

datos <- matrix(c(0,0,0),byrow = F,ncol =  3, nrow = 100)

Затем я попытался сделать вложенный цикл:

for(i in 1:100){
for(i in 1:1000){
  estado <- estado %*% matriz_de_transicion  
}
  datos[,1] <- estado[1,1]
  datos[,2] <- estado[1,2]
  datos[,3] <- estado[1,3]
  estado <- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1) # I thought this would reset the value to the initial state but I fill the 100 x 3 matrix with the same values.
}
           [,1]      [,2]       [,3]
  [1,] 0.2631579 0.6842105 0.05263158
  [2,] 0.2631579 0.6842105 0.05263158
  [3,] 0.2631579 0.6842105 0.05263158
  [4,] 0.2631579 0.6842105 0.05263158
  [5,] 0.2631579 0.6842105 0.05263158
  [6,] 0.2631579 0.6842105 0.05263158
  [7,] 0.2631579 0.6842105 0.05263158
  [8,] 0.2631579 0.6842105 0.05263158

Я пытаюсь сбросить значение переменной estado,для каждого из 100 имитаций, которые мне нужно получить в конце, поэтому каждый из циклов 1: 1000 имеет одинаковое начальное значение для estado.

Ответы [ 2 ]

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

Может быть, что-то вроде следующего.

У меня есть функция, возвращающая дополнительную информацию, так как вы спрашиваете, сходится ли значение estado.

fun <- function(M, Trans, n = 1000, tol = .Machine$double.eps^0.5){
    for(i in seq_len(n)){
        Prev <- M
        M <- M %*% Trans
        if(all(abs(M - Prev) < tol)) break
    }
    list(Final = M, converge = i < n, iter = i)
}

fun(estado, matriz_de_transicion)
#$`Final`
#      Estado 1  Estado 2   Estado 3
#[1,] 0.2631579 0.6842105 0.05263159
#
#$converge
#[1] TRUE
#
#$iter
#[1] 18
0 голосов
/ 13 мая 2018

Я уверен, что for-loop подойдет для этой цели.Не уверен, почему ОП считает, что расчет не учитывается при следующих вызовах.В любом случае estado объявлено в глобальном масштабе.

estado <- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1)
for(i in 1:1000){
  estado <- estado %*% matriz_de_transicion  
}
estado 
#  Estado 1  Estado 2   Estado 3
#[1,] 0.2631579 0.6842105 0.05263158
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...