Как вычислить 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.
- убедитесь, что разделение всегда возвращает float с:
from __future__ import division
- укажите аргумент деления на дисперсию с
ddof=1
на