如何计算转移概率
How to calculate transition probabilities
对于 Python 中的面板数据分析,我想检查转换概率。我有人年组合和一些分类变量,例如健康(1=excellent
、2=good
等)。
我需要一份关于从一个 state/category 到另一个的变化发生频率的绝对 and/or 相对频率的摘要 table - 每个人,而不是每列。特别是指数6
和7
之间的健康状态差异不应该包括在内,因为它不是一个人内部的转变。
这是一些示例数据:
import pandas as pd
df = pd.DataFrame({'year': ['2003', '2004', '2005', '2006', '2007', '2008', '2009',
'2003', '2004', '2005', '2006', '2007', '2008', '2009'],
'id': ['1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '2', '2', '2', '2',],
'health': ['3', '1', '2', '2', '5', '1', '1',
'1', '2', '3', '2', '1', '1', '2']}).astype(int)
输出应如下(计算状态转换的发生次数):
(也许 Python 中有类似于 Stata 的 xttrans
命令的东西?)
使用 shift
. where
ensures we exclude it when the id
changes. Then this is crosstab
(或 groupby 大小,或 pivot_table)创建新列以获取计数。
import pandas as pd
#df = df.sort_values(['id', 'year'])
df['health_trans'] = df.health.shift(-1).where(df.id.eq(df.id.shift(-1)))
pd.crosstab(df.health, df.health_trans)
#health_trans 1.0 2.0 3.0 5.0
#health
#1 2 3 0 0
#2 1 1 1 1
#3 1 1 0 0
#5 1 0 0 0
要确保始终列出所有转换,请使用 reindex
.
health = range(1,6)
(pd.crosstab(df.health, df.health_trans)
.reindex(health).reindex(health, axis=1)
.fillna(0).astype(int))
#health_trans 1 2 3 4 5
#health
#1 2 3 0 0 0
#2 1 1 1 0 1
#3 1 1 0 0 0
#4 0 0 0 0 0
#5 1 0 0 0 0
这可能无法处理 id
缺失年份的情况。看起来你有一个平衡的面板开始,在这种情况下没有问题。
对于 Python 中的面板数据分析,我想检查转换概率。我有人年组合和一些分类变量,例如健康(1=excellent
、2=good
等)。
我需要一份关于从一个 state/category 到另一个的变化发生频率的绝对 and/or 相对频率的摘要 table - 每个人,而不是每列。特别是指数6
和7
之间的健康状态差异不应该包括在内,因为它不是一个人内部的转变。
这是一些示例数据:
import pandas as pd
df = pd.DataFrame({'year': ['2003', '2004', '2005', '2006', '2007', '2008', '2009',
'2003', '2004', '2005', '2006', '2007', '2008', '2009'],
'id': ['1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '2', '2', '2', '2',],
'health': ['3', '1', '2', '2', '5', '1', '1',
'1', '2', '3', '2', '1', '1', '2']}).astype(int)
输出应如下(计算状态转换的发生次数):
(也许 Python 中有类似于 Stata 的 xttrans
命令的东西?)
使用 shift
. where
ensures we exclude it when the id
changes. Then this is crosstab
(或 groupby 大小,或 pivot_table)创建新列以获取计数。
import pandas as pd
#df = df.sort_values(['id', 'year'])
df['health_trans'] = df.health.shift(-1).where(df.id.eq(df.id.shift(-1)))
pd.crosstab(df.health, df.health_trans)
#health_trans 1.0 2.0 3.0 5.0
#health
#1 2 3 0 0
#2 1 1 1 1
#3 1 1 0 0
#5 1 0 0 0
要确保始终列出所有转换,请使用 reindex
.
health = range(1,6)
(pd.crosstab(df.health, df.health_trans)
.reindex(health).reindex(health, axis=1)
.fillna(0).astype(int))
#health_trans 1 2 3 4 5
#health
#1 2 3 0 0 0
#2 1 1 1 0 1
#3 1 1 0 0 0
#4 0 0 0 0 0
#5 1 0 0 0 0
这可能无法处理 id
缺失年份的情况。看起来你有一个平衡的面板开始,在这种情况下没有问题。