π¦Π‘ΡΡΠ°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ#
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ°ΡΡΡ Π½Π° ΡΡΡ ΡΠ΅ΠΌΡ.
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ΅Π½ΠΈΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΡΠ΅Π΄Π½Π΅Π΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ \(Y\).
ΠΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅:
\(\mu = EY\) - ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΡΠ΅Π΄Π½Π΅Π΅
\(\sigma^2\) - ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠΎΠ½Π½Π°Ρ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ
\(\mu_k, \sigma^2_k\) - ΡΡΠ΅Π΄Π½Π΅Π΅ ΠΈ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΠΌΠ΅ΡΡΠΈΠΊΠΈΠΊ Π΄Π»Ρ \(k\)-ΠΎΠΉ ΡΡΡΠ°ΡΡ
\(n_k\) - ΡΠΈΡΠ»ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈΠ· \(k\)-ΠΎΠΉ ΡΡΡΠ°ΡΡ
\(n = \sum_{k=1}^K n_k\) - ΠΎΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π³ΡΡΠΏΠΏΡ
\(w_k\) - Π΄ΠΎΠ»Ρ \(k\)-ΠΎΠΉ ΡΡΡΠ°ΡΡ Π² ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠΈ
\(Y_{1, 1}, Y_{1, 2}, ..., Y_{1, n_1}, ..., Y_{k, 1}, ..., Y_{k, n_k}\) - Π²ΡΠ±ΠΎΡΠΊΠ° ΠΈΠ· Π³Π΅Π½Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΠΈ, Π³Π΄Π΅ \(Y_{k, j}\) - ΠΌΠ΅ΡΡΠΈΠΊΠ° \(j\)-Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ \(k\)-ΠΎΠΉ ΡΡΡΠ°ΡΡ.
Π’ΠΎΡΠ΅ΡΠ½ΡΠ΅ ΠΎΡΠ΅Π½ΠΊΠΈ: ΠΠ»Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π΄Π²Π΅ Π½Π΅ΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΡΠΎΡΠ΅ΡΠ½ΡΠ΅ ΠΎΡΠ΅Π½ΠΊΠΈ.
\(\overline Y = \frac{1}{n}\sum_{k=1}^K \sum_{j=1}^{n_k} Y_{k, j}\)
\(\hat{Y}_{strat} = \sum_{k=1}^K w_k \overline{Y}_k \,\,\,\,\,\overline{Y}_k= \frac{1}{n_k} \sum_{j=1}^{n_k} Y_{k, j}\)
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Π°
Π‘ΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ - ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½ΠΈΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ. ΠΠ»Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ Π΄ΠΎΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°ΡΡ, ΡΡΠΎ ΠΈ Π² Π³Π΅Π½Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΠΈ(Π½Π° ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΡ
Π΄Π°Π½Π½ΡΡ
). Π Π°Π·ΠΌΠ΅ΡΡ ΡΡΡΠ°Ρ \(n_k = nw_k\).
Π‘ΠΏΠΎΡΠΎΠ±Ρ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
Π‘Π»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΠΎ Π΄ΠΎΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΡΡΠ°Ρ. \((E_{srs}, D_{srs})\).
CΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π§Π°ΡΡΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² ΠΠ‘ \((E_{strat}, D_{strat})\).
Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΡΠΎΡΠ΅ΡΠ½ΡΡ ΠΎΡΠ΅Π½ΠΎΠΊ Π ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π²Π΅ ΠΏΡΠΈΠ²Π΄Π΅Π½Π½ΡΠ΅ ΡΠΎΡΠ΅ΡΠ½ΡΠ΅ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ:
Π‘ΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΡΠ΅Π΄Π½Π΅Π΅ ΠΈ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΡΠ΅Π΄Π½Π΅Π΅ ΡΠ²Π»ΡΡΡΡΡ Π½Π΅ΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌΠΈ ΠΎΡΠ΅Π½ΠΊΠ°ΠΌΠΈ:
ΠΠ°ΠΊΠΎΠ½ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ
ΠΠ°ΠΊΠΎΠ½ ΠΏΠΎΠ»Π½ΠΎΠΉ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ
Π³Π΄Π΅ \(E[D[X|Y]]\) - ΡΡΠ΅Π΄Π½ΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΠΏΠΎ Π³ΡΡΠΏΠΏΠ°ΠΌ, \(D[E[X|Y]]\) - Π²Π°ΡΠΈΠ°ΡΠΈΡ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΠΏΠΎ Π³ΡΡΠΏΠΏΠ°ΠΌ.
ΠΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ²Π»Π΅Π½Π° Π² Π²ΠΈΠ΄Π΅ ΡΡΠΌΠΌΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ Π²Π½ΡΡΡΠΈ ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π³ΡΡΠΏΠΏΠ°ΠΌΠΈ.
ΠΡΡΠ΅ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎΡΡΠΈΡΠ°Π΅ΠΌ Π΄ΠΈΡΠΏΡΠ΅ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
ΠΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅:
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΡΠ°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΠΏΠΎΠ½ΠΈΠ·ΠΈΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ Π½Π°
Π§Π΅ΠΌ ΡΠΈΠ»ΡΠ½Π΅Π΅ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ΅Π΄Π½ΠΈΠΌΠΈ Π² ΡΡΡΠ°ΡΠ°Ρ
, ΡΠ΅ΠΌ ΡΠΈΠ»ΡΠ½Π΅Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ.
ΠΠΎΡΡΡΡΡΠ°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ#
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΡΡΠ΅Π΄Π½Π΅Π΅ Π½Π° ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΡΠ΅Π½Π΄Π΅Π΅
ΠΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π²Π·Π²Π΅ΡΠΈΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°ΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π΄ΠΎΠ»Π΅ΠΉ Π² Π.Π‘. (\(w_k\) ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π΄Π°Π½Π½ΡΠΌ).
ΠΡΠ΅Π½ΠΈΠΌ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΠΏΡΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
\(n_k\) - Π±ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (ΡΡΠΌΠΌΠ° ΠΠ΅ΡΠ½ΡΠ»Π»ΠΈ).
ΠΠΈΡΠΏΠ΅ΡΡΠΈΡ Π±ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ:
ΠΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π’Π΅ΠΉΠ»ΠΎΡΠ° Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ \( \frac{1}{n_k} \) Π² ΡΠΎΡΠΊΠ΅ \( \frac{1}{n w_k} \):
Π’Π°ΠΊ ΠΊΠ°ΠΊ
ΡΠΎ:
ΠΠΎΠ΄ΡΡΠ°Π²ΠΈΠ² Π² (*), ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ:
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²:
\( D_{srs}[\overline Y] = \frac{1}{n^2} n \sigma^2 = \frac{1}{n} \sum_{k=1}^K w_k \sigma^2_k + \frac{1}{n}\sum_{k=1}^K w_k(\mu_k - \mu)^2 \)
\( D_{strat}[\hat Y_{strat}] = \frac{1}{n} \sum_{k=1}^K w_k \sigma^2_k \)
\( D_{srs}[\hat{Y}_{strat}] =\frac{1}{n} \sum_{k=1}^K w_k \sigma_k^2 +\frac{1}{n^2} \sum_{k=1}^K (1 - w_k) \sigma_k^2 +O\left(\frac{1}{n^2}\right) \)
\( D_{strat}[\hat Y_{strat}] \leq D_{srs}[\hat{Y}_{strat}] \leq D_{srs}[\overline Y] \)
ΠΠΎΠ΄
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
N = 1000
n_iter = 10000
data = np.zeros(2 * N)
data[:N] = 1
res = []
sample_sizes = [10, 20, 50, 100, 500]
for sample_size in sample_sizes:
list_part_second_strata = []
for _ in range(n_iter):
sample = np.random.choice(data, sample_size, False)
list_part_second_strata.append(np.mean(sample))
res.append(list_part_second_strata)
df_res = pd.DataFrame(res, index=sample_sizes).T
fig = plt.figure(figsize=[12, 8])
sns.violinplot(data=df_res, cut=1, linewidth=1)
plt.title('Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΡΡΠ°Ρ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²ΡΠ±ΠΎΡΠΊΠΈ')
plt.grid()
plt.show()
ΠΠ°Π»Π΅Π½ΡΠΊΠΈΠ΅ Π²ΡΠ±ΠΎΡΠΊΠΈ Π½Π΅ΡΡΡ Π·Π°ΠΌΠ΅ΡΠ½ΡΠΉ ΡΠΈΡΠΊ Π½Π΅ΡΠ΅ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΠΈ.
ΠΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°. Π Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ±ΠΎΡ ΡΠ΅ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠ²Π½ΡΡ Π³ΡΡΠΏΠΏ. ΠΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π°. Π’Π°ΠΊ Π΅ΡΠ»ΠΈ Π·Π½Π°ΡΠΈΠΌΡΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ, ΡΠΎ Π³ΡΡΠΏΠΏΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡΡΡ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ°Π»ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈ ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°ΡΡ ΡΠ΅ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠ²Π½ΡΠ΅ Π²ΡΠ±ΠΎΡΠΊΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΡΡΠΆΠ΅Π»ΠΎ. ΠΠΎ ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ°ΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΄Π»Ρ ΠΌΠ°Π»ΡΡ Π³ΡΡΠΏΠΏ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: Π½Π΅ΡΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΡΡΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ° Π² ΠΏΠΈΠ»ΠΎΡΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ Π³ΡΡΠΏΠΏΠ°Ρ .
ΠΡΠ»ΠΈ ΠΌΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΏΠΈΠ»ΠΎΡΠ½ΡΡ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ Π³ΡΡΠΏΠΏΡ, ΡΠΎ ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠ°Π½ΠΎ \(N\) ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΎΠ±Π»Π°Π΄Π°ΡΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠΌ, ΡΠΈΡΠ»ΠΎ ΡΠ°ΠΊΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΏΠΈΠ»ΠΎΡΠ½ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΡΡΡΡ Π±ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ.
ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΈΡΠ°ΡΡ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠΎΡΠΎΠ²: ΠΎΡΠ»ΠΈΡΠΈΡ Π² ΠΏΠΈΠ»ΠΎΡΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ Π³ΡΡΠΏΠΏΠ°Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π² \(K\) ΡΠ°Π·. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ scipy.stats.binom:
scipy.stats.binom(*args, **kwds)
N = np.arange(10, 1000)
plt.title('ΠΠ΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠΎΡΠΎΠ²')
for K in [1.25, 1.5, 2, 3]:
prob = 2 * stats.binom.cdf(N / (1 + K), N, 0.5)
plt.plot(N, prob, label=f'K = {K}')
plt.xscale('log')
plt.legend()
plt.grid()
ΠΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²ΡΠ±ΠΎΡΠΊΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²ΡΠ±ΠΎΡΠΊΠ° Π±ΡΠ΄Π΅Ρ Π½Π΅ΡΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ.
ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ΅ Π³ΡΡΠΏΠΏΡ \(N=100\) Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΈΠ»ΠΎΡΠ½ΡΡ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ Π³ΡΡΠΏΠΏΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΠΈΠΌΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π½Π° 25% ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ \(p=0.3\). Π‘ ΡΡΠ΅ΡΠΎΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π·Π½Π°ΡΠΈΠΌΡΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΌΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΌΠ°Π»ΡΠΌΠΈ Π³ΡΡΠΏΠΏΠ°ΠΌΠΈ. ΠΠΎΡΡΠΎΠΌΡ Π½Π°Π΄ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠΎΡΡ Π²Π»ΠΈΡΡΡ. Π ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΡΡΠ°ΡΠΈΡ ΡΠ»ΡΡΡΠΈΡΡ.
2. ΠΠΈΡΠΏΠ΅ΡΡΠΈΡ ΠΏΡΠΈ ΡΡΡΠ°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ#
Π‘ΡΠ°Π²Π½ΠΈΠΌ ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΠΏΡΠΈ ΡΡΡΠ°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ .
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΊ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
Π‘Π»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ· Π²ΡΠ΅Π³ΠΎ Π΄Π°ΡΠ°ΡΠ΅ΡΠ° (ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΡΡΡΠ°ΡΠ°ΠΌ) ΠΌΡ Π±Π΅ΡΠ΅ΠΌ Π±Π΅Π· Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΡΠ΅ΠΌΠΏΠ» Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. ΠΠ»Ρ ΡΠ°ΠΊΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ ΡΡΠ΅Π΄Π½Π΅Π΅.
Π‘ΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°ΡΡ ΠΌΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠΈΡΠ»ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΡΠΎΠΉ ΡΡΡΠ°ΡΡ Π² Π³Π΅Π½Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΠΈ. ΠΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π²ΡΠ±ΠΎΡΠΊΠΈ Π² ΠΈΡΠΎΠ³ΠΎΠ²ΡΡ ΠΈ Π΄Π»Ρ Π½Π΅Ρ ΡΡΠΈΡΠ°Π΅ΠΌ ΡΡΠ΅Π΄Π½Π΅Π΅.
ΠΠΎΡΡΡΡΡΠ°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ. ΠΡΠ»ΠΈ Π²ΡΠ±ΠΎΡΠΊΠ° ΡΠΆΠ΅ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Π°, ΡΠΎ ΡΡΠΈΡΠ°Π΅ΠΌ ΡΡΠ΅Π΄Π½Π΅Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ°ΡΡ ΠΈ Π±Π΅ΡΠ΅ΠΌ ΠΈΡ Π²Π·Π²Π΅ΡΠ΅Π½Π½ΡΡ ΡΡΠΌΠΌΡ Ρ Π²Π΅ΡΠ°ΠΌΠΈ ΡΡΡΠ°Ρ ΠΈΠ· Π³Π΅Π½Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΠΈ.
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠ΅Ρ ΡΠ»ΡΡΠ°Π΅Π² ΠΎΡΠ΅Π½ΠΈΠΌ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ.
def get_sample_mean(data, size):
return np.random.choice(data, size, False).mean()
def calc_srs_stats(
strata: list,
sample_size=100, n_iter=1000
):
"""Π‘ΡΠΈΡΠ°Π΅ΠΌ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΠΏΡΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
strata - ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠ°Ρ
sample_size - ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠΌΠΏΠ»ΠΈΡΡΠ΅ΠΌΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ
n_iter - ΠΊΠΎΠ»-Π²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
return: ΡΡΠ΅Π΄Π½Π΅Π΅ ΡΡΠ΅Π΄Π½ΠΈΡ
, Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΡΠ΅Π΄Π½ΠΈΡ
"""
data = np.concatenate(strata)
means = [get_sample_mean(data, sample_size) for _ in range(n_iter)]
return np.mean(means), np.var(means)
def calc_strat_stats(
strata: list,
sample_size=100, n_iter=1000,
is_stratified=True
):
"""Π‘ΡΠΈΡΠ°Π΅ΠΌ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
strata - ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠ°Ρ
sample_size - ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠΌΠΏΠ»ΠΈΡΡΠ΅ΠΌΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ
n_iter - ΠΊΠΎΠ»-Π²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
is_stritified - ΡΠ»Π°Π³ ΡΡΡΠ°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ (ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΈ ΡΡΡΠ°Ρ)
return: ΡΡΠ΅Π΄Π½Π΅Π΅ ΡΡΠ΅Π΄Π½ΠΈΡ
, Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΡΠ΅Π΄Π½ΠΈΡ
"""
strata_sizes = [len(stratum) for stratum in strata]
full_size = np.sum(strata_sizes)
weights = np.array(strata_sizes) / full_size
sample_sizes = np.zeros(shape=len(strata))
if is_stratified:
sample_sizes = (weights * sample_size + 0.5).astype(int)
else:
while (np.array(sample_sizes)).min() == 0:
sample_sizes = np.random.default_rng().multinomial(sample_size, weights)
assert sample_sizes.min() != 0
means = []
for _ in range(n_iter):
strata_means = [get_sample_mean(stratum, size) for stratum, size in zip(strata, sample_sizes)]
means.append((weights * np.array(strata_means)).sum())
return np.mean(means), np.var(means)
def calc_srs_strat_stats(
strata: list,
sample_size=100, n_iter=1000
):
"""Π‘ΡΠΈΡΠ°Π΅ΠΌ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΡΡΡΠ°ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
strata - ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠ°Ρ
strata_second - ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΠΎΡΠΎΠΉ ΡΡΡΠ°ΡΡ
sample_size - ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠΌΠΏΠ»ΠΈΡΡΠ΅ΠΌΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ
n_iter - ΠΊΠΎΠ»-Π²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
return: ΡΡΠ΅Π΄Π½Π΅Π΅ ΡΡΠ΅Π΄Π½ΠΈΡ
, Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΡΠ΅Π΄Π½ΠΈΡ
"""
return calc_strat_stats(strata, sample_size=sample_size, n_iter=n_iter, is_stratified=False)
ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π²ΡΠ΅ Π²ΠΈΠ΄Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ.
def run_calc_vars(
strata: list,
sample_size=100, n_iter=1000,
show=False
):
"""CΡΠΈΡΠ°Π΅Ρ ΡΡΠ΅Π΄Π½ΠΈΠ΅ ΠΈ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ ΡΡΠ΅Π΄Π½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΏΠΎΡΡΠΈΡΠ°Π½Π½ΡΡ
ΠΏΡΠΈ
ΡΡΠΌΠΏΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ.
"""
function_dict = {
'strat': calc_strat_stats,
'srs_strat': calc_srs_strat_stats,
'srs': calc_srs_stats
}
res_dict = {}
for function_name, function in function_dict.items():
mean_, var_ = function(strata, sample_size, n_iter)
res_dict[f'mean {function_name}'] = mean_
res_dict[f'var {function_name}'] = var_
if show:
print(f'{function_name:<10} mean {mean_:0.4f}, var {var_:0.4f}')
return res_dict
ΠΡΠΎΠ²Π΅Π΄Π΅ΠΌ ΡΠ΅ΡΠΈΡ ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ²#
ΠΡΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ Π² ΡΡΡΠ°ΡΠ°Ρ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ. Π Π°Π·Π½ΠΈΡΠ° ΡΡΠ΅Π΄Π½ΠΈΡ ΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ Π² Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡΡ .
np.random.seed(45)
data_for_experiments = [
{
'experiment_title': 'Same mean, same variance',
'strata': [
np.random.normal(0, 1, 100),
np.random.normal(0, 1, 100),
]
},
{
'experiment_title': 'Same mean, different variance',
'strata': [
np.random.normal(0, 1, 100),
np.random.normal(0, 2, 100),
]
},
{
'experiment_title': 'Different mean, same variance',
'strata': [
np.random.normal(0, 1, 100),
np.random.normal(2, 1, 100),
]
},
{
'experiment_title': 'Different mean, different variance',
'strata': [
np.random.normal(0, 1, 100),
np.random.normal(40, 2, 100),
]
},
]
sample_size = 100
n_iter = 10000
for data in data_for_experiments:
print(f'\n Experiment: {data["experiment_title"]}')
_ = run_calc_vars(data['strata'], sample_size, n_iter, show=True)
Experiment: Same mean, same variance
strat mean -0.0316, var 0.0046
srs_strat mean -0.0323, var 0.0048
srs mean -0.0309, var 0.0048
Experiment: Same mean, different variance
strat mean -0.0575, var 0.0117
srs_strat mean -0.0559, var 0.0116
srs mean -0.0570, var 0.0123
Experiment: Different mean, same variance
strat mean 0.9366, var 0.0046
srs_strat mean 0.9375, var 0.0049
srs mean 0.9364, var 0.0103
Experiment: Different mean, different variance
strat mean 19.9789, var 0.0139
srs_strat mean 19.9783, var 0.0128
srs mean 19.9867, var 2.0294
ΠΠ°ΠΊ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π»ΠΎΡΡ, ΡΠ°Π·Π»ΠΈΡΠΈΡ Π² Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ Ρ Π½Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠ°Π·Π½ΠΈΡΠ΅ΠΉ Π² ΡΡΠ΅Π΄Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ°ΡΠ°ΠΌΠΈ.
ΠΠΎΡΡΡΠΎΠΈΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ ΠΎΡΠ΅Π½ΠΎΠΊ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²ΡΠ±ΠΎΡΠΊΠΈ#
def plot_mean_var(df):
"""Π ΠΈΡΡΠ΅Ρ Π³ΡΠ°ΡΠΈΠΊΠΈ ΡΡΠ΅Π΄Π½ΠΈΡ
ΠΈ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΉ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ Π² ΡΡΠΎΠ»Π±ΡΠ°Ρ
Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌΠ°."""
columns = df.columns
columns_var = [c for c in columns if 'var' in c]
columns_mean = [c for c in columns if 'mean' in c]
fig = plt.figure(figsize=[16, 6])
ax_one = plt.subplot(121)
df[columns_var].plot(ax=ax_one)
ax_one.set_title('var')
plt.grid()
ax_two = plt.subplot(122)
df[columns_mean].plot(ax=ax_two)
ax_two.set_title('mean')
ax_two.set_ylim([-0.1, df[columns_mean].values.max() * 1.1])
plt.grid()
np.random.seed(45)
data_first = np.random.normal(0, 1, 100)
data_second = np.random.normal(2, 1, 100)
sample_sizes = np.arange(5, 100, 5)
n_iter = 10000
res = []
for sample_size in sample_sizes:
res.append(run_calc_vars([data_first, data_second], sample_size, n_iter, show=False))
df = pd.DataFrame(res, index=sample_sizes)
plot_mean_var(df)
Π§ΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ ΡΠΎΠ³Π»Π°ΡΡΠ΅ΡΡΡ Ρ ΡΠ΅ΠΎΡΠΈΠ΅ΠΉ. ΠΠΈΡΠΏΠ΅ΡΡΠΈΡ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ ΡΠ°ΠΊ $\(var_{srs} \geq var_{srs\_strat} \geq var_{strat}\)$
ΠΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²ΡΠ±ΠΎΡΠΊΠΈ \(var_{srs\_strat} \approx var_{strat}\).
ΠΠΎΡΡΡΠΎΠΈΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΉ ΠΎΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΎΡΠ»ΠΈΡΠΈΡ ΡΡΠ΅Π΄Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ°ΡΠ°ΠΌΠΈ#
np.random.seed(45)
sample_size = 40
n_iter = 1000
mean_deltas = np.linspace(0, 5, 51)
data_first = np.random.normal(0, 1, 100)
data_second = np.random.normal(0, 1, 100)
res = []
for mean_delta in mean_deltas:
res.append(run_calc_vars([data_first, data_second + mean_delta], sample_size, n_iter, show=False))
df = pd.DataFrame(res, index=mean_deltas)
plot_mean_var(df)
ΠΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠΈ ΠΎΡΠ»ΠΈΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ°ΡΠ°ΠΌΠΈ Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΠΈ strat ΠΈ srs_strat ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ, Π° Π΄ΠΈΡΠΏΠ΅ΡΡΠΈΡ srs ΡΠ°ΡΡΡΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΡΠ΅Π½ΠΈΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ 1 ΠΈ 2 ΡΠΎΠ΄Π°#
def get_confidence_interval(mu, se):
quant = stats.norm.ppf(0.975)
return mu - quant * se, mu + quant * se
def dot_in_interval(lb, rb, dot=0):
return lb <= dot <= rb
size = 1000
std = 100
mu = 100
weight = 0.5 # size are equal
first_type_errors_srs = []
first_type_errors_strat = []
for _ in range(10**4):
strata_first = np.random.normal(-mu, std, size)
strata_second = np.random.normal(mu, std, size)
all_data = np.concatenate((strata_first, strata_second))
mean = np.mean(all_data)
var_srs = np.var(all_data) / len(all_data)
std_srs = var_srs ** 0.5
var_strat = (
weight * np.var(strata_first) +
(1 - weight) * np.var(strata_second)
) / len(all_data)
std_strat = var_strat ** 0.5
ci_srs = get_confidence_interval(mean, std_srs)
ci_strat = get_confidence_interval(mean, std_strat)
first_type_errors_srs.append(~dot_in_interval(*ci_srs, 0))
first_type_errors_strat.append(~dot_in_interval(*ci_strat, 0))
print(np.mean(first_type_errors_srs))
print(np.mean(first_type_errors_strat))
0.0038
0.0469