Я новичок в Python, недавно я работаю над каким-то проектом, чтобы выполнить вычисление совместного распределения марковского процесса.
Пример стохастического ядра используется в недавнем исследовании Гамильтона (2005), который исследует нелинейную статистическую модель делового цикла на основе данных по безработице в США. В рамках своих расчетов он оценивает ядро
pH := 0.971 0.029 0
0.145 0.778 0.077
0 0.508 0.492
Здесь
S = {x1, x2, x3} = {NG, MR, SR}
, гдеNG
соответствует нормальному росту,MR
— умеренному спаду, аSR
— тяжелому спаду. Например, вероятность перехода от тяжелой рецессии к легкой рецессии за один период составляет 0,508. Продолжительность периода составляет один месяц.
упражнение, основанное на вышеупомянутом марковском процессе,
Что касается ядра Гамильтона
pH
, и используя то же начальное условие ψ = (0,2, 0,2, 0,6), вычислить вероятность того, что экономика начнет рецессию и останется в ней в течение периодов 0, 1, 2 (т. е. что xt = NG fort = 0, 1, 2).
Мой сценарий похож на
import numpy as np
## In this case, X should be a matrix rather than vector
## and we compute w.r.t P rather than merely its element [i][j]
path = []
def path_prob2 (p, psi , x2): # X a sequence giving the path
prob = psi # initial distribution is an row vector
for t in range(x2.shape[1] -1): # .shape[1] grasp # of columns
prob = np.dot(prob , p) # prob[t]: marginal distribution at period t
ression = np.dot(prob, x2[:,t])
path.append(ression)
return path,prob
p = ((0.971, 0.029, 0 ),
(0.145, 0.778, 0.077),
(0 , 0.508, 0.492))
# p must to be a 2-D numpy array
p = np.array(p)
psi = (0.2, 0.2, 0.6)
psi = np.array(psi)
x2 = ((0,0,0),
(1,1,1),
(1,1,1))
x2 = np.array(x2)
path_prob2(p,psi,x2)
В процессе выполнения возникают две проблемы. Во-первых, в первом раунде цикла мне не нужно начальное распределение psi
для постумножения матрицы транзакций p
, поэтому вероятность «остаться в рецессии» должна быть 0,2 + 0,6 = 0,8, но я не знаю как написать условие if. Второе, как вы могли заметить, я использую список под названием path
для сбора вероятности «остаться в рецессии» в каждый период. И, наконец, мне нужно умножить каждый элемент в списке один за другим, мне не удается найти метод для реализации такой задачи, например path[0]*path[1]*path[2]
(насколько я знаю, np.multiply может принимать только два аргумента). Пожалуйста, дайте мне некоторые подсказки, если такой метод существует. Дополнительный вопрос: пожалуйста, дайте мне любое предложение, которое, по вашему мнению, может сделать код более эффективным. Спасибо.
psi*x2 = (0.2, 0.2, 0.6)*(0,1,1).T = 0.8
, то есть вероятность того, что вы не находитесь в состоянии NR (или, в равной степени, в состоянии рецессии) . Для остальных шагов я вычисляюpsi * P*x2
, и задача обновляет каждый период, поэтому первый подход, который приходит мне на ум, заключается в использовании оператора ·if-else· для разделения начального шага и других шагов. Но как это написать? Если мне не нужно писать if-else , есть ли альтернативный подход для достижения моей цели? - person zlqs1985   schedule 10.02.2016