wczytuję dane

data("Salaries", package="carData")

sprawdzam równoliczność

table(Salaries$rank, Salaries$discipline)
##            
##               A   B
##   AsstProf   24  43
##   AssocProf  26  38
##   Prof      131 135
table(Salaries$rank, Salaries$sex)
##            
##             Female Male
##   AsstProf      11   56
##   AssocProf     10   54
##   Prof          18  248
table(Salaries$discipline, Salaries$sex)
##    
##     Female Male
##   A     18  163
##   B     21  195

Grupy nie są równoliczne.

wykresy skrzynkowe

library(ggpubr)
## Warning: pakiet 'ggpubr' został zbudowany w wersji R 4.1.2
## Ładowanie wymaganego pakietu: ggplot2
## Warning: pakiet 'ggplot2' został zbudowany w wersji R 4.1.2
ggboxplot(Salaries, x="rank", y="salary", color="discipline", facet.by="sex")

badanie normalności

library(rstatix)
## Warning: pakiet 'rstatix' został zbudowany w wersji R 4.1.2
## 
## Dołączanie pakietu: 'rstatix'
## Następujący obiekt został zakryty z 'package:stats':
## 
##     filter
Salaries %>% 
  group_by(rank,discipline,sex) %>%
  shapiro_test(salary)
## # A tibble: 12 x 6
##    rank      discipline sex    variable statistic        p
##    <fct>     <fct>      <fct>  <chr>        <dbl>    <dbl>
##  1 AsstProf  A          Female salary       0.870 0.226   
##  2 AsstProf  A          Male   salary       0.941 0.300   
##  3 AsstProf  B          Female salary       0.889 0.354   
##  4 AsstProf  B          Male   salary       0.941 0.0458  
##  5 AssocProf A          Female salary       0.863 0.269   
##  6 AssocProf A          Male   salary       0.878 0.0113  
##  7 AssocProf B          Female salary       0.635 0.00117 
##  8 AssocProf B          Male   salary       0.967 0.416   
##  9 Prof      A          Female salary       0.934 0.549   
## 10 Prof      A          Male   salary       0.952 0.000259
## 11 Prof      B          Female salary       0.974 0.923   
## 12 Prof      B          Male   salary       0.978 0.0435

Zmienna nie rozkłada się normalnie.

usuwam wartości odstające

wartosci.odstajace <- Salaries %>%
  group_by(rank,discipline,sex) %>%
  identify_outliers(salary)
wartosci.odstajace
## # A tibble: 18 x 8
##    rank  discipline sex   yrs.since.phd yrs.service salary is.outlier is.extreme
##    <fct> <fct>      <fct>         <int>       <int>  <int> <lgl>      <lgl>     
##  1 Asst~ A          Fema~             7           6  63100 TRUE       FALSE     
##  2 Asst~ A          Male              3           1  63900 TRUE       FALSE     
##  3 Asst~ A          Male              2           0  85000 TRUE       TRUE      
##  4 Asst~ A          Male              8           4  81035 TRUE       FALSE     
##  5 Asso~ A          Fema~            25          22  62884 TRUE       FALSE     
##  6 Asso~ A          Male             14           8 100102 TRUE       FALSE     
##  7 Asso~ A          Male              9           7  70000 TRUE       FALSE     
##  8 Asso~ A          Male             11           1 104800 TRUE       FALSE     
##  9 Asso~ A          Male             45          39  70700 TRUE       FALSE     
## 10 Asso~ A          Male             10           1 108413 TRUE       FALSE     
## 11 Asso~ A          Male             11           8 104121 TRUE       FALSE     
## 12 Asso~ B          Fema~            14           7 109650 TRUE       TRUE      
## 13 Asso~ B          Fema~            12           9  71065 TRUE       TRUE      
## 14 Asso~ B          Male             13          11 126431 TRUE       FALSE     
## 15 Prof  A          Male             29           7 204000 TRUE       FALSE     
## 16 Prof  A          Male             42          18 194800 TRUE       FALSE     
## 17 Prof  A          Male             43          43 205500 TRUE       FALSE     
## 18 Prof  B          Male             38          38 231545 TRUE       FALSE
Salaries$salary[Salaries$salary%in%wartosci.odstajace$salary] <- NA

Salaries <- na.omit(Salaries)

logarytmuję zmienną ‘salary’

Salaries <- mutate(Salaries,log=log10(salary))

sprawdzam normalność po modyfikacji

Salaries %>%
  group_by(rank,discipline,sex) %>%
  shapiro_test(log) 
## # A tibble: 12 x 6
##    rank      discipline sex    variable statistic      p
##    <fct>     <fct>      <fct>  <chr>        <dbl>  <dbl>
##  1 AsstProf  A          Female log          0.813 0.104 
##  2 AsstProf  A          Male   log          0.952 0.560 
##  3 AsstProf  B          Female log          0.896 0.387 
##  4 AsstProf  B          Male   log          0.931 0.0218
##  5 AssocProf A          Female log          0.978 0.717 
##  6 AssocProf A          Male   log          0.891 0.0587
##  7 AssocProf B          Female log          0.916 0.517 
##  8 AssocProf B          Male   log          0.981 0.840 
##  9 Prof      A          Female log          0.936 0.575 
## 10 Prof      A          Male   log          0.985 0.212 
## 11 Prof      B          Female log          0.976 0.939 
## 12 Prof      B          Male   log          0.986 0.236

Nowa zmienna przyjmuje rozkład normalny.

anova - dla grup nierównolicznych

bez interakcji

anova_test(log~rank+discipline+sex, data=Salaries, type = 3)
## Coefficient covariances computed by hccm()
## ANOVA Table (type III tests)
## 
##       Effect DFn DFd       F        p p<.05      ges
## 1       rank   2 373 192.140 4.39e-58     * 0.507000
## 2 discipline   1 373  57.846 2.33e-13     * 0.134000
## 3        sex   1 373   0.362 5.48e-01       0.000969

z interakcjami

anova_test(log~rank*discipline*sex, data=Salaries, type = 3)
## Coefficient covariances computed by hccm()
## ANOVA Table (type III tests)
## 
##                Effect DFn DFd      F        p p<.05      ges
## 1                rank   2 366 74.804 5.79e-28     * 0.290000
## 2          discipline   1 366 27.566 2.58e-07     * 0.070000
## 3                 sex   1 366  0.270 6.04e-01       0.000736
## 4     rank:discipline   2 366  1.248 2.88e-01       0.007000
## 5            rank:sex   2 366  0.114 8.93e-01       0.000621
## 6      discipline:sex   1 366  0.635 4.26e-01       0.002000
## 7 rank:discipline:sex   2 366  0.315 7.30e-01       0.002000

ancova

anova_test(log~yrs.since.phd*yrs.service+rank*discipline*sex, data=Salaries, type = 3)
## Coefficient covariances computed by hccm()
## ANOVA Table (type III tests)
## 
##                       Effect DFn DFd      F        p p<.05   ges
## 1              yrs.since.phd   1 363  9.974 2.00e-03     * 0.027
## 2                yrs.service   1 363  5.055 2.50e-02     * 0.014
## 3                       rank   2 363 26.136 2.49e-11     * 0.126
## 4                 discipline   1 363 28.508 1.65e-07     * 0.073
## 5                        sex   1 363  0.610 4.35e-01       0.002
## 6  yrs.since.phd:yrs.service   1 363 15.060 1.24e-04     * 0.040
## 7            rank:discipline   2 363  1.490 2.27e-01       0.008
## 8                   rank:sex   2 363  0.227 7.97e-01       0.001
## 9             discipline:sex   1 363  0.445 5.05e-01       0.001
## 10       rank:discipline:sex   2 363  0.524 5.93e-01       0.003

Lata od doktoratu i staż pracy mogą być istotnymi zmiennymi współoddziałującymi na płacę, ponadto występuje między nimi interakcja.

badanie normalności do manovy

Salaries %>%
  group_by(rank) %>%
  shapiro_test(yrs.since.phd)
## # A tibble: 3 x 4
##   rank      variable      statistic            p
##   <fct>     <chr>             <dbl>        <dbl>
## 1 AsstProf  yrs.since.phd     0.933 0.00204     
## 2 AssocProf yrs.since.phd     0.739 0.0000000192
## 3 Prof      yrs.since.phd     0.971 0.0000328
Salaries %>%
  group_by(rank) %>%
  shapiro_test(yrs.service)
## # A tibble: 3 x 4
##   rank      variable    statistic        p
##   <fct>     <chr>           <dbl>    <dbl>
## 1 AsstProf  yrs.service     0.922 6.81e- 4
## 2 AssocProf yrs.service     0.662 6.86e-10
## 3 Prof      yrs.service     0.979 7.24e- 4

Brak normalności rozkładów.