Параметрические тесты: t-тест

Олеся Волченко

11 октября 2022

Что мы уже знаем

Номинальная/ординальная Интервальная/отношений
Номинальная/ординальная Тест хи-квадрат ?
Интервальная/отношений ? ?

Параметрические тесты

такие тесты, которые требуют от переменных некоторого распределения (чаще всего нормального)

Нормальное распределение

image source: https://github.com/allisonhorst/stats-illustrations/blob/master/other-stats-artwork/not_normal.png

Зачем нужен t-test?

Позволяет установить связь между одной числовой переменной и одной бинарной переменной (номинальной переменной, принимающей два значения)

Примеры вопросов, на которые поможет ответить t-тест

Три вида t-теста

Одновыборочный t-тест

One-sample t-test

сравнивает выборочное среднее с теоретическим.

Это может быть актуально, когда мы знаем значение из гос. статистики и хотим понять, отличается ли от него среднее в наших данных.

Нулевая гипотеза:

\[\mu_{0} = \mu_{1} \]

Связанные и несвязанные выборки

Выборки называются несвязанными (независимыми), если процедура отбора наблюдений в одну выборку не связана с процедурой отбора единиц во вторую

В связанной (парной) выборке каждая единица отбора “привязывается” к определенной единице отбора из второй выборки

Пример:

t-тест для несвязанных выборок

Independent (unpaired) samples t-test

сравнивает средние значения в двух группах.

Позволяет ответить на вопрос, значимо ли различаются средние значения в двух группах наблюдений.

Если различаются, то можно сделать вывод, что между группообразющей переменной и числовой переменной (той переменной, для которой рассчитывается среднее) есть связь.

Нулевая гипотеза:

\[\mu_{1} = \mu_{2} \] Среднее значение параметра в группе 1 равно среднему значению параметра в группе 2.

Формула расчета t-значения \[t = \frac{\bar{X_{1}} - \bar{X_{2}}}{\sqrt{\frac{s_{1}^2}{n_{1}}+\frac{s_{2}^2}{n_{2}}}} \]

t-тест для связанных выборок

Paired samples t-test

сравнивает средние значения для двух связанных параметров.

Нулевая гипотеза:

\[\mu_{1} - \mu_{2} = 0 \]

Разница в средних равна 0

Формула расчета t-значения \[t = \frac{M_{d}}{s_{d}/\sqrt{n}} \] где — Md - средняя разность значений, Sd — стандартное отклонение разностей, а n — количество наблюдений

Размер эффекта

Показывает не вероятность ложно отвергнуть нулевую гипотезу (в отличие от p-value), а то, насколько сильная разница существует между двумя группами

Таблица из Cohen (1988):

Cohen’s d interpretation
0.00 < 0.20 Negligible
0.20 < 0.50 Small
0.50 < 0.80 Medium
0.80 or more Large

https://rpsychologist.com/d3/cohend/

Обобщение: что нужно?

T-тест для несвязанных выборок: пол и планируемый возраст выхода на пенсию

library(foreign)
ESS <- read.spss("/Users/olesyavolchenko/Yandex.Disk.localized/datafiles/ESS/ESS5e03_3.sav", use.value.labels=T, to.data.frame=T)

Отберем только тех респондентов, которые живут в России и работают на оплачиваемой работе

summary(ESS$icmnact)
## In paid work      Retired   All others         NA's 
##        24049        14055        14220          134
ESS1sub <- subset(ESS, subset=(cntry=="Russian Federation" & icmnact=="In paid work"))

Посмотрим на переменную “agertr”

summary(ESS1sub$agertr)
##    0    1    2    5    8    9   16   19   20   23   24   25   27   28   29   30 
##    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1 
##   31   32   33   35   36   37   38   39   40   41   42   43   44   45   46   47 
##    0    0    0    0    0    0    0    0    3    0    0    1    0   19    1    0 
##   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63 
##    0    0   88    1    1    3    0  141    0    2    2    0   99    0    0    0 
##   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   80 
##    0    3    1    2    0    0    6    0    0    0    0    2    0    0    0    0 
##   81   82   84   85   86   87   88   90   96   99  100  102  120 NA's 
##    0    0    0    0    0    0    0    0    0    0    0    0    0  959

Строим график

ESS1sub$agertr <- as.numeric(as.character(ESS1sub$agertr))
plot(ESS1sub$agertr ~ ESS1sub$gndr)

Проверим распределение на нормальность

Тест Колмогорова-Смирнова

нулевая гипотеза: нет различий между наблюдаемым распределением и нормальным распределением

ks.test(ESS1sub$agertr[ESS1sub$gndr == "Male"], "pnorm")
## Warning in ks.test.default(ESS1sub$agertr[ESS1sub$gndr == "Male"], "pnorm"): в
## тесте Колмогорова-Смирнова не должно быть повторяющихся значений
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  ESS1sub$agertr[ESS1sub$gndr == "Male"]
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(ESS1sub$agertr[ESS1sub$gndr == "Female"], "pnorm")
## Warning in ks.test.default(ESS1sub$agertr[ESS1sub$gndr == "Female"], "pnorm"): в
## тесте Колмогорова-Смирнова не должно быть повторяющихся значений
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  ESS1sub$agertr[ESS1sub$gndr == "Female"]
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

на практике данный тест используют редко т.к. он очень чувствительный и почти всегда показывает, что данные распределены не нормально.

Тест Шапиро-Уилка

нулевая гипотеза: нет различий между наблюдаемым распределением и нормальным распределением

shapiro.test(ESS1sub$agertr[ESS1sub$gndr == "Male"])
## 
##  Shapiro-Wilk normality test
## 
## data:  ESS1sub$agertr[ESS1sub$gndr == "Male"]
## W = 0.83236, p-value = 1.597e-12
shapiro.test(ESS1sub$agertr[ESS1sub$gndr == "Female"])
## 
##  Shapiro-Wilk normality test
## 
## data:  ESS1sub$agertr[ESS1sub$gndr == "Female"]
## W = 0.87556, p-value = 4.071e-12

График квантиль-квантиль (qq plot)

qqnorm(ESS1sub$agertr[ESS1sub$gndr == "Male"])
qqline(ESS1sub$agertr[ESS1sub$gndr == "Male"], col= 2)

qqnorm(ESS1sub$agertr[ESS1sub$gndr == "Male"])
qqline(ESS1sub$agertr[ESS1sub$gndr == "Male"], col= 2)

График показывает, то где расположены точки на самом деле (ось y), относительно того, где они были бы распределены, если бы распределеные было бы нормальным (ось x)

Если распределение нормально - точки будут расположены вдоль диагональной прямой

Гистограмма

hist(ESS1sub$agertr[ESS1sub$gndr == "Male"])

hist(ESS1sub$agertr[ESS1sub$gndr == "Female"])

Проверим равенство дисперсий

Нулевая гипотеза - дисперсии равны.

bartlett.test(ESS1sub$agertr ~ ESS1sub$gndr)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  ESS1sub$agertr by ESS1sub$gndr
## Bartlett's K-squared = 1.7584, df = 1, p-value = 0.1848
var.test(ESS1sub$agertr ~ ESS1sub$gndr)
## 
##  F test to compare two variances
## 
## data:  ESS1sub$agertr by ESS1sub$gndr
## F = 0.82162, num df = 165, denom df = 209, p-value = 0.1867
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.6165997 1.1003052
## sample estimates:
## ratio of variances 
##          0.8216248

p-value > 0.05, значит нет основания отвергнуть нулевую гипотезу. Дисперсии равны

Проведем формальный тест

t.test(ESS1sub$agertr ~ ESS1sub$gndr, var.equal = T)
## 
##  Two Sample t-test
## 
## data:  ESS1sub$agertr by ESS1sub$gndr
## t = 7.513, df = 374, p-value = 4.299e-13
## alternative hypothesis: true difference in means between group Male and group Female is not equal to 0
## 95 percent confidence interval:
##  2.914562 4.981021
## sample estimates:
##   mean in group Male mean in group Female 
##             57.11446             53.16667

p-value < 0.05, значит можем отвергуть нулевую гипотезу. Средние значения значимо различаются. Средний идеальный возраст выхода на пенсию равен приблизительно 57 годам для мужчин, а для женщин - 53 (и это различие статистически значимо!).

Effect size

library(effsize)
cohen.d(ESS1sub$agertr, ESS1sub$gndr) # ничего не работает т.к. в данных есть пропущенные значения (NA)
## 
## Cohen's d
## 
## d estimate: NA (NA)
## 95 percent confidence interval:
## lower upper 
##    NA    NA
# воспользуемся функцией na.omit(), чтобы отставить только полные наблюдения для двух переменных
ESS12 <- na.omit(ESS1sub[c("agertr", "gndr")])
cohen.d(ESS12$agertr, ESS12$gndr)
## 
## Cohen's d
## 
## d estimate: 0.7802674 (medium)
## 95 percent confidence interval:
##     lower     upper 
## 0.5685276 0.9920071

Размер эффекта - средний.

Пример про happiness gender gap

База данных - 6 волна World Values Survey (доступна здесь http://www.worldvaluessurvey.org/WVSDocumentationWV6.jsp)

library(foreign)
data <- read.spss("/Users/olesyavolchenko/Yandex.Disk.localized/datafiles/WV6_Data_spss_v_2016_01_01.sav", to.data.frame = TRUE)
dim(data)
## [1] 90350   430

Рассчитаем индекс субъективного благополучия

table(data$V23) # Удовлетворенность жизнью
## 
## Completely dissatisfied                       2                       3 
##                    2828                    1985                    3463 
##                       4                       5                       6 
##                    4600                   11331                   10666 
##                       7                       8                       9 
##                   15493                   18213                    9264 
##    Completely satisfied 
##                   11928
table(data$V10) # Счастье
## 
##       Very happy     Rather happy   Not very happy Not at all happy 
##            29430            46092            11482             2600
data$swb <- as.numeric(data$V23)-2.5*as.numeric(data$V10)
hist(data$swb)

Агрегируем данные по полу и стране:

dataaggr <- aggregate(swb ~ V2+V240, data, mean)
dataaggr
##                      V2   V240         swb
## 1               Algeria   Male  1.21000000
## 2            Azerbaijan   Male  2.15668663
## 3             Argentina   Male  2.94432773
## 4             Australia   Male  2.91860465
## 5               Bahrain   Male  1.46330275
## 6               Armenia   Male  0.55027174
## 7                Brazil   Male  3.49730700
## 8               Belarus   Male  0.35423197
## 9                 Chile   Male  2.78234086
## 10                China   Male  1.82041933
## 11               Taiwan   Male  2.05862069
## 12             Colombia   Male  4.65220294
## 13               Cyprus   Male  2.53771552
## 14              Ecuador   Male  4.17611684
## 15              Estonia   Male  0.81268657
## 16              Georgia   Male -0.23550725
## 17            Palestine   Male -0.01659751
## 18              Germany   Male  2.63618290
## 19                Ghana   Male  2.27500000
## 20            Hong Kong   Male  1.93818985
## 21                India   Male  1.64933867
## 22                 Iraq   Male  0.30129241
## 23                Japan   Male  2.12522361
## 24           Kazakhstan   Male  2.74747475
## 25               Jordan   Male  1.37166667
## 26          South Korea   Male  1.50765306
## 27               Kuwait   Male  3.35335019
## 28           Kyrgyzstan   Male  2.74005487
## 29              Lebanon   Male  1.37972509
## 30                Libya   Male  2.22680412
## 31             Malaysia   Male  3.43263473
## 32               Mexico   Male  5.00200200
## 33              Morocco   Male  0.82538330
## 34          Netherlands   Male  3.10195853
## 35          New Zealand   Male  2.84795322
## 36              Nigeria   Male  2.15765766
## 37             Pakistan   Male  3.16264090
## 38                 Peru   Male  2.46926910
## 39          Philippines   Male  3.34500000
## 40               Poland   Male  2.47911833
## 41                Qatar   Male  4.48975410
## 42              Romania   Male  1.15506329
## 43               Russia   Male  0.97969783
## 44               Rwanda   Male  2.25363276
## 45            Singapore   Male  2.44538288
## 46             Slovenia   Male  2.20112360
## 47         South Africa   Male  2.05821918
## 48             Zimbabwe   Male  1.53840580
## 49                Spain   Male  1.78031634
## 50               Sweden   Male  3.43045775
## 51             Thailand   Male  3.42105263
## 52  Trinidad and Tobago   Male  3.13444444
## 53              Tunisia   Male  0.35589172
## 54               Turkey   Male  2.67571059
## 55              Ukraine   Male  0.65289982
## 56                Egypt   Male -2.98979592
## 57        United States   Male  3.00932836
## 58              Uruguay   Male  3.15301724
## 59           Uzbekistan   Male  4.48702422
## 60                Yemen   Male -0.22597137
## 61              Algeria Female  1.24777975
## 62           Azerbaijan Female  1.61377246
## 63            Argentina Female  2.92041199
## 64            Australia Female  3.31762546
## 65              Bahrain Female  1.55483271
## 66              Armenia Female  0.38819444
## 67               Brazil Female  3.49945946
## 68              Belarus Female  0.20951792
## 69                Chile Female  2.20983936
## 70                China Female  1.98239437
## 71               Taiwan Female  2.55476190
## 72             Colombia Female  4.51377953
## 73               Cyprus Female  1.95161290
## 74              Ecuador Female  4.16129032
## 75              Estonia Female  0.97238896
## 76              Georgia Female  0.37962963
## 77            Palestine Female  0.25392157
## 78              Germany Female  2.61301370
## 79                Ghana Female  2.26683938
## 80            Hong Kong Female  2.29558011
## 81                India Female  1.51586294
## 82                 Iraq Female  0.26779359
## 83                Japan Female  2.86245819
## 84           Kazakhstan Female  2.76214128
## 85               Jordan Female  1.94833333
## 86          South Korea Female  1.91583333
## 87               Kuwait Female  2.63403263
## 88           Kyrgyzstan Female  2.77338603
## 89              Lebanon Female  1.35726073
## 90                Libya Female  3.44547225
## 91             Malaysia Female  3.46677215
## 92               Mexico Female  5.08791209
## 93              Morocco Female  0.75384615
## 94          Netherlands Female  3.14955135
## 95          New Zealand Female  3.80694143
## 96              Nigeria Female  2.09127440
## 97             Pakistan Female  3.02599653
## 98                 Peru Female  2.35678392
## 99          Philippines Female  3.25416667
## 100              Poland Female  2.47307692
## 101               Qatar Female  4.26444834
## 102             Romania Female  0.99882353
## 103              Russia Female  0.83295195
## 104              Rwanda Female  2.18181818
## 105           Singapore Female  2.96722068
## 106            Slovenia Female  2.52809917
## 107        South Africa Female  1.92800228
## 108            Zimbabwe Female  1.65185185
## 109               Spain Female  1.80033557
## 110              Sweden Female  3.65797788
## 111            Thailand Female  3.23465704
## 112 Trinidad and Tobago Female  3.80109489
## 113             Tunisia Female  0.38908451
## 114              Turkey Female  2.79085366
## 115             Ukraine Female  0.43232205
## 116               Egypt Female -2.47483059
## 117       United States Female  3.19385965
## 118             Uruguay Female  2.98946360
## 119          Uzbekistan Female  4.37513751
## 120               Yemen Female  1.31955645
dataaggr1 <- data.frame(country = dataaggr$V2[1:60], swb.males = dataaggr$swb[1:60], swb.females = dataaggr$swb[61:120]) 
dataaggr1
##                country   swb.males swb.females
## 1              Algeria  1.21000000   1.2477798
## 2           Azerbaijan  2.15668663   1.6137725
## 3            Argentina  2.94432773   2.9204120
## 4            Australia  2.91860465   3.3176255
## 5              Bahrain  1.46330275   1.5548327
## 6              Armenia  0.55027174   0.3881944
## 7               Brazil  3.49730700   3.4994595
## 8              Belarus  0.35423197   0.2095179
## 9                Chile  2.78234086   2.2098394
## 10               China  1.82041933   1.9823944
## 11              Taiwan  2.05862069   2.5547619
## 12            Colombia  4.65220294   4.5137795
## 13              Cyprus  2.53771552   1.9516129
## 14             Ecuador  4.17611684   4.1612903
## 15             Estonia  0.81268657   0.9723890
## 16             Georgia -0.23550725   0.3796296
## 17           Palestine -0.01659751   0.2539216
## 18             Germany  2.63618290   2.6130137
## 19               Ghana  2.27500000   2.2668394
## 20           Hong Kong  1.93818985   2.2955801
## 21               India  1.64933867   1.5158629
## 22                Iraq  0.30129241   0.2677936
## 23               Japan  2.12522361   2.8624582
## 24          Kazakhstan  2.74747475   2.7621413
## 25              Jordan  1.37166667   1.9483333
## 26         South Korea  1.50765306   1.9158333
## 27              Kuwait  3.35335019   2.6340326
## 28          Kyrgyzstan  2.74005487   2.7733860
## 29             Lebanon  1.37972509   1.3572607
## 30               Libya  2.22680412   3.4454722
## 31            Malaysia  3.43263473   3.4667722
## 32              Mexico  5.00200200   5.0879121
## 33             Morocco  0.82538330   0.7538462
## 34         Netherlands  3.10195853   3.1495513
## 35         New Zealand  2.84795322   3.8069414
## 36             Nigeria  2.15765766   2.0912744
## 37            Pakistan  3.16264090   3.0259965
## 38                Peru  2.46926910   2.3567839
## 39         Philippines  3.34500000   3.2541667
## 40              Poland  2.47911833   2.4730769
## 41               Qatar  4.48975410   4.2644483
## 42             Romania  1.15506329   0.9988235
## 43              Russia  0.97969783   0.8329519
## 44              Rwanda  2.25363276   2.1818182
## 45           Singapore  2.44538288   2.9672207
## 46            Slovenia  2.20112360   2.5280992
## 47        South Africa  2.05821918   1.9280023
## 48            Zimbabwe  1.53840580   1.6518519
## 49               Spain  1.78031634   1.8003356
## 50              Sweden  3.43045775   3.6579779
## 51            Thailand  3.42105263   3.2346570
## 52 Trinidad and Tobago  3.13444444   3.8010949
## 53             Tunisia  0.35589172   0.3890845
## 54              Turkey  2.67571059   2.7908537
## 55             Ukraine  0.65289982   0.4323221
## 56               Egypt -2.98979592  -2.4748306
## 57       United States  3.00932836   3.1938596
## 58             Uruguay  3.15301724   2.9894636
## 59          Uzbekistan  4.48702422   4.3751375
## 60               Yemen -0.22597137   1.3195565

Почти похоже на нормальное распределение

hist(dataaggr1$swb.females - dataaggr1$swb.males)

Делаем тест!

t.test(dataaggr1$swb.males, dataaggr1$swb.females, paired = T)
## 
##  Paired t-test
## 
## data:  dataaggr1$swb.males and dataaggr1$swb.females
## t = -1.9292, df = 59, p-value = 0.05852
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -0.202170104  0.003693091
## sample estimates:
## mean difference 
##     -0.09923851
mean(dataaggr1$swb.males)
## [1] 2.146066
mean(dataaggr1$swb.females)
## [1] 2.245305

P-value > 0.05, значит нет основания отвергнуть нулевую гипотезу, средние не различаются значимо.

t.test(data$swb ~ data$V240, paired = F) # Попробуем провести аналогичный тест, но на неагрегированной базе данных 
## 
##  Welch Two Sample t-test
## 
## data:  data$swb by data$V240
## t = -1.9008, df = 88682, p-value = 0.05733
## alternative hypothesis: true difference in means between group Male and group Female is not equal to 0
## 95 percent confidence interval:
##  -0.091543470  0.001402896
## sample estimates:
##   mean in group Male mean in group Female 
##             2.172569             2.217640

Effect size

cohen.d(dataaggr1$swb.males, dataaggr1$swb.females, paired = T)
## 
## Cohen's d
## 
## d estimate: -0.07201708 (negligible)
## 95 percent confidence interval:
##        lower        upper 
## -0.146036412  0.002002259

Что делать если распределение числовой переменной далеко от нормального?

Использовать непараметрические тесты

Нулевая гипотеза для теста Вилкоксона: различия в средних нет

wilcox.test(ESS1sub$agertr ~ ESS1sub$gndr) # несвязанные выборки
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  ESS1sub$agertr by ESS1sub$gndr
## W = 25411, p-value = 1.619e-15
## alternative hypothesis: true location shift is not equal to 0
wilcox.test(dataaggr1$swb.males, dataaggr1$swb.females, paired = TRUE) #связанные выборки
## 
##  Wilcoxon signed rank test with continuity correction
## 
## data:  dataaggr1$swb.males and dataaggr1$swb.females
## V = 763, p-value = 0.2647
## alternative hypothesis: true location shift is not equal to 0

Иллюстративное обобщение

https://twitter.com/allison_horst/status/1216411185240690688?s=20

Artwork by @allison_horst

Про контрольную

Самый полезный пакет при выполнении домашней или контрольной работы

library(praise)
praise()
## [1] "You are breathtaking!"
praise()
## [1] "You are cat's meow!"
praise()
## [1] "You are riveting!"