Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# Partial eta-square
eta_a = (f_a * df_a) / (f_a * df_a + df_as)
eta_b = (f_b * df_b) / (f_b * df_b + df_bs)
eta_ab = (f_ab * df_ab) / (f_ab * df_ab + df_abs)
# Epsilon
piv_a = data.pivot_table(index=subject, columns=a, values=dv)
piv_b = data.pivot_table(index=subject, columns=b, values=dv)
piv_ab = data.pivot_table(index=subject, columns=[a, b], values=dv)
eps_a = epsilon(piv_a, correction='gg')
eps_b = epsilon(piv_b, correction='gg')
# Note that the GG epsilon of the interaction slightly differs between
# R and Pingouin. An alternative is to use the lower bound, which is
# very conservative (same behavior as described on real-statistics.com).
eps_ab = epsilon(piv_ab, correction='gg')
# Greenhouse-Geisser correction
df_a_c, df_as_c = [np.maximum(d * eps_a, 1.) for d in (df_a, df_as)]
df_b_c, df_bs_c = [np.maximum(d * eps_b, 1.) for d in (df_b, df_bs)]
df_ab_c, df_abs_c = [np.maximum(d * eps_ab, 1.) for d in (df_ab, df_abs)]
p_a_corr = f(df_a_c, df_as_c).sf(f_a)
p_b_corr = f(df_b_c, df_bs_c).sf(f_b)
p_ab_corr = f(df_ab_c, df_abs_c).sf(f_ab)
# Create dataframe
aov = pd.DataFrame({'Source': [a, b, a + ' * ' + b],
'SS': [ss_a, ss_b, ss_ab],
'ddof1': [df_a, df_b, df_ab],
'ddof2': [df_as, df_bs, df_abs],
'MS': [ms_a, ms_b, ms_ab],
'F': [f_a, f_b, f_ab],
# Reshape and remove NAN for sphericity estimation and correction
data_pivot = data.pivot(index=subject, columns=within, values=dv).dropna()
# Compute sphericity using Mauchly test
# Sphericity assumption only applies if there are more than 2 levels
if correction == 'auto' or (correction is True and n_rm >= 3):
spher, W_spher, chi_sq_spher, ddof_spher, \
p_spher = sphericity(data_pivot, alpha=.05)
if correction == 'auto':
correction = True if not spher else False
else:
correction = False
# Compute epsilon adjustement factor
eps = epsilon(data_pivot, correction='gg')
# If required, apply Greenhouse-Geisser correction for sphericity
if correction:
corr_ddof1, corr_ddof2 = [np.maximum(d * eps, 1.) for d in
(ddof1, ddof2)]
p_corr = f(corr_ddof1, corr_ddof2).sf(fval)
# Create output dataframe
if not detailed:
aov = pd.DataFrame({'Source': within,
'ddof1': ddof1,
'ddof2': ddof2,
'F': fval,
'p-unc': p_unc,
'np2': np2,
'eps': eps,
# P-values
p_a = f(df_a, df_as).sf(f_a)
p_b = f(df_b, df_bs).sf(f_b)
p_ab = f(df_ab, df_abs).sf(f_ab)
# Partial eta-square
eta_a = (f_a * df_a) / (f_a * df_a + df_as)
eta_b = (f_b * df_b) / (f_b * df_b + df_bs)
eta_ab = (f_ab * df_ab) / (f_ab * df_ab + df_abs)
# Epsilon
piv_a = data.pivot_table(index=subject, columns=a, values=dv)
piv_b = data.pivot_table(index=subject, columns=b, values=dv)
piv_ab = data.pivot_table(index=subject, columns=[a, b], values=dv)
eps_a = epsilon(piv_a, correction='gg')
eps_b = epsilon(piv_b, correction='gg')
# Note that the GG epsilon of the interaction slightly differs between
# R and Pingouin. An alternative is to use the lower bound, which is
# very conservative (same behavior as described on real-statistics.com).
eps_ab = epsilon(piv_ab, correction='gg')
# Greenhouse-Geisser correction
df_a_c, df_as_c = [np.maximum(d * eps_a, 1.) for d in (df_a, df_as)]
df_b_c, df_bs_c = [np.maximum(d * eps_b, 1.) for d in (df_b, df_bs)]
df_ab_c, df_abs_c = [np.maximum(d * eps_ab, 1.) for d in (df_ab, df_abs)]
p_a_corr = f(df_a_c, df_as_c).sf(f_a)
p_b_corr = f(df_b_c, df_bs_c).sf(f_b)
p_ab_corr = f(df_ab_c, df_abs_c).sf(f_ab)
# Create dataframe
aov = pd.DataFrame({'Source': [a, b, a + ' * ' + b],
# P-values
p_a = f(df_a, df_as).sf(f_a)
p_b = f(df_b, df_bs).sf(f_b)
p_ab = f(df_ab, df_abs).sf(f_ab)
# Partial eta-square
eta_a = (f_a * df_a) / (f_a * df_a + df_as)
eta_b = (f_b * df_b) / (f_b * df_b + df_bs)
eta_ab = (f_ab * df_ab) / (f_ab * df_ab + df_abs)
# Epsilon
piv_a = data.pivot_table(index=subject, columns=a, values=dv)
piv_b = data.pivot_table(index=subject, columns=b, values=dv)
piv_ab = data.pivot_table(index=subject, columns=[a, b], values=dv)
eps_a = epsilon(piv_a, correction='gg')
eps_b = epsilon(piv_b, correction='gg')
# Note that the GG epsilon of the interaction slightly differs between
# R and Pingouin. An alternative is to use the lower bound, which is
# very conservative (same behavior as described on real-statistics.com).
eps_ab = epsilon(piv_ab, correction='gg')
# Greenhouse-Geisser correction
df_a_c, df_as_c = [np.maximum(d * eps_a, 1.) for d in (df_a, df_as)]
df_b_c, df_bs_c = [np.maximum(d * eps_b, 1.) for d in (df_b, df_bs)]
df_ab_c, df_abs_c = [np.maximum(d * eps_ab, 1.) for d in (df_ab, df_abs)]
p_a_corr = f(df_a_c, df_as_c).sf(f_a)
p_b_corr = f(df_b_c, df_bs_c).sf(f_b)
p_ab_corr = f(df_ab_c, df_abs_c).sf(f_ab)
# Create dataframe
aov = pd.DataFrame({'Source': [a, b, a + ' * ' + b],
'SS': [ss_a, ss_b, ss_ab],