将矩阵转换为R中的马尔可夫转移矩阵

时间:2013-02-26 20:21:13

标签: r markov-chains

我有一个矩阵垫,其值介于0和1之间(因此可能是概率),如下所示:

> t <- c(22, 65, 37, 84, 36, 14, 9, 19, 5, 49)
> x <- t/max(t)
> mat <- x%*%t(x)

我现在想将此矩阵b转换为马尔可夫转换矩阵,即每行的元素加起来为1.我通过将矩阵除以rowSums来实现:

> y <- mat/rowSums(mat)
> z <- y/rowSums(y)
> rowSums(z)
  [1] 1 1 1 1 1 1 1 1 1 1

但是,这会导致每列中的元素具有相同的值:

           [,1]      [,2]      [,3]      [,4]      [,5]
 [1,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 
 [2,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 
 [3,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 
 [4,] 0.06470588 0.1911765 0.1088235 0.2470588 0.1058824 

这不是我想要的。我要求每个元素都有不同的值,但我不知道如何做到这一点。任何建议表示赞赏!

3 个答案:

答案 0 :(得分:1)

为什么你首先制作矩阵y然后z

你对rowSums进行划分的想法是正确的,但我认为问题出在原始矩阵中,因为这有效:

mat<-matrix(runif(100),10,10)
mat2<-mat/rowSums(mat)
rowSums(mat2)
 [1] 1 1 1 1 1 1 1 1 1 1

编辑:行x <- t/max(t)似乎会导致不受欢迎的行为,即您不应将向量t除以最大值,因为这会使得结果矩阵变为单数。

答案 1 :(得分:1)

mat中不能有对称矩阵。试试这个:

n <- 10
mat <- matrix(runif(n**2),n)
mat <- mat/rowSums(mat)

答案 2 :(得分:1)

你可以用runif填充矩阵然后迭代Sinkhorn-Knopf算法(例如,在http://www.cerfacs.fr/algor/reports/2006/TR_PA_06_42.ps.gz的第3页的顶部描述)将收敛到双随机(Markov)基质