我需要将矩阵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
的值。
答案 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