R语言用for循环生成转移概率矩阵结果错误如何修复?
问题排查与修复方案
核心排查技巧
遇到转移概率矩阵输出不符合预期时,首先执行rowSums(A)验证每行概率和是否为1,这是最快定位赋值错误的方法。
错误点逐一修复
- 1 第二行转移概率赋值错误
原代码对A[2,1]重复赋值两次,遗漏了向右转移到第3列的1/4概率,导致第二行概率和不为1,修正后第二行赋值应为:A[2,1] = 1/4 A[2,2] = 1/2 A[2,3] = 1/4 - 2 循环边界错误
原代码循环遍历k in 2:n,当k=2时k-2=0属于非法索引(R矩阵索引从1开始),且重复给第n行赋值属于冗余操作。正确循环应覆盖3到n-1的中间状态行,最后一行单独放在循环外赋值:for (k in 3:(n-1)) { A[k,k+1] = 1/4 A[k,k] = 1/2 A[k,k-1] = 1/6 A[k,k-2] = 1/12 } A[n,n] = 3/4 A[n,n-1] = 1/6 A[n,n-2] = 1/12 - 3 稳态迭代逻辑错误
原代码for (i in 10000)只会执行1次迭代(仅取i=10000一个值),相当于只计算了2步转移矩阵,远达不到稳态。需要改成遍历1到10000的序列:pA = A for (i in 1:10000) { pA = pA %*% A }
修正后完整可运行代码
n=100 A = matrix(0, nrow = n+1, ncol = n+1) # 首行边界赋值 A[1,2] = 1/4 A[1,1] = 3/4 # 第二行赋值 A[2,1] = 1/4 A[2,2] = 1/2 A[2,3] = 1/4 # 中间行赋值 for (k in 3:(n-1)) { A[k,k+1] = 1/4 A[k,k] = 1/2 A[k,k-1] = 1/6 A[k,k-2] = 1/12 } # 末行边界赋值 A[n,n] = 3/4 A[n,n-1] = 1/6 A[n,n-2] = 1/12 # 迭代求稳态 pA = A for (i in 1:10000) { pA = pA %*% A } # 输出前3列稳态值 print(pA[1,1:3])
运行后第一行前3列输出为0.2087312 0.1652070 0.1307402,和预期结果完全一致。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

