用于计算R中的平稳分布的源代码

时间:2019-05-10 00:06:16

标签: r markov-chains markov

看看this link

我正在尝试理解以下用于查找矩阵的平稳分布的源代码:

# Stationary distribution of discrete-time Markov chain
# (uses eigenvectors)
stationary <- function(mat)
{
    x = eigen(t(mat))$vectors[,1]
    as.double(x/sum(x))
}

我自己测试了以下源代码:

> rm(list=ls())
>
> P <- matrix(c(0.66, 0.34,
+               0.66, 0.34), nrow=2, ncol=2, byrow = TRUE)
>
> x <- eigen(t(P))
> x$values
[1] 1 0

$vectors
          [,1]       [,2]
[1,] 0.8889746 -0.7071068
[2,] 0.4579566  0.7071068

> y <- x$vectors[,1]
> y
[1] 0.8889746 0.4579566
>  

看起来像命令

y <- x$vectors[,1]

正在选择矩阵的第一列。

为什么不是这样简单地写成这样?

# Stationary distribution of discrete-time Markov chain
# (uses eigenvectors)
stationary <- function(mat)
{
    x = eigen(t(mat))
    y = x[,1]
    as.double(y/sum(y))
}

引入美元符号和矢量关键字的原因是什么?

1 个答案:

答案 0 :(得分:1)

让我们测试一下您的建议:

> P <- matrix(c(0.66, 0.34, 0.66, 0.34), nrow=2, ncol=2, byrow = TRUE)
> x <- eigen(t(P))
> print(x)
eigen() decomposition
$values
[1] 1 0

$vectors
          [,1]       [,2]
[1,] 0.8889746 -0.7071068
[2,] 0.4579566  0.7071068

> y = x[,1]

这将产生以下错误消息:

Error in x[, 1] : incorrect number of dimensions

eigen返回一个命名列表,其特征值命名为values,特征矢量则命名为vector。访问列表的此组件。我们使用美元符号。因此,这就是为什么代码x $ vectors提取矩阵的原因。