在R中的循环内重新分配值

时间:2018-05-13 10:30:56

标签: r loops

我需要将矩阵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 :(得分:1)

我确信for-loop只适合这个目的。不确定为什么OP认为计算不会对下一次调用生效。无论如何,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

答案 1 :(得分:1)

可能类似以下内容。

我有函数返回额外信息,因为你问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