omega = np.diag(((z @ alpha_rw[:, i - 1] + 1)**2).ravel()) inv_omega = inv(omega) b_omega = inv(x.T @ inv_omega @ x) @ x.T @ inv_omega @ y v_1 = inv(inv(v_0) + h[0][i - 1] * x.T @ inv_omega @ x) beta_1 = v_1 @ (inv(v_0) @ beta_0 + h[0][i - 1] * x.T @ inv_omega @ x @ b_omega) try: beta[:, [i]] = beta_1 + norm_rnd(v_1) except: beta[:, [i]] = beta_1 + norm_rnd(v_1 + 0.000000001) error_check += 1 h_1 = (1 / nu_1 * \ ((y - x @ beta[:, [i]]).T @ inv_omega @ (y - x @ beta[:, [i]]) + nu_0 * h_0 ** (- 1)) \ ) ** (- 1) h[:, [i]] = gamm_rnd_koop2(h_1, nu_1) a_can_rw = alpha_rw[:, [i - 1]] + norm_rnd(vscale_rw) log_accept_rw = min( a_post(a_can_rw, beta[:, [i]], h[0][i], y, x, z) - a_post(alpha_rw[:, [i - 1]], beta[:, [i]], h[0][i], y, x, z), 0) if log_accept_rw > math.log(np.random.uniform()): alpha_rw[:, [i]] = a_can_rw count_rw += 1 else: alpha_rw[:, [i]] = alpha_rw[:, [i - 1]] progress_bar(i, s) # ===== 4. Vyhozeni prvnich s_0 vzorku =====
[-0.0343, 0.0449, -0.0021, 0.0037], [-0.0284, -0.0021, 0.0341, -0.0015], [-0.0024, 0.0037, -0.0015, 0.2144], ]) count = 0 # Pocitadlo akceptovasnych vzorku nu_1 = nu_0 + n # 5.23 log_A = h = np.array([0.0] * s) # ===== 4. Metropolis within Gibbs ===== print("Metropolis within Gibbs ...") for i in range(1, s): # a) podminena hustota p(h|gamma,y) ~ G(h_1,nu_1) f_x = gamma[0][i-1] * \ ( gamma[1][i-1] * x[:,[1]]**gamma[3][i-1] + gamma[2][i-1] * x[:,[2]]**gamma[3][i-1] ) ** \ ( 1 / gamma[3][i-1] ) h_1 = (1 / nu_1 * ((y - f_x).T @ (y - f_x) + nu_0 / h_0))**(-1) h[i] = gamm_rnd_koop2(h_1, nu_1) # b) podminena hustota p(gamma|h,y) -> logaritmus jadrove podminene hustoty = externi funkce log_post_ces.py # Generovani kandidatu z kandidatske hustoty gamma_ast = gamma[:, [i - 1]] + norm_rnd(sigma) log_accept = min( log_post_ces(y, x, gamma_ast, h[i], gamma_0, v_0) - \ log_post_ces(y, x, gamma[:,[i-1]], h[i], gamma_0, v_0), 0 ) # Rozhodnuti o akceptaci if log_accept > log(uniform()): gamma[:, [i]] = gamma_ast count += 1 else: gamma[:, [i]] = gamma[:, [i - 1]]
omega = np.diag((lam[:, [i - 1]]**(-1)).ravel()) inv_omega = inv(omega) b_omega = inv(x.T @ inv_omega @ x) @ x.T @ inv_omega @ y v_1 = inv(inv(v_0) + h[0][i - 1] * x.T @ inv_omega @ x) beta_1 = v_1 @ (inv(v_0) @ beta_0 + h[0][i - 1] * x.T @ inv_omega @ x @ b_omega) try: beta[:, [i]] = beta_1 + norm_rnd(v_1) except: beta[:, [i]] = beta_1 + norm_rnd(v_1 + 0.000000001) error_check += 1 h_1 = (1 / nu_1 * \ ((y - x @ beta[:, [i]]).T @ inv_omega @ (y - x @ beta[:, [i]]) + nu_0 * h_0 ** (- 1)) \ ) ** (- 1) h[:, [i]] = gamm_rnd_koop2(h_1, nu_1) epsilon = y - x @ beta[:, [i]] nu_lam_1 = nu_lam_rw[:][i - 1] + 1 for j in range(n): lam_1 = nu_lam_1 / (h[0][i] * epsilon[j][0]**2 + nu_lam_1 - 1) # pdb.set_trace() # Pouziva jiny typ funkce pro generovani cisel z gamma rozdeleni nez v Matlab scriptu lam[j, i] = gamm_rnd_koop2(lam_1, nu_lam_1) # R-W M-H pro nu_lambda nu_lam_can_rw = nu_lam_rw[0][i - 1] + norm_rnd(vscale_rw) pdb.set_trace() log_accept_rw = min( nu_lambda_post(nu_lam_can_rw, nu_lam_0, lam[:, [i]]) - nu_lambda_post(nu_lam_rw[0][i - 1], nu_lam_0, lam[:, [i]]), 0)