【问题标题】:How can I fix this wrong result in matrix for loop in R?如何在 R 中的矩阵 for 循环中修复此错误结果?
【发布时间】:2021-11-24 10:51:39
【问题描述】:

我想在 R 中输入以下矩阵(转移概率),但我做错了,输出不正确。 矩阵在图中:

我的努力如下:

n=100
A = matrix(c(0),n+1,n+1);A
A[1,2] = 1/4 
A[1,1] = 3/4
A[2,1] = 1/4 
A[2,2] = 1/2 
A[2,1] = 1/4
for (k in 2:n) {
  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}
A


pA = A
for (i in 10000){
  pA = pA %*% A }
pA

但结果列(前 3 列)必须为:0.2087、0.1652、0.1307

有什么帮助吗?

【问题讨论】:

  • i in 10000 只是i <- 10000。你错过1:了吗?
  • 在您的第一行中,您为A[2, ...] 设置了值,但在您的for-loop 中您替换了它们。例如:A[2,1] <- 1/4 但对于k = 2,您设置A[2, 1] <- 1/6
  • @MartinGal 因为 R 从 1 而不是从 0 开始。插入这些概率有何不同?

标签: r for-loop matrix


【解决方案1】:

您可以在这里尝试稍微不同的方法:

n <- 100
A <- matrix(0, n + 1, n + 1)

# create index for the diagonal and the "other" diagonales
A_diag <- matrix(c(1:(n + 1), 1:(n + 1)), ncol = 2)
A_diag_1 <- matrix(c(1:(n + 1), 1 + 1:(n + 1)), ncol = 2)
A_diag_minus_1 <- matrix(c(1:(n + 1), - 1 + 1:(n + 1)), ncol = 2)
A_diag_minus_2 <- matrix(c(1:(n + 1), - 2 + 1:(n + 1)), ncol = 2)

# populate those diagonales
A[A_diag] <- 1/2
A[A_diag_1[A_diag_1[,2] <= n + 1,]] <- 1/4
A[A_diag_minus_1[A_diag_minus_1[,2] >= 1,]] <- 1/6
A[A_diag_minus_2[A_diag_minus_2[,2] >= 1,]] <- 1/12

# create starting values
A[1, 1] <- 3/4
A[2, 1] <- 1/4

# calculate pA
pA <- A
for (i in 1:10000){ pA <- pA %*% A }

返回

pA[1, 1:3]
#> [1] 0.2087122 0.1651514 0.1306823

对于pA 的计算,您可以使用expm 包来加快速度:

library(expm)

pB <- A %^% 10000

pB[1,1:3]
#> [1] 0.2087122 0.1651514 0.1306823

【讨论】:

  • 非常感谢您的贡献。清晰而有意义的答案。我很感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多