Source code for acore.power_analysis

import itertools

import numpy as np
import pandas as pd
from statsmodels.stats.power import FTestAnovaPower

from acore import utils


[docs] def power_analysis( data, group="group", groups=None, alpha=0.05, power=0.8, dep_var="nobs", figure=False, ): quantiles = ["25% qtl es", "mean es", "50% qtl es", "75% qtl es"] if groups is None: groups = data[group].unique().tolist() k_groups = len(groups) effect_sizes = set() for col in data.drop([group], axis=1).columns: for g1, g2 in itertools.combinations(groups, 2): sample1 = data.loc[data[group] == g1, col].values sample2 = data.loc[data[group] == g2, col].values eff_size = np.abs(utils.cohens_d(sample1, sample2, ddof=1)) effect_sizes.add(eff_size) summary_eff = [] if len(effect_sizes): effect_sizes = list(effect_sizes) summary_eff = [ np.percentile(effect_sizes, 25), np.mean(effect_sizes), np.percentile(effect_sizes, 50), np.percentile(effect_sizes, 75), ] analysis = FTestAnovaPower() sample_sizes = np.array(range(3, 150)) power_list = [] labels = [] samples = [] for ii, es in enumerate(summary_eff): p = analysis.power(es, sample_sizes, alpha, k_groups) labels.extend(["%s = %4.2F" % (quantiles[ii], es)] * len(p)) power_list.extend(p) samples.extend(sample_sizes) power_df = pd.DataFrame( data=list(zip(power_list, samples, labels)), columns=["power", "#samples", "labels"], ) sample_size = analysis.solve_power( summary_eff[1], power=power, alpha=alpha, k_groups=k_groups ) return (sample_size, power_df)