假设我们有以下4种状态:(A,B,C,D)
我的表格格式如下
old new
A B
A A
B C
D B
C D
. .
. .
. .
. .
Run Code Online (Sandbox Code Playgroud)
我想根据表中给出的数据计算以下概率:
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)
Run Code Online (Sandbox Code Playgroud)
我可以手动方式完成,在每次转换发生时总结所有值并除以行数,但我想知道R中是否有内置函数来计算这些概率或者至少有助于加强计算那些概率.
任何帮助/输入将不胜感激.如果没有这样的功能哦,哦.
在基础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
Run Code Online (Sandbox Code Playgroud)
这里,列总和为1:
colSums(transMat)
A B C D
1 1 1 1
Run Code Online (Sandbox Code Playgroud)
编辑 在进一步反思时,我认为使用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
Run Code Online (Sandbox Code Playgroud)
将工作.或者,转置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))
Run Code Online (Sandbox Code Playgroud)