12 Анализ категориальных данных
До этого мы все время работали с линейными моделями, где целевая (зависимая) переменная была количественной. И линейные регрессионные модели, и ANOVA модели относятся к общим линейным омделям (general linear models). Но что делать, если цеелвая переменнаая – категориальная? Уже нельзя строить линейные модели? Общие линейные – нет, а обобщенные – можно! Модели с категориальными предикторами включаются в обобщенные линейные модели generalized linear modela (не перепутайте…)
12.1 Логистическая регрессия
К логистической регрессии относится семейство моделей, где целевая переменная может принимать значения 1 или 0. То есть она принадлежит распределению Бернулли. Можно поизучать его на шайниапп, котрый сделал Антон Ангельгардт https://angelgardt.shinyapps.io/binomial_app/
Но если мы посмотрим на классическое уравнение регрессии, можем заметить проблему:
\(\hat y = b_0 + b_1 \times x_1\)
В левой части уравнения у нас стоят только значения \(\hat y={1;0}\), когда как в правой – множество непрерывных значений от минус бесконечности до бесконечности.
Чтобы ее решить, перейдем сначала к вероятностям: вместо значений 0 и 1 будем использовать вероятность для, например, 1.
\(p_1= b_0 + b_1 \times x_1\),
\(p_1 \in [0;1]\)
Уже лучше, но мы все еще остались в границах от 0 до 1. Чтобы все-таки превратить это уравнение в уже привычную нам линейную регрессию с количественной ЗП, сделаем логарифмическую трансформацию шансов – перейдем от вероятности к шансам для каждого исхода, 0 и 1, и посчитаем логарифм от них. Вероятность наступления исхода тогда станет обратной этому логарифму величиной.
\(odds_1 = \frac{p_1}{p_0} = \frac{p_1}{1 - p_1}\),
\(p_1 \in [0;1]\)
\(ln(odds_1) = logit(p_1) = ln(\frac{p_1}{1 - p_1}) = b_0 + b_1 \times x_1\),
\(p_1 = \frac{e^{b_0 + b_1 x}}{1 + e^{b_0 + b_1 x}}\),
\(ln(\frac{p_1}{1 - p_1}) \in (-\infty;\infty)\)
Здесь сильно упрощена математика, вслед за курсом Анатолия Карпова на степике не будем вдаваться в подробности. Здесь важно, что мы постарались применить одинаковое преобразование к обеим частям уравнения, поэтому вероятность теперь считается по функции с экспонентой (эта функция, к слову, очень важна в машинном обучении и называется сигма-функцией или сигмоидой из-за ее вида) – то есть, по определению логарифма, это показатель степени, в которую нужно возвести основание логарифма, чтобы получить данное число (\(ln(p_1) = b_0 + b_1 \times x_1\)).
Сначала построим просто модель только с интерсептом, которая будет показывать, каковы шансы, что студент заплатит за курс на Udemy сами по себе, без учета каких-либо переменных – то есть, по сути, это тот же самый анализ, что и хи-квадрат – мы берем только частоты и строим на них модель.
! Важный момент! R считает за референс (первое значение, то, что будет в числителе) всегда наименьшее значение, то есть шансы будут считаться для 0, а не для 1. Если мы имеем дело с не числовыми значениями, то можем перезадать их с помощью функции relevel().
%>%
udemy_sample glm(is_paid ~1, ., family = binomial) ->logmodel1
summary(logmodel1)
##
## Call:
## glm(formula = is_paid ~ 1, family = binomial, data = .)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## 2.409e-06 2.409e-06 2.409e-06 2.409e-06 2.409e-06
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 26.57 17055.25 0.002 0.999
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 0.0000e+00 on 435 degrees of freedom
## Residual deviance: 2.5295e-09 on 435 degrees of freedom
## AIC: 2
##
## Number of Fisher Scoring iterations: 25
Интерсепт здесь получился равен 26.566069 – и есть натуральный логарифм шансов для оплаты. Посчитаем саму вероятность: \(p = \frac{exp^{26.56}}{1+exp^{26.56}}\)
Это число получилось равно 692204438686. То есть, шансы, что студенты НЕ заплят за курс (0) весьма высокие…
Теперь посчитаем, как влияет на оплату цена курса
%>%
udemy_sample glm(is_paid ~ price_log, ., family = binomial) ->logmodel2
summary(logmodel2)
##
## Call:
## glm(formula = is_paid ~ price_log, family = binomial, data = .)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## 2.409e-06 2.409e-06 2.409e-06 2.409e-06 2.409e-06
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.657e+01 7.149e+04 0 1
## price_log -5.674e-08 1.821e+04 0 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 0.0000e+00 on 435 degrees of freedom
## Residual deviance: 2.5295e-09 on 434 degrees of freedom
## AIC: 4
##
## Number of Fisher Scoring iterations: 25
12.2 Хи-квадрат
Хи-квадратом мы обычно проверяем коррялцию категориальных переменных между собой: порядковых, если у нас не шкала Лайерта или мало возможных значений, и метод корреляции Спирмена не подходит, или номинальных, где корреляцию Спирмена провести уже невозможно.
Например, давайте проверим гипотезу о том, что наличие или отсутствие интернета в квартире связано с наличием или отсутствием романтических отношений. Предположим, что португальские школьники, у кого дома есть интернет, реже вступают в романтические отношения, по сравнению с теми, у кого интернета нет. Для этого будем использовать метод хи-квадрат. НП – наличие или отсутствие интернета (переменная internet), ЗП – наличие или отсутствие романтических отношений (romantic).
chisq.test(students$internet, students$romantic, correct=FALSE)
##
## Pearson's Chi-squared test
##
## data: students$internet and students$romantic
## X-squared = 3.9258, df = 1, p-value = 0.04755
Сравниваем полученное p-value с выбранным уровнем α=0.05. p-value < α, значит, вероятность получить такую связь между переменными при условии, если на самом деле ее нет, меньше нашего допустимого уровня ложноположительных результатов, мы отвергаем нулевую гипотезу и делаем вывод о наличии корреляционной связи.
Хи-квадрат чаще всего визуализируют уже знакомым по корреляции Спирмена мозаичным графиком. Указываем НП как x=product(НП), и ЗП как fill = ЗП.
library(ggmosaic)
%>%
students ggplot(aes()) +
geom_mosaic(aes(x = product(internet), fill = romantic)) +
scale_fill_viridis(discrete=TRUE) +
theme_minimal()