allekco

matstat lab1

Nov 11th, 2019
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.59 KB | None | 0 0
  1. Лабораторная №1. Проверка статистических гипотез
  2. Вариант № 1
  3.  
  4. Распределения:
  5.  
  6. 𝑋1  ~ N(1, 2) (объём выборки  𝑛1  = 100)
  7.  
  8. 𝑋2  ~ R(-1, 1) (объём выборки  𝑛2  = 100)
  9.  
  10. %matplotlib inline
  11. import numpy as np
  12. from scipy import stats
  13. import matplotlib.pyplot as plt
  14. Генерация выборок
  15. x = np.random.<distribution>(...params,size), где
  16.  
  17. distribution - распределение;
  18. ...params - параметры распределения;
  19. size - размер выборки
  20. Доступные распределения:
  21.  
  22. нормальное: normal(m, 𝜎2)
  23. равномерное: uniform(a, b)
  24. хи-квадрат: chisquare(k)
  25. # Размеры выборок
  26. n1 = 100
  27. n2 = 100
  28. ​
  29. # Функции для получения выборок
  30. def gen_x1():
  31.     return np.random.normal(1, 2, n1)
  32. ​
  33. def gen_x2():
  34.     return np.random.uniform(-1, 1, n2)
  35. ​
  36. # Конкретные выборки
  37. x1, x2 = gen_x1(), gen_x2()
  38. 1. Выборочные характеристики
  39. Необходимо:
  40.  
  41. Описать распределения 𝑋1 и 𝑋2, найти их МО и дисперсию, указать объём выборок
  42.  
  43. Рассчитать выборочные характеристики: среднее, 𝑠, 𝑠2
  44. Рассчитать выборочные характеристики для совокупной выборки 𝑥1 + 𝑥2
  45. def print_sample_chars(sample):
  46.     print("Среднее {}, s={}, s^2={}".format(
  47.         np.mean(sample),
  48.         np.std(sample),
  49.         np.var(sample)
  50.     ))
  51. ​
  52. print_sample_chars(x1)
  53. print_sample_chars(x2)
  54. pooled = np.concatenate([x1, x2])
  55. print_sample_chars(pooled)
  56. Среднее 0.8911644727059012, s=2.011210059192242, s^2=4.044965902196061
  57. Среднее -0.01004487405239921, s=0.5546407669037442, s^2=0.30762638031157347
  58. Среднее 0.440559799326751, s=1.5425111710859496, s^2=2.379340712924948
  59. Указания:
  60.  
  61. np.mean - среднее значение
  62. np.std - 𝑠 - оценка с.к.о.
  63. np.var - 𝑠2 - оценка дисперсии
  64. 2. Однопараметрические критерии
  65. Необходимо:
  66.  
  67. Для СВ 𝑋1 сформулировать гипотезы 𝐻0, проверяемые следующими тестами:
  68.  
  69. z-test
  70. t-test
  71. 𝜒2−𝑡𝑒𝑠𝑡 (𝑚 известно)
  72. 𝜒2−𝑡𝑒𝑠𝑡 (𝑚 неизвестно)
  73. Для каждой гипотезы рассчитать выборочное значение статистики критерия, p-value, выбрать уровень значимости 𝛼 и рассчитать ошибку статистического решения.
  74.  
  75. def criterion_z_test(sample):
  76.     m0 = 1
  77.     sigma = 2
  78.     mean = np.mean(sample)
  79.     n = len(sample)
  80.     return (mean - m0) / sigma * np.sqrt(n)
  81. ​
  82. def criterion_chi2_m(sample):
  83.     m0 = 1
  84.     sigma = 2
  85.     n = len(sample)
  86.     sum = 0
  87.     for i in range(n1):
  88.         sum = (sample[i] - m0)**2 + sum
  89.     S0_2 = sum/n
  90.     return n*S0_2/(sigma**2)
  91.    
  92. ​
  93. def criterion_chi2_no_m(sample):
  94.     m = np.mean(sample)
  95.     sigma = 2
  96.     n = len(sample)
  97.     sum = 0
  98.     for i in range(n):
  99.         sum = (sample[i] - m)**2 + sum
  100.     S_2 = sum/(n-1)
  101.     return (n-1)*S_2/(sigma**2)
  102. ​
  103. def criterion_t_test(sample):
  104.     n = len(sample)
  105.     s = np.std(sample) # s - оценка с.к.о.
  106.     mean = np.mean(sample) # выборочное среднее
  107.     m0 = 1 # основная гипотеза: МО генеральной совокупности для x2 составляет m0
  108.     return (mean - m0) / s * np.sqrt(n)
  109. ​
  110. z_test_dist = stats.norm
  111. t_test_dist = stats.t
  112. chi2_test_dist = stats.chi2
  113. chi2_test_f_dist = stats.f
  114. ​
  115. t-test
  116.  
  117. criterion_value = criterion_t_test(x1) # значение статистики критерия для гипотезы H0: m = m0, сигма неизвестна
  118. ​
  119. alpha = 0.05 # задаёмся уровнем значимости
  120. student_quantile = t_test_dist.ppf(1 - alpha / 2, n1 - 1) # рассчитываем квантиль распределения Стьюдента
  121. ​
  122. critical_value = student_quantile # критическое значение статистики критерия
  123. ​
  124. print("Значение критерия t-test: {}, критическое значение: {}".format(abs(criterion_value), critical_value))
  125. ​
  126. is_h0_true = abs(criterion_value) < critical_value
  127. ​
  128. print("Гипотеза H0 принимается" if is_h0_true else "Гипотеза H0 отклоняется")
  129. Значение критерия t-test: 0.5411445055013807, критическое значение: 1.9842169515086827
  130. Гипотеза H0 принимается
  131. def left_p_value(dist, criterion_value, sample_size):
  132.     return dist.cdf(criterion_value, sample_size - 1)
  133. ​
  134. def right_p_value(dist, criterion_value, sample_size):
  135.     return 1 - dist.cdf(criterion_value, sample_size - 1)
  136. ​
  137. def two_sided_p_value(dist, criterion_value, sample_size):
  138.     left_p = left_p_value(dist, criterion_value, sample_size)
  139.     return 2 * min(left_p, 1 - left_p)
  140. ​
  141. print("Двустороннее p-value: {}".format( two_sided_p_value(t_test_dist, criterion_value, n1) ))
  142. Двустороннее p-value: 0.5896236155621466
  143. z-test
  144.  
  145. criterion_value = criterion_z_test(x1)
  146. critical_value = z_test_dist.ppf(1 - alpha / 2, 0, 1)
  147. ​
  148. print("Значение критерия z-test: {}, критическое значение: {}".format(abs(criterion_value), critical_value))
  149. ​
  150. is_h0_true = abs(criterion_value) < critical_value
  151. ​
  152. print("Гипотеза H0 принимается" if is_h0_true else "Гипотеза H0 отклоняется")
  153. Значение критерия z-test: 0.5441776364704942, критическое значение: 1.959963984540054
  154. Гипотеза H0 принимается
  155. def left_p_value(dist, criterion_value, m, sigma):
  156.     return dist.cdf(criterion_value, m, sigma)
  157. ​
  158. def right_p_value(dist, criterion_value, m, sigma):
  159.     return 1 - dist.cdf(criterion_value, m, sigma)
  160. ​
  161. def two_sided_p_value(dist, criterion_value, m, sigma):
  162.     left_p = left_p_value(dist, criterion_value, m, sigma)
  163.     return 2 * min(left_p, 1 - left_p)
  164. ​
  165. print("Двустороннее p-value: {}".format( two_sided_p_value(z_test_dist, criterion_value, 0, 1) ))
  166. Двустороннее p-value: 0.5863192395510193
  167. 𝜒2−𝑡𝑒𝑠𝑡 (𝑚 известно)
  168.  
  169. criterion_value = criterion_chi2_m(x1)
  170. alpha = 0.05
  171. critical_value1 = chi2_test_dist.ppf(alpha/2, n1)
  172. critical_value2 = chi2_test_dist.ppf(1 - alpha/2, n1)
  173. critical_value = student_quantile
  174. ​
  175. print("Значение критерия chi2-test: {}, критическое значение: {}".format(abs(criterion_value), critical_value))
  176. ​
  177. is_h0_true = abs(criterion_value) < critical_value
  178. ​
  179. print("Гипотеза H0 принимается" if is_h0_true else "Гипотеза H0 отклоняется")
  180. Значение критерия chi2-test: 101.42027685493619, критическое значение: 1.9842169515086827
  181. Гипотеза H0 отклоняется
  182. def left_p_value(dist, criterion_value, sample_size):
  183.     return dist.cdf(criterion_value, sample_size )
  184. ​
  185. def right_p_value(dist, criterion_value, sample_size):
  186.     return 1 - dist.cdf(criterion_value, sample_size)
  187. ​
  188. def two_sided_p_value(dist, criterion_value, sample_size):
  189.     left_p = left_p_value(dist, criterion_value, sample_size)
  190.     return 2 * min(left_p, 1 - left_p)
  191. ​
  192. print("Двустороннее p-value: {}".format( two_sided_p_value(chi2_test_dist, criterion_value, n1) ))
  193. Двустороннее p-value: 0.8830809579840857
  194. 𝜒2−𝑡𝑒𝑠𝑡 (𝑚 неизвестно)
  195.  
  196. criterion_value = criterion_chi2_no_m(x1)
  197. alpha = 0.05
  198. critical_value1 = chi2_test_dist.ppf(alpha/2, n1)
  199. critical_value2 = chi2_test_dist.ppf(1 - alpha/2, n1)
  200. ​
  201. print("Значение критерия chi2 no m - test: {}, критическое значение: {}".format(abs(criterion_value), critical_value))
  202. ​
  203. is_h0_true = abs(criterion_value) < critical_value
  204. ​
  205. print("Гипотеза H0 принимается" if is_h0_true else "Гипотеза H0 отклоняется")
  206. Значение критерия chi2 no m - test: 101.1241475549015, критическое значение: 1.9842169515086827
  207. Гипотеза H0 отклоняется
  208. def left_p_value(dist, criterion_value, sample_size):
  209.     return dist.cdf(criterion_value, sample_size - 1)
  210. ​
  211. def right_p_value(dist, criterion_value, sample_size):
  212.     return 1 - dist.cdf(criterion_value, sample_size - 1)
  213. ​
  214. def two_sided_p_value(dist, criterion_value, sample_size):
  215.     left_p = left_p_value(dist, criterion_value, sample_size)
  216.     return 2 * min(left_p, 1 - left_p)
  217. ​
  218. print("Двустороннее p-value: {}".format( two_sided_p_value(chi2_test_dist, criterion_value, n1) ))
  219. Двустороннее p-value: 0.8436655076200767
  220. 3. Критерии для двух выборок
  221. Необходимо:
  222.  
  223. Выполнить задания пункта 2 для СВ 𝑋1 и 𝑋2 и следующих тестов:
  224.  
  225. 2-sample t-test
  226. 2-sample F-test (m известно)
  227. 2-sample F-test (m неизвестно)
  228. def criterion_t2_test(sample1, sample2):
  229.     s1 = np.std(sample1)
  230.     s2 = np.std(sample2)
  231.     n1 = len(sample1)
  232.     n2 = len(sample2)
  233.     S = (n1 - 1) * s1 * s1 + (n2 - 1) * s2 * s2
  234.     S /= n1 + n2 - 2
  235.    
  236.     m1 = np.mean(sample1)
  237.     m2 = np.mean(sample2)
  238.     z = (m1 - m2) / S
  239.     z /= np.sqrt(1.0 / n1 + 1.0 / n2)
  240.     return z
  241. ​
  242. def criterion_f_test_m(sample1, sample2):
  243.     S01_2 = 0
  244.     S02_2 = 0
  245.     m = 1
  246.     for i in range(len(sample1)):
  247.         S01_2 = S01_2 + (sample1[i]-m)**2
  248.     S01_2 = S01_2/len(sample1)
  249.     for i in range(len(sample2)):
  250.         S02_2 = S02_2 + (sample2[i]-m)**2
  251.     S02_2 = S02_2/len(sample2)
  252.     return S01_2/S02_2
  253. ​
  254. def criterion_f_test_no_m(sample1, sample2):
  255.     S1_2 = 0
  256.     S2_2 = 0
  257.     for i in range(len(sample1)):
  258.         S1_2 = S1_2 + (sample1[i] - np.mean(x1))**2
  259.     S1_2 = S1_2/(len(sample1) - 1)
  260.     for i in range(len(sample2)):
  261.         S2_2 = S2_2 + (sample2[i] - np.mean(x2))**2
  262.     S2_2 = S2_2/(len(sample2) - 1)
  263.     return S1_2/S2_2
  264. 2-sample t-test
  265.  
  266. criterion_value = criterion_t2_test(x1, x2)
  267. ​
  268. critical_value = t_test_dist.ppf(1 - alpha / 2, n1 + n2 - 2)
  269. ​
  270. print("Значение критерия: {}, критическое значение: {}".format(abs(criterion_value), critical_value))
  271. ​
  272. is_h0_true = abs(criterion_value) < critical_value
  273. ​
  274. print("Гипотеза H0 принимается" if is_h0_true else "Гипотеза H0 отклоняется")
  275. ​
  276. ​
  277. def left_p_value(dist, criterion_value, n1 , n2):
  278.     return dist.cdf(criterion_value, n1 + n2 - 2)
  279. ​
  280. def right_p_value(dist, criterion_value, n1 , n2):
  281.     return 1 - dist.cdf(criterion_value, n1 + n2 - 2)
  282. ​
  283. def two_sided_p_value(dist, criterion_value, n1 , n2):
  284.     left_p = left_p_value(dist, criterion_value, n1 , n2)
  285.     return 2 * min(left_p, 1 - left_p)
  286. ​
  287. print("Двустороннее p-value: {}".format( two_sided_p_value(t_test_dist, criterion_value_t2, n1, n2) ))
  288. Значение критерия: 2.9281457991023077, критическое значение: 1.9720174778338955
  289. Гипотеза H0 отклоняется
  290. Двустороннее p-value: 2.486254613298655e-07
  291. 2-sample F-test (m известно)
  292.  
  293. criterion_value = criterion_f_test_m(x1, x2)
  294. ​
  295. critical_value1 = chi2_test_f_dist.ppf(alpha/2, n1, n2)
  296. ​
  297. critical_value2 = chi2_test_f_dist.ppf(1 - alpha/2, n1, n2)
  298. ​
  299. print("Значение критерия: {}, критическое значение1: {}, критическое значение2: {}".format(criterion_value, critical_value1, critical_value2))
  300. ​
  301. is_h0_true1 = critical_value1 < criterion_value
  302. is_h0_true2 = criterion_value < critical_value2
  303. ​
  304. print("Гипотеза H0 принимается" if (is_h0_true1 and is_h0_true2) else "Гипотеза H0 отклоняется")
  305. ​
  306. def left_p_value(dist, criterion_value, n1, n2):
  307.     return dist.cdf(criterion_value, n1, n2)
  308. ​
  309. def right_p_value(dist, criterion_value, n1, n2):
  310.     return 1 - dist.cdf(criterion_value, n1, n2)
  311. ​
  312. def two_sided_p_value(dist, criterion_value, n1, n2):
  313.     left_p = left_p_value(dist, criterion_value, n1, n2)
  314.     return 2 * min(left_p, 1 - left_p)
  315. ​
  316. print("Двустороннее p-value: {}".format(two_sided_p_value(chi2_test_f_dist, criterion_value, n1, n2)))
  317. ​
  318. Значение критерия: 3.0552485688329765, критическое значение1: 0.674194729559777, критическое значение2: 1.4832509898927289
  319. Гипотеза H0 отклоняется
  320. Двустороннее p-value: 5.470469099932984e-08
  321. 2-sample F-test (m неизвестно)
  322.  
  323. criterion_value = criterion_f_test_no_m(x1, x2)
  324. ​
  325. critical_value1 = chi2_test_f_dist.ppf(alpha/2, n1, n2)
  326. ​
  327. critical_value2 = chi2_test_f_dist.ppf(1-alpha/2, n1, n2)
  328. ​
  329. print("Значение критерия: {}, критическое значение1: {}, критическое значение2: {}".format(criterion_value, critical_value1, critical_value2))
  330. ​
  331. is_h0_true1 = critical_value1 < criterion_value
  332. is_h0_true2 = criterion_value < critical_value2
  333. ​
  334. print("Гипотеза H0 принимается" if (is_h0_true1 and is_h0_true2) else "Гипотеза H0 отклоняется")
  335. ​
  336. def left_p_value(dist, criterion_value, n1, n2):
  337.     return dist.cdf(criterion_value, n1, n2)
  338. ​
  339. def right_p_value(dist, criterion_value, n1, n2):
  340.     return 1 - dist.cdf(criterion_value, n1, n2)
  341. ​
  342. def two_sided_p_value(dist, criterion_value, n1, n2):
  343.     left_p = left_p_value(dist, criterion_value, n1, n2)
  344.     return 2 * min(left_p, 1 - left_p)
  345. ​
  346. print("Двустороннее p-value: {}".format(two_sided_p_value(chi2_test_f_dist, criterion_value, n1 - 1, n2 - 1)))
  347. Значение критерия: 13.148956529993287, критическое значение1: 0.674194729559777, критическое значение2: 1.4832509898927289
  348. Гипотеза H0 отклоняется
  349. Двустороннее p-value: 2.220446049250313e-16
  350. 4. Выборочные характеристики для Z и P-value
  351. Необходимо: Вычислить для выборки мощностью 𝑁 выборочные значения для случайных величин p-value и значения статистики критерия. Гипотеза 𝐻0 задаётся вариантом лабораторной работы.
  352.  
  353. N = 500
  354. ​
  355. criteria = []
  356. p_values = []
  357. ​
  358. criterion_dist = t_test_dist
  359. ​
  360. for i in range(0, N):
  361.     sample = gen_x1()
  362.    
  363.     criterion_value = criterion_t_test(sample)
  364.     criteria.append(criterion_value)
  365.    
  366.     p_value_left = criterion_dist.cdf(criterion_value, n1 - 1)
  367.     p_value_right = 1 - p_value_left
  368.     p_value_two_sided = 2 * min(p_value_left, p_value_right)
  369.     p_values.append(p_value_two_sided)
  370. ​
  371. print("Критерий:")
  372. print("среднее = {}, s^2 = {}, s = {}".format(np.mean(criteria), np.var(criteria), np.std(criteria)))
  373. ​
  374. print("P-value:")
  375. print("среднее = {}, s^2 = {}, s = {}".format(np.mean(p_values), np.var(p_values), np.std(p_values)))
  376. Критерий:
  377. среднее = 0.03699143478992882, s^2 = 0.9962381650759466, s = 0.998117310277678
  378. P-value:
  379. среднее = 0.5016847546722268, s^2 = 0.08224295321751363, s = 0.28678032222855465
  380. Графики
  381. Графики теоретических распределений и гистограммы эспериментальных значений для статистики критерия и p-value:
  382.  
  383. fig, ax = plt.subplots()
  384. ​
  385. # histogram
  386. n, bins, patches = ax.hist(criteria, 20, density=True)
  387. ​
  388. # plot
  389. x = np.linspace(criterion_dist.ppf(0.05, n2 - 1), criterion_dist.ppf(0.95, n2 - 1), 100)
  390. ax.plot(x, criterion_dist.pdf(x, n2 - 1), 'r-', lw=5, alpha=0.6, label='Theoretical')
  391. ​
  392. ax.set_title("Статистика критерия")
  393. ax.set_ylabel("Плотность вероятности")
  394. ​
  395. fig.tight_layout()
  396. plt.show()
  397.  
  398. fig, ax = plt.subplots()
  399. ​
  400. # histogram
  401. n, bins, patches = ax.hist(p_values, 20, density=True)
  402. ​
  403. # plot
  404. x = np.linspace(stats.uniform.ppf(0.01), stats.uniform.ppf(0.99), 100)
  405. ax.plot(x, stats.uniform.pdf(x), 'r-', lw=5, alpha=0.6, label='Theoretical')
  406. ​
  407. ax.set_title("P-values")
  408. ax.set_ylabel("Плотность вероятности")
  409. ​
  410. fig.tight_layout()
  411. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment