country adjusted_satisfaction avg_satisfaction std_satisfaction
Length:111 Min. :19.00 Min. :2.500 Min. :1.380
Class :character 1st Qu.:40.00 1st Qu.:5.100 1st Qu.:1.910
Mode :character Median :48.00 Median :6.000 Median :2.130
Mean :48.73 Mean :5.937 Mean :2.125
3rd Qu.:57.00 3rd Qu.:7.000 3rd Qu.:2.330
Max. :74.00 Max. :8.500 Max. :3.190
avg_income median_income income_inequality region
Min. : 572.9 Min. : 415.5 Min. :24.21 Length:111
1st Qu.: 1519.4 1st Qu.: 1167.7 1st Qu.:32.18 Class :character
Median : 3889.3 Median : 2647.0 Median :36.48 Mode :character
Mean : 6442.8 Mean : 5186.0 Mean :38.42
3rd Qu.: 7867.4 3rd Qu.: 6581.1 3rd Qu.:43.38
Max. :26182.3 Max. :22240.2 Max. :63.73
happyScore GDP
Min. :2.839 Min. :0.0153
1st Qu.:4.568 1st Qu.:0.5099
Median :5.268 Median :0.9186
Mean :5.422 Mean :0.8419
3rd Qu.:6.392 3rd Qu.:1.1495
Max. :7.587 Max. :1.5639
Больше всего нас будут интересовать переменные happyScore и GDP.
Посмотрим на данные
С помощью функции skim() из пакета skimr.
skimr::skim(df)
(Аутпут очень большой, поэтому прикрепила скрином).
Ковариация
Самая простая мера связи между двумя количественными переменными — это ковариация. Если ковариация положительная, то чем больше одна переменная, тем больше другая переменная. При отрицательной ковариации наоборот: чем больше одна переменная, тем меньше другая. -> проиллюстрировать на графике
Если оценить ковариацию переменной с самой собой, какая будет формула?
Ковариация
Ковариация переменной с самой собой - это дисперсия.
Давайте посчитаем ковариацию: функция cov().
df %>%select(happyScore, GDP) %>%cov()
happyScore GDP
happyScore 1.3942899 0.3615849
GDP 0.3615849 0.1502264
По главной диагонали ковариация переменной с самой собой - дисперсия.
df %>%select(happyScore, GDP) %>%var() # тот же самый результат с помощью функции var
happyScore GDP
happyScore 1.3942899 0.3615849
GDP 0.3615849 0.1502264
Можем ли мы сделать вывод, это относительно большая ковариация между переменными или нет?
Коэффициент корреляции
Проблема ковариации в том, что она привязана к исходной шкале и измеряется в пределах \([-\infty; \infty]\). Неплохо было бы иметь возможность нормировать. Для этого используется коэффициент корреляции.
Pearson's product-moment correlation
data: df$happyScore and df$GDP
t = 13.455, df = 109, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.7079171 0.8511169
sample estimates:
cor
0.7900609
По умолчанию рассчитывается коэффициент корреляции Пирсона: оценивает связь двух нормально распределенных величин. Выявляет только линейную составляющую взаимосвязи.
Часто используется коэффициент корреляции Спирмена (Spearman), если в данных есть выбросы. Математика метода точно такая же как у коэффициента Пирсона, только вместо оригинальных значений используются ранги.
В целом, непараметрические критерии не зависят от формы распределения и могут оценивать связь для любых монотонных зависимостей.
Spearman's rank correlation rho
data: df$happyScore and df$GDP
S = 47026, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.7936732
Наличие значимого коэффициента корреляции ничего не говорит о причинно-следственной связи между переменными!
Kendall's rank correlation tau
data: df$happyScore and df$GDP
z = 9.3551, p-value < 2.2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.6013104
Сравнение различных коэффициентов корреляции
Пирсона
Спирмена
Кендалла
Выявляет линейную зависимость
Выявляет любую монотонную зависимость
Выявляет любую монотонную зависимость
Количественная или интервальная шкала
шкала >= ранговая (то есть ранговая, интервальная, количественная)
шкала >= ранговая
Неустойчивость к выбросам
Устойчивость к выбросам
Устойчивость к выбросам
Пример ситуации, когда коэффициент Спирмена более применим:
Проведя корреляционный анализ, мы лишь ответили на вопрос “Существует ли статистически значимая связь между величинами?”
Сможем ли мы, используя это знание, предсказать значения одной величины, исходя из знаний другой?
Линейная регрессия
Какие бывают регрессионные модели?
Линейные и нелинейные
Линейные
\[
y = b_0 + b_1x
\]\[
y = b_0 + b_1x_1 + b_2x_2
\]
\[
y = b_0 + b_1x_1^2 + b_2x_2^3
\]
Нелинейные
\[
y = b_0 + b_1^x
\]\[
y = b_0^{b_1x_1+b_2x_2}
\]
Простые и множественные
Линейная регрессия: формула
Линейная регрессия позволяет предсказать значение одной переменной на основании значений другой. Обе переменные должны быть количественными.
Формула для простой линейной регрессии - по сути это формула прямой из алгебры + остатки:
\[
Y = ax + b + \epsilon
\]
\(Y\) - зависимая переменная, что пытаемся предсказать, \(\epsilon\) - это ошибки или остатки модели (residuals) - то есть то, что наша модель не смогла предсказать.
Для более сложных моделей нотация немного меняется:
С помощью geom_abline() задаем регрессионную прямую: подаем значения ax+b. Еще можно это сделать с помощью geom_smooth(), но тут задача показать, как прямую задать самостоятельно.
График зависимости happyScore от ВВП
Предсказание значений на основе регрессионной прямой
Функция predict() принимает на вход независимую переменную и предсказывает значение зависимой на основании нашей модели (подставляет в формулу).
Например, предскажем happyScore для GDP = 0.8. (Нужно подать именно датафрейм).
predict(model, data.frame(GDP =0.8))
1
5.321038
Функция predict() ничего не знает о физическом смысле наших данных, поэтому мы можем предсказывать любые, даже неадекватные значения, например
predict(model, data.frame(GDP =-5))
1
-8.639174
Предсказания регрессионной модели имеют смысл только “внутри” графика!
Это называется интерполяция, а экстраполяция почти всегда будет неверной.
Экстраполяция и интерполяция
Более внимательно посмотрим на вывод регрессии
summary(model)
Call:
lm(formula = happyScore ~ GDP, data = df)
Residuals:
Min 1Q Median 3Q Max
-2.05142 -0.47761 -0.02728 0.60008 1.53001
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.3955 0.1657 20.50 <2e-16 ***
GDP 2.4069 0.1789 13.46 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.7272 on 109 degrees of freedom
Multiple R-squared: 0.6242, Adjusted R-squared: 0.6207
F-statistic: 181 on 1 and 109 DF, p-value: < 2.2e-16
Что все это значит?
Самое важное из вывода регрессии
summary(model)$coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.395491 0.1656664 20.49596 3.459016e-39
GDP 2.406933 0.1788837 13.45530 6.570905e-25
p-value есть для каждого коэффициента,
\(H_0: Intercept = 0, Slope = 0\).
\(H_1: Intercept \neq 0, Slope \neq 0\).
Какое значение p-value для нас важнее?
Коэффициент наклона.
Как рассчитывается значимость коэффициента наклона?
Рассчитывается относительно “нулевой” модели - то есть модели, в которую входит только интерсепт.
Коэффициент детерминации - мера качества модели
\(R^2\) - коэффициент детерминации. Описывает какую долю дисперсии зависимой переменной объясняет модель.
\[
R^2 = \frac{\color{blue}{SS_{r}}}{SS_{t}}
\]
Измеряется от \([0, 1]\).
\(R^2 = r^2\) - для простой линейной регрессии коэффициент детерминации - квадрат коэффициента корреляции Пирсона.
Допущения линейной регрессии
Линейная связь
Независимость
Гомогенность дисперсий
Отсутствие коллинеарности предикторов (для множественной регрессии)
Нормальное распределение ошибок -> проиллюстрировать другие графики в R
plot(model)
Линейность связи
Нелинейность связи видно на графиках остатков.
Проверка на линейность связи:
График зависимости y от x (и от других переменных, не включенных в модель).
Применить обобщенную линейную модель с другой функцией связи (GLM)
График остатков для наших данных
ggplot(data.frame(fit =fitted(model), res =residuals(model)), aes(x = fit, y = res)) +geom_point() +geom_hline(yintercept =0, linetype =2) +xlab("Fitted") +ylab("Residuals")+theme_bw()
График остатков для наших данных
Независимость данных
Каждое значение \(y_i\) должно быть независимо от любого другого \(y_j\).
Это возможно проконтролировать на этапе сбора данных
Наиболее частые источники зависимостей:
Псевдоповторности (когда измерили один и тот же объект несколько раз)
Временные и пространственные автокорреляции
Неучтенные переменные
Нормальное распределение ошибок
Можно проверить с помощью qqPlot().
car::qqPlot(model$residuals, id =FALSE)
Проверка на гомогенность дисперсий (гомоскедастичность)
Многие тесты чувствительны к гетероскедастичности.
Лучший способ проверки на гомогенность дисперсий — график остатков от предсказанных значений.
Проверка на гомогенность дисперсий
взято из презентации Марины Варфоломеевой
Множественная линейная регрессия
Можно использовать несколько предикторов для объяснения зависимой переменной.
Больше предикторов - лучше модель?
model_income <-lm(happyScore ~ income_inequality + GDP, data = df)summary(model_income)
Call:
lm(formula = happyScore ~ income_inequality + GDP, data = df)
Residuals:
Min 1Q Median 3Q Max
-2.09360 -0.45110 0.01026 0.54468 1.43782
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.038567 0.416302 7.299 5.17e-11 ***
income_inequality 0.008124 0.008692 0.935 0.352
GDP 2.460162 0.187829 13.098 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.7276 on 108 degrees of freedom
Multiple R-squared: 0.6272, Adjusted R-squared: 0.6203
F-statistic: 90.85 on 2 and 108 DF, p-value: < 2.2e-16
Множественная линейная регрессия
Переменная income_inequality оказалась незначимым предиктором. Возможно, есть смысл включить все возможные переменные в модель?
Проблема мультиколлинеарности во множественной линейной регрессии
Для множественной линейной регрессии очень плохо, когда независимые переменные коррелируют друг с другом. Чтобы оценить, насколько у нас выражена автокорреляция, построим плот корреляций (пакет corrplot, функция corrplot()).