在R中计算转移概率

3
假设我们有以下4个状态:(A,B,C,D)。
我手头的表格格式如下。
old   new 
A      B
A      A
B      C
D      B
C      D
.      .
.      .
.      .
.      .

我可以帮您进行翻译。以下是基于表格数据计算以下概率的内容:
P(new=A | old=A)
P(new=B | old=A)
P(new=C | old=A)
P(new=D | old=A)
P(new=A | old=B)
.
.
.
.
P(new=C | old=D)
P(new=D | old=D)

我可以手动完成,当每个转换发生时总结所有值并除以行数,但我想知道R中是否有内置函数来计算这些概率或者至少帮助加快计算这些概率。

任何帮助/输入将不胜感激。如果没有这样的功能,那就算了。


软件包markovchain - tchakravarty
3
在基本的 R 中,类似于 prop.table(table(old, new), margin=2) 的代码应该可以接近所需的结果。 - lmo
@lmo - 对我来说,这似乎是一个完全可以接受的答案,并且正好符合他们的要求。在我看来,你应该发布它。 - Dason
或者使用TraMineR::seqtrate包,它可以"计算一组序列之间的状态转换率,并返回一个矩阵"。 - Henk
@Imo,我用了你的提示,它非常好用。感谢你的回答。 - user98235
感谢@Dason。已发布为答案。 - lmo
1个回答

9
在基础R中,您可以在表格对象上使用prop.table
transMat <- prop.table(with(df, table(old, new)), 2)
transMat
   new
old          A          B          C          D
  A 0.26315789 0.27272727 0.18181818 0.22222222
  B 0.31578947 0.36363636 0.09090909 0.22222222
  C 0.21052632 0.27272727 0.45454545 0.33333333
  D 0.21052632 0.09090909 0.27272727 0.22222222

在这里,列的总和为1:

colSums(transMat)
A B C D 
1 1 1 1

编辑 进一步思考后,我认为使用margin=1实际上是期望的结果,因为旧值(条件变量)在行中,并且p(A|A) + p(B|A) + p(C|A) + p(D|A)应该等于1。在这种情况下,

transMat <- prop.table(with(df, table(old, new)), 1)
transMat
   new
old          A          B          C          D
  A 0.41666667 0.25000000 0.16666667 0.16666667
  B 0.46153846 0.30769231 0.07692308 0.15384615
  C 0.26666667 0.20000000 0.33333333 0.20000000
  D 0.40000000 0.10000000 0.30000000 0.20000000

你可以使用以下两种方式之一来完成工作。另外,使用 prop.table(with(df, table(new, old)), 2) 将转置。

数据

set.seed(1234)
df <- data.frame(old=sample(LETTERS[1:4], 50, replace=TRUE),
                 new=sample(LETTERS[1:4], 50, replace=TRUE))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接