Как вычислить d Коэна в Python?

Мне нужно вычислить Коэн d определить размер эффекта эксперимента. Есть ли какая-либо реализация в звуковой библиотеке, которую я мог бы использовать? Если нет, то что было бы хорошей реализацией?

3 ответов


вышеуказанная реализация верна в частном случае, когда две группы имеют одинаковый размер. Более общее решение, основанное на формулах, найденных в Википедия и статья Роберта Коу является 2-м методом, показанным ниже. Имейте в виду, что знаменателем является объединенное стандартное отклонение, которое обычно подходит только в том случае, если стандартное отклонение популяции равно для обеих групп:

from numpy import std, mean, sqrt

#correct if the population S.D. is expected to be equal for the two groups.
def cohen_d(x,y):
    nx = len(x)
    ny = len(y)
    dof = nx + ny - 2
    return (mean(x) - mean(y)) / sqrt(((nx-1)*std(x, ddof=1) ** 2 + (ny-1)*std(y, ddof=1) ** 2) / dof)

#dummy data
x = [2,4,7,3,7,35,8,9]
y = [i*2 for i in x]
# extra element so that two group sizes are not equal.
x.append(10)

#correct only if nx=ny
d = (mean(x) - mean(y)) / sqrt((std(x, ddof=1) ** 2 + std(y, ddof=1) ** 2) / 2.0)
print ("d by the 1st method = " + str(d))
if (len(x) != len(y)):
    print("The first method is incorrect because nx is not equal to ny.")

#correct for more general case including nx !=ny
print ("d by the more general 2nd method = " + str(cohen_d(x,y)))

выход будет:

d К 1-му метод = -0.559662109472 Первый метод неверен, потому что nx не равен ny. d более общим 2-м методом = -0.572015604666


Начиная С Python3.4, Вы можете использовать statistics модуль для расчета спреда и средних показателей. При этом d Коэна можно легко вычислить:

from statistics import mean, stdev
from math import sqrt

# test conditions
c0 = [2, 4, 7, 3, 7, 35, 8, 9]
c1 = [i * 2 for i in c0]

cohens_d = (mean(c0) - mean(c1)) / (sqrt((stdev(c0) ** 2 + stdev(c1) ** 2) / 2))

print(cohens_d)

выход:

-0.5567679522645598

таким образом, мы наблюдаем средний эффект.


в Python 2.7, вы можете использовать numpy С парой предостережений, как я обнаружил, адаптируя ответ Бенгта из Python 3.4.

  1. убедитесь, что разделение всегда возвращает float с:from __future__ import division
  2. укажите аргумент деления на дисперсию с ddof=1 на