R语言循环重新赋值:马尔可夫链模拟收敛及矩阵填充问题
问题分析与解决方案
你遇到的核心问题是嵌套循环使用了同一个变量名i,这直接打乱了外层循环的执行逻辑,再加上estado的重置时机错误,最终导致所有行都输出相同值。
错误原因拆解
- 循环变量冲突:外层循环用
i in 1:100,内层循环又用i in 1:1000。当内层循环跑完1000次后,i的值会直接变成1000,外层循环因此直接终止——相当于只执行了1次外层循环,然后你把这个唯一的结果赋值给了datos的整列,自然所有行都一模一样。 estado重置时机错误:你把estado的重置放在了外层循环的末尾,即便外层循环能正常执行,第一次模拟的初始状态也没被正确重置;正确的做法应该是每次模拟开始前就初始化estado。
修正后的代码
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)) # 初始化结果矩阵 datos <- matrix(0, nrow = 100, ncol = 3) # 外层循环:100次模拟 for(i in 1:100){ # 每次模拟前先重置初始状态! estado <- matrix(c(0.2,0.7,0.1),byrow = T, nrow = 1) # 内层循环:1000次转移,改用j作为循环变量避免冲突 for(j in 1:1000){ estado <- estado %*% matriz_de_transicion } # 将当前模拟的结果赋值给datos的第i行(而非整列) datos[i,] <- estado } # 查看结果 head(datos)
补充说明
你的转移矩阵对应的马尔可夫链是遍历的,最终会收敛到唯一的稳态分布,所以100次模拟的结果理论上应该完全一致(忽略浮点误差)。如果想验证重置逻辑是否生效,可以把内层循环的次数改成10次,这样每次模拟的中间状态还未收敛,就能看到datos的行不再完全相同了。
内容的提问来源于stack exchange,提问作者Sergi
相关产品推荐
相关产品推荐

