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

计算R中平稳分布的源代码,r,markov-chains,markov,R,Markov Chains,Markov,看一看 我试图理解以下用于寻找矩阵平稳分布的源代码: # 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 <- m

看一看

我试图理解以下用于寻找矩阵平稳分布的源代码:

# 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))
}

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

让我们来测试一下您的提案:

> 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]

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

美元运算符是从S/Splus继承的。最好避免。您的观察是正确的,引入美元符号和向量关键字的原因是什么?我不明白你在问什么。特征值返回一个列表,其中元素向量是存储在矩阵中的特征向量。因此,您只需从eigen返回的列表中访问vectors元素。使用$indexing访问列表元素没有什么错,例如lst@user366312我想wildplasser可能误解了您的问题。正如我所说的,使用$访问命名列表中的元素绝对没有错。您也可以使用$-索引来访问data.frame中的元素列,对吗?嗯,也许我误解了这个问题。使用$notation访问命名列表元素绝对是R中的标准做法。有关涉及eigen的特定示例,请参见例如;$在R中,索引当然不是应该避免的事情。我认为您提出的更简单的代码不会产生正确的输出。如前所述,eigen返回一个包含两个对象的列表。你必须告诉R你想要列表中的哪一项,然后告诉R你想要矩阵的哪一部分。x[[2]][,1]相当于x$vectors[,1]。这两种情况都很常见。
Error in x[, 1] : incorrect number of dimensions