【问题标题】:Calculating the transition probabilities in R计算 R 中的转移概率
【发布时间】:2016-10-19 13:45:36
【问题描述】:

假设我们有以下 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 中是否有一个内置函数可以计算这些概率或至少有帮助加快计算这些概率。

任何帮助/输入将不胜感激。如果没有这个功能,哦。

【问题讨论】:

  • prop.table(table(old, new), margin=2) 之类的东西在基础 R 中应该非常接近。
  • @lmo - 对我来说似乎是一个完全可以接受的答案,并且完全符合他们的要求。国际海事组织你应该发布那个。
  • 或包TraMineR::seqtrate,它“返回一个具有状态之间转换率的矩阵,由一组序列计算得出”
  • @Imo 我使用了你的提示,效果很好。谢谢你的回答

标签: r


【解决方案1】:

在基础 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 实际上是期望的结果,因为 old (条件变量)在行中并且因为 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))

【讨论】:

    猜你喜欢
    • 2020-09-24
    • 2019-11-04
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多