mirosh111000

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

Oct 20th, 2025 (edited)
1,736
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.08 KB | None | 1 0
  1. import math
  2. from typing import Tuple, Dict, List
  3. from dataclasses import dataclass
  4. import numpy as np
  5.  
  6.  
  7. 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)
  8. 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)
  9.  
  10.  
  11. ALPHA_SW = 0.05  
  12.  
  13.  
  14. def ols_fit_and_residuals(x: np.ndarray, y: np.ndarray) -> Tuple[float, float, np.ndarray, np.ndarray]:
  15.  
  16.     x = np.asarray(x, float)
  17.     y = np.asarray(y, float)
  18.     x_bar = float(np.mean(x))
  19.     y_bar = float(np.mean(y))
  20.     Sxx = float(np.sum((x - x_bar) ** 2))
  21.     Sxy = float(np.sum((x - x_bar) * (y - y_bar)))
  22.     a1 = Sxy / Sxx
  23.     a0 = y_bar - a1 * x_bar
  24.     y_hat = a0 + a1 * x
  25.     u = y - y_hat
  26.     return a0, a1, y_hat, u
  27.  
  28.  
  29. def central_moments(u: np.ndarray) -> Tuple[float, float, float, float]:
  30.  
  31.     u = np.asarray(u, float)
  32.     mu = float(np.mean(u))
  33.     d = u - mu
  34.     m2 = float(np.mean(d ** 2))
  35.     m3 = float(np.mean(d ** 3))
  36.     m4 = float(np.mean(d ** 4))
  37.     return mu, m2, m3, m4
  38.  
  39.  
  40. def skewness_kurtosis(u: np.ndarray) -> Tuple[float, float]:
  41.  
  42.     _, m2, m3, m4 = central_moments(u)
  43.     if m2 <= 0:
  44.         return float('nan'), float('nan')
  45.     g1 = m3 / (m2 ** 1.5)
  46.     g2 = m4 / (m2 ** 2) - 3.0
  47.     return g1, g2
  48.  
  49.  
  50. def adjusted_moment_tests(u: np.ndarray):
  51.  
  52.     n = float(len(u))
  53.     g1, g2 = skewness_kurtosis(u)
  54.     A_hat = math.sqrt(n * (n - 1.0)) / (n - 2.0) * g1
  55.     E_hat = ((n - 1.0) / ((n - 2.0) * (n - 3.0))) * ((n + 1.0) * g2 + 6.0)
  56.     var_A = 6.0 * n * (n - 1.0) / ((n + 1.0) * (n + 3.0) * (n - 2.0))
  57.     var_E = 24.0 * n * (n - 1.0) ** 2 / ((n + 5.0) * (n + 3.0) * (n - 2.0) * (n - 3.0))
  58.     two_sA = 2.0 * math.sqrt(var_A)
  59.     two_sE = 2.0 * math.sqrt(var_E)
  60.     decision = (abs(A_hat) <= two_sA) and (abs(E_hat) <= two_sE)
  61.     return A_hat, E_hat, two_sA, two_sE, decision
  62.  
  63.  
  64. _A_COEFFS_N10 = np.array([0.5739, 0.3291, 0.2141, 0.1224, 0.0399], dtype=float)
  65. _W_CRIT_N10: Dict[float, float] = {0.10: 0.869, 0.05: 0.842, 0.02: 0.806, 0.01: 0.781}
  66.  
  67.  
  68. def shapiro_wilk_w_n10(sample: np.ndarray) -> Tuple[float, float, List[Tuple[int, float, float, float, float, float]]]:
  69.  
  70.     x = np.sort(np.asarray(sample, float))
  71.     n = x.size
  72.     if n != 10:
  73.         raise ValueError("Shapiro–Wilk (ця реалізація) підтримує лише n = 10.")
  74.     S2 = float(np.sum((x - x.mean()) ** 2))
  75.     rows: List[Tuple[int, float, float, float, float, float]] = []
  76.     b = 0.0
  77.     k = 5
  78.     for i in range(k):
  79.         left = float(x[i])
  80.         right = float(x[-(i + 1)])
  81.         diff = right - left
  82.         ai = float(_A_COEFFS_N10[i])
  83.         term = ai * diff
  84.         b += term
  85.         rows.append((i + 1, left, right, diff, ai, term))
  86.     W = (b ** 2) / S2 if S2 > 0 else float('nan')
  87.     return W, S2, rows
  88.  
  89.  
  90. def shapiro_wilk_decision_n10(sample: np.ndarray, alpha: float = ALPHA_SW) -> Tuple[float, bool, float, float, List[Tuple[int, float, float, float, float, float]]]:
  91.     if alpha not in _W_CRIT_N10:
  92.         raise ValueError(f"Для n=10 доступні α: {sorted(_W_CRIT_N10.keys())}")
  93.     W, S2, rows = shapiro_wilk_w_n10(sample)
  94.     Wcrit = _W_CRIT_N10[alpha]
  95.     return W, (W >= Wcrit), Wcrit, S2, rows
  96.  
  97.  
  98. @dataclass
  99. class NormalityResults:
  100.     a0: float
  101.     a1: float
  102.     A_hat: float
  103.     E_hat: float
  104.     two_sA: float
  105.     two_sE: float
  106.     approx_moment_ok: bool
  107.     W: float
  108.     Wcrit: float
  109.     W_ok: bool
  110.     S2: float
  111.     rows: List[Tuple[int, float, float, float, float, float]]
  112.     u: np.ndarray
  113.     u_sorted: np.ndarray
  114.     u_mean: float
  115.  
  116.  
  117. def run_full_check_and_print(x: np.ndarray, y: np.ndarray, alpha_sw: float = ALPHA_SW) -> NormalityResults:
  118.     a0, a1, y_hat, u = ols_fit_and_residuals(x, y)
  119.  
  120.     A_hat, E_hat, two_sA, two_sE, approx_ok = adjusted_moment_tests(u)
  121.  
  122.     W, sw_ok, Wcrit, S2, rows = shapiro_wilk_decision_n10(u, alpha=alpha_sw)
  123.  
  124.     u_sorted = np.sort(u)
  125.     u_mean = float(np.mean(u))
  126.  
  127.     gamma = 1.0 - alpha_sw
  128.  
  129.     print("\n=== OLS модель ===")
  130.     print(f"a0 = {a0:.6f}, a1 = {a1:.6f}")
  131.  
  132.     print("\n=== Залишки U ===")
  133.     for idx, val in enumerate(u, start=1):
  134.         print(f"u[{idx:>2}] = {val: .6f}")
  135.     print(f"Середнє ū = {u_mean:.6f}")
  136.  
  137.     print("\n=== Відсортовані залишки u_(i) (для SW) ===")
  138.     for idx, val in enumerate(u_sorted, start=1):
  139.         print(f"u_({idx:>2}) = {val: .6f}")
  140.  
  141.     print("\n=== Наближений критерій: Â*, Ê* ===")
  142.     print(f"A^* = {A_hat:.4f},  2σ_A^* = {two_sA:.4f}  =>  {'OK' if abs(A_hat) <= two_sA else 'NOT OK'}")
  143.     print(f"E^* = {E_hat:.4f},  2σ_E^* = {two_sE:.4f}  =>  {'OK' if abs(E_hat) <= two_sE else 'NOT OK'}")
  144.     concl = "не відхиляємо H0 (нормальність)" if approx_ok else "відхиляємо H0 (є відхилення від нормальності)"
  145.     print(f"Висновок (наближений критерій): {concl}")
  146.  
  147.     print("\n=== Шапіро–Вілк (n=10) — проміжні розрахунки ===")
  148.     print(f"S^2 = sum (u_(i) − ū)^2 = {S2:.6f}")
  149.     header = "  i    u_(i)        u_(n−i+1)    diff=(right−left)      a_i         a_i*diff"
  150.     print(header)
  151.     print("-" * len(header))
  152.     b = 0.0
  153.     for (i, left, right, diff, ai, term) in rows:
  154.         b += term
  155.         print(f"{i:3d}  {left: .6f}    {right: .6f}      {diff: .6f}        {ai: .4f}       {term: .6f}")
  156.     print(f"b = sum(a_i * (u_(n−i+1) − u_(i))) = {b:.6f}")
  157.     print(f"b^2 = {b*b:.6f}")
  158.  
  159.     print("\n=== Підсумок SW ===")
  160.     print(f"W = b^2 / S^2 = {W:.6f}")
  161.     print(f"Рівень довіри γ = {gamma:.2f} (α = {alpha_sw:.2f});  W_crit(γ) = {Wcrit:.3f}")
  162.     print(f"Висновок: {'не відхиляємо H0' if sw_ok else 'відхиляємо H0'}")
  163.  
  164.     return NormalityResults(
  165.         a0=a0, a1=a1,
  166.         A_hat=A_hat, E_hat=E_hat, two_sA=two_sA, two_sE=two_sE, approx_moment_ok=approx_ok,
  167.         W=W, Wcrit=Wcrit, W_ok=sw_ok, S2=S2, rows=rows,
  168.         u=u, u_sorted=u_sorted, u_mean=u_mean,
  169.     )
  170.  
  171.  
  172. if __name__ == "__main__":
  173.     _ = run_full_check_and_print(x, y, alpha_sw=ALPHA_SW)
Advertisement
Add Comment
Please, Sign In to add comment