Как рассчитать вероятности перехода - PullRequest
1 голос
/ 21 июня 2019

Для анализа панели данных в Python я хотел бы проверить вероятности перехода. У меня есть комбинации человеко-год и некоторые категориальные переменные, например, здоровье (1=excellent, 2=good и т. Д.).

Мне нужна сводная таблица абсолютных и / или относительных частот о том, как часто происходят изменения от одного состояния / категории к другому - на человека, а не на столбец. Особенно не следует учитывать разницу в состоянии здоровья между индексами 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)

Вывод должен быть следующим (с учетом случаев перехода состояний):

enter image description here

(Возможно, в Python есть что-то похожее на команду xttrans Stata?)

1 Ответ

4 голосов
/ 21 июня 2019

Создайте новый столбец с shift.where гарантирует, что мы исключим его при изменении id.Тогда это crosstab (или размер группы, или 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 пропускается несколько лет, как вам хотелось бы.Кажется, у вас есть сбалансированная панель для начала, и в этом случае нет проблем.

...