Как я могу генерировать двоичные временные ряды, такие что:
- Указана средняя вероятность наблюдения 1 (скажем, 5%);
- Условная вероятность наблюдения 1 в момент времени учетом значения в момент времени (скажем, 30%, если значение равно 1)?т - 1 т - 1
Как я могу генерировать двоичные временные ряды, такие что:
Используйте цепочку Маркова с двумя состояниями.
Если состояния называются 0 и 1, то цепь может быть представлена матрицей 2x2, дающей вероятности перехода между состояниями, где P i j - вероятность перехода из состояния i в состояние j . В этой матрице каждая строка должна быть равна 1,0.
Из утверждения 2 мы имеем , и тогда простое сохранение говорит P 10 = 0,7 .
Из утверждения 1 вы хотите, чтобы долгосрочная вероятность (также называемая равновесным или стационарным) была . Это говорит о P 1 = 0,05 = 0,3 P 1 + P 01 ( 1 - P 1 ). Решение дает P 01 = 0,0368421 и матрицу перехода P = ( 0,963158 0,0368421 0,7 0,3 ).
(Вы можете проверить правильность своей матрицы переходов, подняв ее до высокой мощности - в этом случае 14 делает свою работу - каждая строка результата дает идентичные вероятности устойчивого состояния)
Теперь в вашей программе случайных чисел начните со случайного выбора состояния 0 или 1; это выбирает, какую строку вы используете. Затем используйте равномерное случайное число, чтобы определить следующее состояние. Выплюните этот номер, промойте, повторите при необходимости.
Я попробовал написать код @Mike Anderson в R. Я не мог понять, как это сделать, используя sapply, поэтому я использовал цикл. Я немного изменил пробники, чтобы получить более интересный результат, и использовал «A» и «B» для представления состояний. Дайте мне знать, что вы думаете.
/ edit: В ответ на комментарий Павла, вот более элегантная формулировка
Я написал оригинальный код, когда только начинал изучать R, поэтому немного расслабился. ;-)
Вот как бы вы оценили матрицу перехода, учитывая ряд:
Порядок поменяется местами с моей исходной матрицей переходов, но он получает правильные вероятности.
источник
for
цикл будет немного чище, вы знаете длинуSeries
, так что просто используйтеfor(i in 2:length(Series))
. Это исключает необходимостьi = i + 1
. Кроме того, почему сначала образецA
, а затем преобразовать в0,1
? Вы можете непосредственно попробовать0
и1
.createAutocorBinSeries = function(n=100,mean=0.5,corr=0) { p01=corr*(1-mean)/mean createSeries(n,matrix(c(1-p01,p01,corr,1-corr),nrow=2,byrow=T)) };createAutocorBinSeries(n=100,mean=0.5,corr=0.9);createAutocorBinSeries(n=100,mean=0.5,corr=0.1);
чтобы учесть произвольную, заранее заданную автокорреляцию с задержкой 1Вот ответ, основанный на
markovchain
пакете, который можно обобщить для более сложных структур зависимости.Это дает вам:
источник
Я потерял след в статье, где описан этот подход, но здесь идет.
Разложить матрицу перехода на
Обратите внимание, что из указанных вами данных вам нужно найтипT из указанного T11 через T11= ( 1 - рT) + рT( 1 - р0) ,
Одна из полезных особенностей этого разложения состоит в том, что оно довольно просто обобщает класс коррелированных марковских моделей в задачах с большими измерениями.
источник