statsmodels.stats.oneway.effectsize_oneway

statsmodels.stats.oneway.effectsize_oneway(means, vars_, nobs, use_var='unequal', ddof_between=0)[source]

Effect size corresponding to Cohen’s f = nc / nobs for oneway anova

This contains adjustment for Welch and Brown-Forsythe Anova so that effect size can be used with FTestAnovaPower.

Parameters:
meansarray_like

Mean of samples to be compared

vars_float or array_like

Residual (within) variance of each sample or pooled If vars_ is scalar, then it is interpreted as pooled variance that is the same for all samples, use_var will be ignored. Otherwise, the variances are used depending on the use_var keyword.

nobsint or array_like

Number of observations for the samples. If nobs is scalar, then it is assumed that all samples have the same number nobs of observation, i.e. a balanced sample case. Otherwise, statistics will be weighted corresponding to nobs. Only relative sizes are relevant, any proportional change to nobs does not change the effect size.

use_var{“unequal”, “equal”, “bf”}

If use_var is “unequal”, then the variances can differ across samples and the effect size for Welch anova will be computed.

ddof_betweenint

Degrees of freedom correction for the weighted between sum of squares. The denominator is nobs_total - ddof_between This can be used to match differences across reference literature.

Returns:
f2float

Effect size corresponding to squared Cohen’s f, which is also equal to the noncentrality divided by total number of observations.

Notes

This currently handles the following cases for oneway anova

  • balanced sample with homoscedastic variances

  • samples with different number of observations and with homoscedastic variances

  • samples with different number of observations and with heteroskedastic variances. This corresponds to Welch anova

In the case of “unequal” and “bf” methods for unequal variances, the effect sizes do not directly correspond to the test statistic in Anova. Both have correction terms dropped or added, so the effect sizes match up with using FTestAnovaPower. If all variances are equal, then all three methods result in the same effect size. If variances are unequal, then the three methods produce small differences in effect size.

Note, the effect size and power computation for BF Anova was not found in the literature. The correction terms were added so that FTestAnovaPower provides a good approximation to the power.

Status: experimental We might add additional returns, if those are needed to support power and sample size applications.

Examples

The following shows how to compute effect size and power for each of the three anova methods. The null hypothesis is that the means are equal which corresponds to a zero effect size. Under the alternative, means differ with two sample means at a distance delta from the mean. We assume the variance is the same under the null and alternative hypothesis.

nobs for the samples defines the fraction of observations in the samples. nobs in the power method defines the total sample size.

In simulations, the computed power for standard anova, i.e.``use_var=”equal”`` overestimates the simulated power by a few percent. The equal variance assumption does not hold in this example.

>>> from statsmodels.stats.oneway import effectsize_oneway
>>> from statsmodels.stats.power import FTestAnovaPower
>>>
>>> nobs = np.array([10, 12, 13, 15])
>>> delta = 0.5
>>> means_alt = np.array([-1, 0, 0, 1]) * delta
>>> vars_ = np.arange(1, len(means_alt) + 1)
>>>
>>> f2_alt = effectsize_oneway(means_alt, vars_, nobs, use_var="equal")
>>> f2_alt
0.04581300813008131
>>>
>>> kwds = {'effect_size': np.sqrt(f2_alt), 'nobs': 100, 'alpha': 0.05,
...         'k_groups': 4}
>>> power = FTestAnovaPower().power(**kwds)
>>> power
0.39165892158983273
>>>
>>> f2_alt = effectsize_oneway(means_alt, vars_, nobs, use_var="unequal")
>>> f2_alt
0.060640138408304504
>>>
>>> kwds['effect_size'] = np.sqrt(f2_alt)
>>> power = FTestAnovaPower().power(**kwds)
>>> power
0.5047366512800622
>>>
>>> f2_alt = effectsize_oneway(means_alt, vars_, nobs, use_var="bf")
>>> f2_alt
0.04391324307956788
>>>
>>> kwds['effect_size'] = np.sqrt(f2_alt)
>>> power = FTestAnovaPower().power(**kwds)
>>> power
0.3765792117047725