#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
это двухлетняя матрица и т. Д. (Если верно предположение Маркова).