Робота з випадковими блоками: контроль дисперсії

Експериментальний дизайн у Python

James Chapman

Curriculum Manager, DataCamp

Що таке блокування

 

  • Зменшуйте дисперсію, групуючи подібні одиниці
  • Кожен блок отримує всі методи лікування
  • Зосереджуйтесь на ефектах лікування, контролюючи ефекти блока

Приклад блокової рандомізації з двома сітками з помаранчевих і білих квадратів

Експериментальний дизайн у Python

Приклад даних для блокового дизайну

athletes.head()
   Athlete_ID Initial_Fitness_Level  Muscle_Gain_kg
0         113              Beginner        3.225102
1          30              Advanced        3.976548
2         183          Intermediate        5.165449
3         200              Beginner        2.188297
4         194              Beginner        4.724162
Експериментальний дизайн у Python

Реалізація випадкового блокового дизайну

  • Використайте .groupby(), щоб перемішувати всередині блоків
blocks = athletes.groupby('Initial_Fitness_Level').apply(

lambda x: x.sample(frac=1)
)
blocks = blocks.reset_index(drop=True) blocks
     Athlete_ID Initial_Fitness_Level  Muscle_Gain_kg
0           198              Advanced           5.742
1           146              Advanced           6.248
2           157              Advanced           6.049
..          ...                   ...             ...
198         164          Intermediate           6.134
199         178          Intermediate           6.591
Експериментальний дизайн у Python

Застосовані випадкові блоки

  • numpy.random.choice() для випадкового призначення лікування в межах блоків
blocks['Treatment'] = np.random.choice(
    ['Cardio', 'Strength Training', 'Mixed'],
    size=len(blocks))

blocks.sample(n=5)
     Athlete_ID  Initial_Fitness_Level  Muscle_Gain_kg          Treatment
 87         194               Beginner           4.724             Cardio
 54           3               Advanced           3.731  Strength Training
177          80           Intermediate           6.758              Mixed
146         183           Intermediate           5.165  Strength Training          
 60         190               Advanced           3.763             Cardio
Експериментальний дизайн у Python

Візуалізація ефектів лікування в межах блоків

import seaborn as sns
sns.boxplot(x='Initial_Fitness_Level', y='Muscle_Gain_kg', hue='Treatment', data=blocks)
plt.show()

Боксплот у межах блоків

Експериментальний дизайн у Python

ANOVA в межах блоків

  • Припустімо рівень значущості $\alpha$ = 0,05
from scipy.stats import f_oneway
blocks.groupby('Initial_Fitness_Level').apply(
  lambda x: f_oneway(x[x['Treatment'] == 'Cardio']['Muscle_Gain_kg'], 
                     x[x['Treatment'] == 'Mixed']['Muscle_Gain_kg'],
                     x[x['Treatment'] == 'Strength Training']['Muscle_Gain_kg'])
)
Block
Initial_Fitness_Level
Advanced        (0.7951054385317405, 0.4555687666120679)
Beginner        (0.1085790370950905, 0.8972754969684291)
Intermediate    (0.5678877824942661, 0.5698403547950377)
dtype: object
Експериментальний дизайн у Python

Візуалізація ефектів між блоками

import seaborn as sns
sns.boxplot(x='Initial_Fitness_Level', y='Muscle_Gain_kg', data=blocks)
plt.show()

Боксплот між блоками

Експериментальний дизайн у Python

ANOVA між блоками

f_oneway(
  blocks[blocks['Initial_Fitness_Level'] == "Advanced"]['Muscle_Gain_kg'], 
  blocks[blocks['Initial_Fitness_Level'] == "Beginner"]['Muscle_Gain_kg'], 
  blocks[blocks['Initial_Fitness_Level'] == "Intermediate"]['Muscle_Gain_kg']
)
F_onewayResult(statistic=2.325058605244051, pvalue=0.10045536062209368)
Експериментальний дизайн у Python

Давайте потренуємось!

Експериментальний дизайн у Python

Preparing Video For Download...