Как рассчитать (статистическую) функцию мощности в зависимости от размера выборки в python?

Как это можно сделать в питоне?

  1. Рассчитать размер выборки для заданной мощности и альфы?
  2. Рассчитать мощность для заданного размера выборки и альфы?

Примечание: я полностью запутался :( с функциями, которые python предоставляет для (статистического) расчета функции мощности.

Может ли кто-нибудь помочь мне сделать заказ здесь?

В statsmodels есть две функции:

from statsmodels.stats.power import ttest_power, tt_ind_solve_power()

У нас есть:

tt_ind_solve_power(effect_size=effect_size, alpha=alpha, power=0.8, ratio=1, alternative='two-sided')

А еще у нас есть:

ttest_power(0.2, nobs=sampleSize, alpha=alpha, alternative='two-sided')

Есть еще такой кусок кода:

import statsmodels.stats.api as sms
es = sms.proportion_effectsize(prop1, prop2, method='normal')
n = sms.NormalIndPower().solve_power(es, power=0.9, alpha=0.05, ratio=2)

Я где-то нашел этот пример, но он НЕ объясняет, что такое prop1 и prop2!

Каждый дает мне разные значения.

спасибо


person Samer Aamar    schedule 15.11.2017    source источник
comment
Небольшая придирка: функции, которые Python предоставляет для (статистического) расчета функции мощности. Нет, Python [с заглавной «P»] не предоставляет вам такие функции. Его предоставляет пакет statsmodels Python. Не путайте язык с его экосистемой.   -  person Laryx Decidua    schedule 27.07.2020
comment
prop1 и prop2 — это средние значения какого-то соотношения, например x количество отсчетов за испытание.   -  person Union find    schedule 17.10.2020


Ответы (1)


В качестве ответа на вопрос выше я написал эту функцию, которая вычисляет мощность в зависимости от размера выборки.

При вызове tt_ind_solve_power вам нужно оставить один параметр равным None для расчета. В моем примере ниже я сохраняю мощность как None.

Надеюсь кому-то будет полезно, любые улучшения приветствуются.

from statsmodels.stats.power import  tt_ind_solve_power
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

def test_ttest_power_diff(mean, std, sample1_size=None, alpha=0.05, desired_power=0.8, mean_diff_percentages=[0.1, 0.05]):
    '''
    calculates the power function for a given mean and std. the function plots a graph showing the comparison between desired mean differences
    :param mean: the desired mean
    :param std: the std value
    :param sample1_size: if None, it is assumed that both samples (first and second) will have same size. The function then will
    walk through possible sample sizes (up to 100, hardcoded).
    If this value is not None, the function will check different alternatives for sample 2 sizes up to sample 1 size.
    :param alpha: alpha default value is 0.05
    :param desired_power: will use this value in order to mark on the graph
    :param mean_diff_percentages: iterable list of percentages. A line per value will be calculated and plotted.
    :return: None
    '''
    fig, ax = plt.subplots()
    for mean_diff_percent in mean_diff_percentages:
        mean_diff = mean_diff_percent * mean
        effect_size = mean_diff / std

        print('Mean diff: ', mean_diff)
        print('Effect size: ', effect_size)

        powers = []

        max_size  = sample1_size
        if sample1_size is None:
            max_size = 100

        sizes = np.arange(1, max_size, 2)
        for sample2_size in sizes:
            if(sample1_size is None):
                n = tt_ind_solve_power(effect_size=effect_size, nobs1=sample2_size, alpha=alpha, ratio=1.0, alternative='two-sided')
                print('tt_ind_solve_power(alpha=', alpha, 'sample2_size=', sample2_size, '): sample size in *second* group: {:.5f}'.format(n))
            else:
                n = tt_ind_solve_power(effect_size=effect_size, nobs1=sample1_size, alpha=alpha, ratio=(1.0*sample2_size/sample1_size), alternative='two-sided')
                print('tt_ind_solve_power(alpha=', alpha, 'sample2_size=', sample2_size, '): sample size *each* group: {:.5f}'.format(n))

            powers.append(n)

        try: # mark the desired power on the graph
            z1 = interp1d(powers, sizes)
            results = z1(desired_power)

            plt.plot([results], [desired_power], 'gD')
        except Exception as e:
            print("Error: ", e)
            #ignore

        plt.title('Power vs. Sample Size')
        plt.xlabel('Sample Size')
        plt.ylabel('Power')

        plt.plot(sizes, powers, label='diff={:2.0f}%'.format(100*mean_diff_percent)) #, '-gD')

    plt.legend()
    plt.show()

Например, если вы вызовете эту функцию со средним значением = 10 и стандартным значением = 2, вы получите следующий график:

«Мощность

person Samer Aamar    schedule 16.11.2017