Содержимое
Увидел я такой график. Опустим, что человек гордится тем, что LLM ему помогает их делать (и не только). Я хочу разобрать методологическую сторону (как я это вижу/пониманию). 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). Сделал бы так человек, который базово что-то прочитал про статистику?