Как создать матрицу перехода (Маркова) в R?

#r

Вопрос:

Я читал подобные вопросы, но я не смог правильно понять код, так что, если кто-нибудь может помочь, это было бы очень хорошо.

У меня есть финансовый набор данных, похожий на этот:

 Year ID Return Quintile 1 A -0,3 1 2 A -0,2 2 3 B 1,5 5 3 C 0,1 3 4 C 0,1 3  

За каждый год у меня есть информация о многих идентификаторах инвесторов. Для некоторых удостоверений личности у меня есть данные за 20 лет, для других у меня есть данные только за 2 или 3 года. Я смог ранжировать данные по квинтилям производительности (на основе отдачи) от 1 до 5. Мне нужно сделать матрицу вероятностных переходов.
В принципе, мне нужно знать вероятность того, что идентификатор, который был в квинтиле 1, останется в квинтиле 1 в следующем году или перейдет в квинтиль 2, 3, 4 или 5. Мне также нужно сделать то же самое в течение 2 лет.
.

Должно быть что-то вроде этого (если первая и вторая таблицы, а вместо A, B, C должны быть 1, 2 , 3 и т. Д.)

Текст

Пс. Нужно ли мне балансировать фрейм данных? Т. Е. анализировать только идентификаторы, которые содержат, скажем, 10 лет последовательных данных? В противном случае идентификатор, который возвращает только два года и изменяет свой квинтиль, имеет 100% — ную вероятность изменения состояния и может повлиять на конечный результат.

Большое спасибо и извините за длинный пост.

Комментарии:

1. посмотрите на пакет msm

Ответ №1:

 dat1 lt;- read.table(text=" Year ID Return Quintile 1 A -0,3 1 2 A -0,2 2 3 B 1,5 5 3 C 0,1 3 4 C 0,1 3 ", header=TRUE)  

Вы можете использовать statetable.msm msm пакет для подсчета переходов в наборе данных, стратифицированных по идентификатору:

 msm::statetable.msm(Quintile, ID, data=dat1)   to from 1 2 3 5  1 0 1 0 0  3 0 0 1 0  

Это даст вам подсчеты, но вы могли бы использовать prop.table их для определения процентных значений строк. Это будет зависеть от того, что у вас будет несколько лет подряд по каждому предмету.

С таким небольшим объемом данных это невозможно, но для правильной оценки матрицы распределения вы можете использовать msm функцию следующим образом:

 # set allowed transitions qm lt;- matrix(1,nrow=5, ncol=5) # estimate the matrix q1 lt;- msm::msm(Quintile ~ Year , subject = ID, data=dat1, qmatrix = qm)  

Затем вы можете взять эту матрицу и рассчитать матрицу перехода для любого заданного периода времени. Но это не работает только при двух наблюдаемых переходах. Посмотрите документацию msm , чтобы понять, как это работает.

Комментарии:

1. Я мог бы удалить данные, в которых нет последовательных лет… значит, я могу просто запустить вторую часть кода, который вы предоставили? (кстати, часть кода, указывающая состояние, работает, спасибо)

2. извините, может быть, я не понял… используя msm функцию для оценки матрицы переходов, вы можете получить данные с отсутствующими состояниями. statetable функция будет считать только наблюдаемые переходы, однако она игнорирует year переменную, поэтому, если вы используете ее для аппроксимации своей матрицы за 1 год, вы делаете предположение, что каждый наблюдаемый переход происходит между соседними годами.

3. цепи Маркова сложны, я настоятельно рекомендую вам ознакомиться с msm документацией.

4. Прежде всего, спасибо вам за ваши ответы. Я удалил непоследовательные данные (так просто проще), и теперь я могу использовать state.table и prop.table для создания матрицы перехода. Но, как я понимаю, таким образом я не использую msm, и я не смогу генерировать эти матрицы для других периодов времени?

5. Если P это матрица перехода на 1 год, то P%*%P это двухлетняя матрица и т. Д. (Если верно предположение Маркова).