mirosh111000

Прикладна_економетрика_ЛР№5_Мірошниченко

Oct 29th, 2025
350
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.57 KB | None | 0 0
  1. import math
  2. import numpy as np
  3.  
  4.  
  5. x = np.array([0.3, 0.6, 1.1, 0.2, 0.8, 1.6, 1.5, 0.9, 0.9, 0.8], dtype=float)
  6. y = np.array([2.8, 4.3, 6.3, 2.9, 5.3, 8.3, 8.0, 5.7, 5.4, 5.2], dtype=float)
  7.  
  8.  
  9. n = x.size
  10. X = np.column_stack([np.ones(n), x])
  11. beta = np.linalg.inv(X.T @ X) @ (X.T @ y)
  12. y_hat = X @ beta
  13. u = y - y_hat
  14.  
  15.  
  16. den = float(np.sum(u ** 2))
  17. dw = float(np.sum(np.diff(u) ** 2) / den) if den > 0 else float("nan")
  18.  
  19.  
  20. def lag1_corr(u_vec: np.ndarray) -> float:
  21.     u_vec = np.asarray(u_vec).ravel()
  22.     if u_vec.size < 2:
  23.         return float("nan")
  24.     a = u_vec[1:]    
  25.     b = u_vec[:-1]        
  26.     da = a - np.mean(a)
  27.     db = b - np.mean(b)
  28.     num = float(np.sum(da * db))
  29.     den = math.sqrt(float(np.sum(da * da)) * float(np.sum(db * db)))
  30.     return num / den if den > 0 else float("nan")
  31.  
  32. r1 = lag1_corr(u)
  33.  
  34.  
  35. d_L, d_U = 0.88, 1.32
  36.  
  37.  
  38. def dw_status_label(d: float) -> str:
  39.     if np.isnan(d):
  40.         return "error"
  41.     if d < d_L:
  42.         return "reject_pos"  
  43.     if d_U < d < (4 - d_U):
  44.         return "accept"    
  45.     if (4 - d_L) < d < 4:
  46.         return "reject_neg"  
  47.     if (d_L <= d <= d_U) or ((4 - d_U) <= d <= (4 - d_L)):
  48.         return "inconclusive"
  49.     return "unknown"
  50.  
  51. dw_stat = dw_status_label(dw)
  52.  
  53. if dw_stat == "reject_pos":
  54.     dw_verdict = "Відхиляємо H0: позитивна автокореляція (ρ>0)."
  55. elif dw_stat == "accept":
  56.     dw_verdict = "H0 не відхиляємо: автокореляції не виявлено."
  57. elif dw_stat == "reject_neg":
  58.     dw_verdict = "Відхиляємо H0: негативна автокореляція (ρ<0)."
  59. elif dw_stat == "inconclusive":
  60.     dw_verdict = "Сіра зона DW: остаточного рішення за DW немає; див. тест Бреуша–Годфрі."
  61. elif dw_stat == "error":
  62.     dw_verdict = "DW не обчислено (перевірте дані)."
  63. else:
  64.     dw_verdict = "Невідома ситуація для DW."
  65.  
  66.  
  67. u_lag = u[:-1]
  68. u_cur = u[1:]
  69. rho_hat = float(np.sum(u_lag * u_cur) / np.sum(u_lag ** 2))
  70. eps = u_cur - rho_hat * u_lag
  71. df = n - 2
  72. SSE = float(np.sum(eps ** 2))
  73. S_eps2 = SSE / df
  74. S_rho = math.sqrt(S_eps2 / np.sum(u_lag ** 2))
  75. t_stat = rho_hat / S_rho if S_rho > 0 else float("inf")
  76.  
  77.  
  78. t_crit = 2.306
  79. bg_accept = (abs(t_stat) <= t_crit)
  80. bg_verdict = ("H0 не відхиляємо: автокореляції не виявлено."
  81.               if bg_accept else
  82.               "Відхиляємо H0: автокореляція є.")
  83.  
  84.  
  85. if dw_stat == "inconclusive":
  86.     final_concl = ("Остаточний висновок за Бреуша–Годфрі: "
  87.                    f"{'автокореляції не виявлено' if bg_accept else 'виявлено автокореляцію'} "
  88.                    f"(ρ̂ = {rho_hat:.6f}).")
  89. elif dw_stat == "accept" and bg_accept:
  90.     final_concl = "Автокореляції залишків не виявлено (обидва тести не відхилили H0)."
  91. elif (dw_stat in ("reject_pos", "reject_neg")) and (not bg_accept):
  92.     direction = "позитивну" if rho_hat > 0 else "негативну"
  93.     final_concl = f"Виявлено {direction} автокореляцію AR(1) (обидва тести вказують на відхилення H0; ρ̂ = {rho_hat:.6f})."
  94. elif (dw_stat in ("reject_pos", "reject_neg")) and bg_accept:
  95.     direction_dw = "позитивну" if dw_stat == "reject_pos" else "негативну"
  96.     final_concl = (f"Тести суперечливі: DW вказує на {direction_dw} автокореляцію, "
  97.                    f"але Бреуша–Годфрі її не підтвердив (ρ̂ = {rho_hat:.6f}). "
  98.                    f"Приймається обережний висновок за BG: на рівні α=0.05 "
  99.                    f"автокореляцію не підтверджено.")
  100. elif dw_stat == "accept" and (not bg_accept):
  101.     direction = "позитивну" if rho_hat > 0 else "негативну"
  102.     final_concl = (f"Тести суперечливі: DW не виявив автокореляцію, "
  103.                    f"але Бреуша–Годфрі відхилив H0. Вважається, що є {direction} автокореляція "
  104.                    f"(α=0.05; ρ̂ = {rho_hat:.6f}).")
  105. else:
  106.     final_concl = "Неможливо сформувати однозначний висновок — перевірте дані та критичні значення."
  107.  
  108.  
  109. print("=== Перевірка передумови 3: відсутність автокореляції залишків ===")
  110. print(f"n = {n}, модель: з константою (m = 2)")
  111. print()
  112. print("--- МНК-оцінки ---")
  113. print(f"β̂0 = {beta[0]:.6f}, β̂1 = {beta[1]:.6f}")
  114. print(f"Модель: ŷ = {beta[0]:.6f} + {beta[1]:.6f}·x")
  115. print()
  116. print("--- Тест Дарбіна–Уотсона ---")
  117. print(f"d = {dw:.6f}")
  118. print(f"Довідково: r(1) (ручний розрах.) ≈ {r1:.6f}, d ≈ 2(1 - r(1)) ≈ {2*(1-r1):.6f}")
  119. print(f"Критичні межі (α=0.05, n=10, m=2): d_L = {d_L}, d_U = {d_U}, "
  120.       f"інтервал прийняття H0: ({d_U:.2f}, {4-d_U:.2f})")
  121. print(f"Вердикт DW: {dw_verdict}")
  122. print()
  123. print("--- Тест Бреуша–Годфрі (AR(1)) ---")
  124. print(f"rho_hat = {rho_hat:.6f}")
  125. print(f"t = {t_stat:.6f}, df = {df}, t_crit(α/2) ≈ {t_crit:.3f}")
  126. print(f"Вердикт BG(AR1): {bg_verdict}")
  127. print()
  128. print("--- Підсумковий висновок ---")
  129. print(final_concl)
  130.  
Advertisement
Add Comment
Please, Sign In to add comment