1) Мне не очень понятно, зачем в заголовке указывать статистические показатели (ещё и явно другим шрифтом для латиницы). 🤷♂️
2) Вопросы, которые представлены на графике, словно подразумевают ответы "да"/"нет", а по цветовой гамме и легенде можно сделать вывод, что это сравнение между мужским и женским полом.
Наиболее вероятно, что по полам был подсчет относительной частоты утвердительных ответов на каждый вопрос с последующим расчетом разницы (мужской - женский). В медицинских исследованиях обычно это обозначается термином разница рисков (risk difference, RD) или абсолютный риск (absolute risk, AR). И это было бы окэй, но...
Здесь зачем-то используется мера эффекта d Коэна (Cohen's d)... Если кто не знает, то обычно она используется для стандартизации разницы средних (если очень упрощенно, подробнее тут). И вроде бы можно сказать, что частота и среднее - это мат ожидание, для бинарных данных они равны (сам же здесь показывал), но...
Зачем нужен этот перерасчёт? Ведь разница рисков итак уже в какой-то мере стандартизирована (она всегда находится на одной шкале, единицы измерения равны). Если сильно хочется, то можно посчитать относительный риск (risk ratio, RR), который лучше (если надо в единых величинах) отражает изменение эффекта (RR может быть равным 2 при RD = 30% или = 5%, зависит от исходной частоты).
А ещё интересный вопрос - как ведёт себя неопределенность?
Давайте проверим, сделаем симуляцию.
library(tidyverse)
# Создаем симуляцию, где мужчины реже ответили "да", чем женщины
set.seed(42)
d_long <- tibble(male = rbinom(1000, 1, 0.4),
female = rbinom(1000, 1, 0.6)) |>
pivot_longer(male:female) |>
mutate(name = factor(name, levels = c("male", "female")),
value = as.numeric(value))
# Посмотрим частоту ответов
d_long |>
summarise(rate = sum(value),
prct = rate/1000,
.by = name)
#> A tibble: 2 × 3
#> name rate prct
#> <fct> <dbl> <dbl>
#> 1 male 377 0.377
#> 2 female 599 0.599
# В целом как и планировалось
# Выводим таблицу сопряженности
d_long |>
mutate(value = factor(value, levels = c(1,0))) |>
select(value, name) |>
table()
#> name
#> value male female
#> 1 377 599
#> 0 623 401
# Рассчитаем разницу рисков с ДИ
RD = 0.377 - 0.599
SE = sqrt((377 * 623)/(377 + 623)^3 + (599 * 401)/(599 + 401)^3)
paste0(RD, " (", round(RD - 1.96*SE, 3), "; ", round(RD + 1.96*SE, 3), ")")
#> [1] "-0.222 (-0.265; -0.179)"
# Проверим через пакет
table(d_long) |>
effectsize::arr()
#> ARR | 95% CI
#> -------------------
#> 0.22 | [0.18, 0.26]
# Все верно, только знака минус нет (потому что это Absolute risk reduction)
# Рассчитаем sd
d_long |>
summarise(rate = sum(value),
prct = rate/1000,
sd = sd(value),
.by = name)
#> A tibble: 2 × 4
#> name rate prct sd
#> <fct> <dbl> <dbl> <dbl>
#> 1 male 377 0.377 0.485
#> 2 female 599 0.599 0.490
# Получим d Коэна
sd_pool = sqrt(((1000 - 1) * 0.485^2 + (1000 - 1) * 0.490^2)/(2000-2))
round(RD/sd_pool, 3)
#> [1] -0.455
# Проверим через пакет
effectsize::cohens_d(value ~ name, data = d_long, pooled_sd = F)
#> Cohen's d | 95% CI
#> --------------------------
#> -0.46 | [-0.54, -0.37]
Упс... Какая-то квази/прокси/псевдо-оценка эффекта. Получается, что результаты стандартизации излишни. Они ничего не добавляют, а только усложняют интерпретацию (т.к. это теперь не разница частоты, а ее размер в SD). Сделал бы так человек, который базово что-то прочитал про статистику?