You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言循环重新赋值:马尔可夫链模拟收敛及矩阵填充问题

问题分析与解决方案

你遇到的核心问题是嵌套循环使用了同一个变量名i,这直接打乱了外层循环的执行逻辑,再加上estado的重置时机错误,最终导致所有行都输出相同值。

错误原因拆解

  1. 循环变量冲突:外层循环用i in 1:100,内层循环又用i in 1:1000。当内层循环跑完1000次后,i的值会直接变成1000,外层循环因此直接终止——相当于只执行了1次外层循环,然后你把这个唯一的结果赋值给了datos的整列,自然所有行都一模一样。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:24:59