8 Varianciaelemzés

8.1 Egyszempontos varianciaelemzés

Az egyszempontos varianciaelemzés (independent one-way ANOVA) \(k\) független változó várható értékének egyezőségét vizsgálja. Az \(X_1, X_2, \dots, X_k\) változók mindegyike normális eloszlású és azonos \(\sigma\) szórással rendelkezik.

Null- és ellenhipotézisek:

  • Nullhipotézis:
    • \(H_0:\mu_1=\mu_2= \dots =\mu_k\)
  • Ellenhipotézis:
    • \(H_1:\) nem mindegyik várható érték egyenlő egymással

Alkalmazási feltételek:

  • a \(X_1, X_2, \dots, X_k\) változók normális eloszlásúak
  • a változók szórása megegyezik

Próbastatisztika:

A nullhipotézis igaz volta esetén az \(F\) próbastatisztika értéke \(F(k-1, N-k)\) eloszlást követ. A \(k\) a változók száma, \(N\) az összmintaelemszám:

\[F=\frac{\sum_{i=1}^kn_i(\bar{X_i}-\bar{X})^2/(k-1)}{\sum_{i=1}^k\sum_{j=1}^{n_i}(X_{i,j}-\bar{X_i})^2/(N-k)} \sim F(k-1, N-k)\]

8.1.1 Példa: az alkohol hatása a vezetési képességekre

Egy kísérletben 36 személy bevonásával az alkohol hatását vizsgálták a vezetési képességekre. A személyeket véletlenszerűen három csoportba sorolták, voltak akik alkoholmentes, alacsony alkoholtartalmú és a magas alkoholtartalmú italt fogyasztottak. Az alkoholmentes ital ugyanúgy nézett ki, és az íze is pontosan ugyanolyan volt, mint a többi italnak. A fogyasztott ital mennyissége a résztvevő testsúlya alapján lett meghatározva. A ital elfogyasztása után fél órával, a résztvevők 10 percig egy szimulátorban vezettek, amely nyilvántartotta az elkövetett hibák számát. Vizsgáljuk meg, hogy az elfogyasztott alkohol mennyisége milyen hatással van az elkövetett hibák számára!
Forrás: (Dancey and Reidy 2011, 303)

Adatok beolvasása. Olvassuk be az adatokat egy d nevű adattáblába. Az adatok széles szerkezetben állnak rendelkezésre, mivel mindhárom csoportban 12 személyt vizsgáltak. A széles adattáblát a reshape2 csomag melt() függvényével alakítjuk át a kívánt hosszú formátumba.

d <- read.table(file = textConnection("
placebo alacsony.alkohol magas.alkohol
5 5 8
10 7 10
7 9 8
3 8 9
5 2 11
7 5 15
11 6 7
2 6 11
3 4 8
5 4 8
6 8 17
6 10 11
"), header=T, sep="")
library(reshape2)
d.l <- melt(d, variable.name = "csoport", value.name = "hibak.szama", id.vars = NULL) # szélesből hosszú átalakítás
str(d.l)                       # az adattábla szerkezete
## 'data.frame':    36 obs. of  2 variables:
##  $ csoport    : Factor w/ 3 levels "placebo","alacsony.alkohol",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ hibak.szama: int  5 10 7 3 5 7 11 2 3 5 ...
d.l                            # a beolvasott adattábla
##             csoport hibak.szama
## 1           placebo           5
## 2           placebo          10
## 3           placebo           7
## 4           placebo           3
## 5           placebo           5
## 6           placebo           7
## 7           placebo          11
## 8           placebo           2
## 9           placebo           3
## 10          placebo           5
## 11          placebo           6
## 12          placebo           6
## 13 alacsony.alkohol           5
## 14 alacsony.alkohol           7
## 15 alacsony.alkohol           9
## 16 alacsony.alkohol           8
## 17 alacsony.alkohol           2
## 18 alacsony.alkohol           5
## 19 alacsony.alkohol           6
## 20 alacsony.alkohol           6
## 21 alacsony.alkohol           4
## 22 alacsony.alkohol           4
## 23 alacsony.alkohol           8
## 24 alacsony.alkohol          10
## 25    magas.alkohol           8
## 26    magas.alkohol          10
## 27    magas.alkohol           8
## 28    magas.alkohol           9
## 29    magas.alkohol          11
## 30    magas.alkohol          15
## 31    magas.alkohol           7
## 32    magas.alkohol          11
## 33    magas.alkohol           8
## 34    magas.alkohol           8
## 35    magas.alkohol          17
## 36    magas.alkohol          11

Leíróstatisztikai mutatók. Első lépésként vizsgáljuk meg, hogy a legfontosabb leíró statisztikai mutatók a három csoportban hogyan alakulnak. Írassuk ki a 95%-os konfidenciaintervallum határait a csoportátlagokra.

library(psych)
psych::describeBy(x = d.l$hibak.szama, group = d.l$csoport, mat = T, digits = 3)
##    item           group1 vars  n   mean    sd median trimmed   mad min max
## 11    1          placebo    1 12  5.833 2.691    5.5     5.7 2.224   2  11
## 12    2 alacsony.alkohol    1 12  6.167 2.329    6.0     6.2 2.965   2  10
## 13    3    magas.alkohol    1 12 10.250 3.049    9.5     9.9 2.224   7  17
##    range   skew kurtosis    se
## 11     9  0.470   -0.833 0.777
## 12     8 -0.026   -1.152 0.672
## 13    10  0.982   -0.297 0.880
library(DescTools); options(scipen = 8)
Desc(hibak.szama ~ csoport, data = d.l, digits = 3)
## ------------------------------------------------------------------------- 
## hibak.szama ~ csoport
## 
## Summary: 
## n pairs: 36, valid: 36 (100.0%), missings: 0 (0.0%), groups: 3
## 
##                                                             
##                  placebo  alacsony.alkohol     magas.alkohol
## mean               5.833             6.167            10.250
## median             5.500             6.000             9.500
## sd                 2.691             2.329             3.049
## IQR                2.500             3.250             3.000
## n                     12                12                12
## np               33.333%           33.333%           33.333%
## NAs                    0                 0                 0
## 0s                     0                 0                 0
## 
## Kruskal-Wallis rank sum test:
##   Kruskal-Wallis chi-squared = 13.77, df = 2, p-value = 0.001023
library(DescTools)
aggregate(d.l$hibak.szama, list(d.l$csoport), MeanCI, conf.level = 0.95) # a 95%-os konfidenciaintervallum a csoportátlagokra
##            Group.1    x.mean  x.lwr.ci  x.upr.ci
## 1          placebo  5.833333  4.123442  7.543225
## 2 alacsony.alkohol  6.166667  4.686890  7.646443
## 3    magas.alkohol 10.250000  8.312856 12.187144

Grafikus vizsgálatok. Az egyszempontos varianciaelemzéshez kapcsolódó első grafikus megjelenítés négy ábra megjelenítését teszi lehetővé. A PASWR2 csomag oneway.plots() függvénye egydimenziós pontdiagramot, két dobozdiagramot, és egy átlagdiagramot jelenít meg.

library(PASWR2)
oneway.plots(Y = d.l$hibak.szama, fac1 = d.l$csoport)

A yarrr csomag pirateplot() függvénye egyesíti a egydimenziós pontdiagram, a simított hisztogram és a csoportátlagokat reprezentáló oszlopdiagramok megjelenítését.

library(yarrr)
pirateplot(formula = hibak.szama ~ csoport, data = d.l, hdi.o = 0, line.o = 0, theme.o = 1, pal = "google")

A gplots csomag plotmeans() függvényével átlagábrát hozhatunk létre a 95%-os konfidenciaintervallumokkal.

library(gplots)
plotmeans(formula = hibak.szama ~ csoport, data=d.l, xlab="Csoport", ylab="Hibák száma", p = 0.95)

A fenti átlagábrát ggplot2 csomag segítségével is létrehozhatjuk.

library(ggplot2)
pic <- ggplot(data=d.l, aes(x=csoport, y=hibak.szama)) + 
  stat_summary(fun.data=mean_cl_normal, geom="line", size=1, aes(group=1)) +
  stat_summary(fun.data=mean_cl_normal, geom="errorbar", size=1, width=0.1) + 
  stat_summary(fun.y=mean, geom="point", size=4, shape=21, fill="white") +  
  coord_cartesian(ylim = c(0, 16)) + theme_bw() + labs(x="Csoport", y="Hibák száma")
pic

Egyszempontos varianciaelemzés végrehajtása. Egyszempontos varianciaelemzés az aov() függvénnyel hajtható végre. A formula= argumentum a hibak.szama~csoport modell objektumot kapja értékül, ahol a függő változó a hibak.szama numerikus változó, a független változó a csoport faktor. A szokásos ANOVA táblázatot a summary() függvénnyel kapjuk meg.

aov.d <- aov(formula = hibak.szama ~ csoport, data = d.l) # egyszempontos varianciaelemzés
summary(aov.d)                                            # ANOVA táblázat kiírása
##             Df Sum Sq Mean Sq F value   Pr(>F)
## csoport      2  145.2   72.58   9.915 0.000425
## Residuals   33  241.6    7.32

Az egyszempontos varianciaelemzés alapján azt mondhatjuk, hogy az alkoholfogyasztás különböző szintjein szignifikánsan eltér a hibázások átlagos száma, tehát az alkoholfogyasztás és a vezetési képességek kapcsolatban vannak (\(F(2,33)=9,915; p=0,0004\)).

Utóelemzések. Az ellenhipotézis teljesülése után végezzünk utóvizsgálatot.

Kezdjük a Bonferroni-féle páros összehasonlításokkal, amelyek a \(p\) értékek korrekciójával csökkentik az elsőfajú hibát. A pairwise.t.test() függvényben a p.adjust.method= argumentummal tudjuk beállítani a korrekció módját: Bonferroni-féle korrekció (nem szekvenciális Bonferroni) a p.adjust.method="bonferroni" argumentummal, Holm-féle korrekció (szekvenciális Bonferroni) a p.adjust.method="holm" argumentummal. Az összehasonlítások során használhatunk egy közös szórást (pool.sd=T) vagy páronként eltérő szórásokat (pool.sd=F).

## Páros összehasonlítások - Bonferroni
pairwise.t.test(x = d.l$hibak.szama, g = d.l$csoport, p.adjust.method = "bonferroni", pool.sd = F)
## 
##  Pairwise comparisons using t tests with non-pooled SD 
## 
## data:  d.l$hibak.szama and d.l$csoport 
## 
##                  placebo alacsony.alkohol
## alacsony.alkohol 1.0000  -               
## magas.alkohol    0.0033  0.0042          
## 
## P value adjustment method: bonferroni
## Páros összehasonlítások - Holm
pairwise.t.test(x = d.l$hibak.szama, g = d.l$csoport, p.adjust.method = "holm", pool.sd = F)
## 
##  Pairwise comparisons using t tests with non-pooled SD 
## 
## data:  d.l$hibak.szama and d.l$csoport 
## 
##                  placebo alacsony.alkohol
## alacsony.alkohol 0.7487  -               
## magas.alkohol    0.0033  0.0033          
## 
## P value adjustment method: holm

A fenti két outputból az utóbbi, kevésbé konzervatív szekvenciális Bonferroni próba eredményét értékeljük. A szekvenciális Bonferroni próba eredménye alapján azt mondhatjuk, hogy szignifikáns eltérés van a hibák számában a placebó és a magas alkohol csoportok, valamint az alacsony alkohol és magas alkohol csoportok között (mindkét esetben \(p=0,0033\)).

A páronkénti összehasonlításokat Scheffe-próba segítségével is elvégezhetjük. Használjuk a DescTools csomag ScheffeTest() függvényét.

library(DescTools)
ScheffeTest(x = d.l$hibak.szama, g = d.l$csoport, conf.level = 0.95)  # Scheffe-próba
## 
##   Posthoc multiple comparisons of means : Scheffe Test 
##     95% family-wise confidence level
## 
## $g
##                                     diff    lwr.ci   upr.ci   pval    
## alacsony.alkohol-placebo       0.3333333 -2.497916 3.164583 0.9555    
## magas.alkohol-placebo          4.4166667  1.585417 7.247916 0.0015 ** 
## magas.alkohol-alacsony.alkohol 4.0833333  1.252084 6.914583 0.0033 ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

A Scheffe-próba eredménye alapján azt mondhatjuk, hogy szignifikáns eltérés van a hibák számában a placebó és a magas alkohol csoportok, valamint az alacsony alkohol és magas alkohol csoportok között (mindkét esetben \(p<0,0034\)).

A Tukey-próbával szintén össze tudunk hasonlítani minden csoportot minden egyéb csoporttal. A próba végrehajtására használhatjuk a multcomp csomag glht() függvényét. A model= argumentumban az egyszempontos varianciaelemzés modellobjektumát kell megadnunk, a linfct=mcp(csoport = "Tukey") argumentumban a független változó (csoport faktor) és a "Tukey" konstans megadására kell figyelnünk.

library(multcomp)
glht.1 <- glht(model = aov(hibak.szama ~ csoport, data = d.l), linfct = mcp(csoport = "Tukey")) # Tukey-próba
summary(glht.1)                  # a Tukey-próba eredménye
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## 
## Fit: aov(formula = hibak.szama ~ csoport, data = d.l)
## 
## Linear Hypotheses:
##                                       Estimate Std. Error t value Pr(>|t|)
## alacsony.alkohol - placebo == 0         0.3333     1.1046   0.302  0.95112
## magas.alkohol - placebo == 0            4.4167     1.1046   3.998  0.00095
## magas.alkohol - alacsony.alkohol == 0   4.0833     1.1046   3.697  0.00217
## (Adjusted p values reported -- single-step method)
confint(glht.1, level = 0.95)    # 95%-os konfidenciaintervallumok 
## 
##   Simultaneous Confidence Intervals
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## 
## Fit: aov(formula = hibak.szama ~ csoport, data = d.l)
## 
## Quantile = 2.4548
## 95% family-wise confidence level
##  
## 
## Linear Hypotheses:
##                                       Estimate lwr     upr    
## alacsony.alkohol - placebo == 0        0.3333  -2.3782  3.0449
## magas.alkohol - placebo == 0           4.4167   1.7051  7.1282
## magas.alkohol - alacsony.alkohol == 0  4.0833   1.3718  6.7949
par(mar=c(5.1, 11.1, 4.1, 2.1)); plot(glht.1)  # 95%-os konfidenciaintervallumok ábrázolása

A Tukey-próba eredménye alapján azt mondhatjuk, hogy szignifikáns eltérés van a hibák számában a placebó és a magas alkohol csoportok, valamint az alacsony alkohol és magas alkohol csoportok között (mindkét esetben \(p<0,0023\)).

A Dunnett-próba egy referencia csoport és a többi csoport összehasonlítását végzi el. A referencia csoport a független változó (most csoport faktor) első szintje lesz. A glht függvényben a "Dunnett" konstanst kell használnunk.

library(multcomp)
glht.1 <- glht(model = aov(hibak.szama ~ csoport, data = d.l), linfct = mcp(csoport = "Dunnett")) # Dunnett próba
summary(glht.1)                  # a Tukey-próba eredménye
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Multiple Comparisons of Means: Dunnett Contrasts
## 
## 
## Fit: aov(formula = hibak.szama ~ csoport, data = d.l)
## 
## Linear Hypotheses:
##                                 Estimate Std. Error t value Pr(>|t|)
## alacsony.alkohol - placebo == 0   0.3333     1.1046   0.302 0.935827
## magas.alkohol - placebo == 0      4.4167     1.1046   3.998 0.000658
## (Adjusted p values reported -- single-step method)
confint(glht.1, level = 0.95)    # 95%-os konfidenciaintervallumok 
## 
##   Simultaneous Confidence Intervals
## 
## Multiple Comparisons of Means: Dunnett Contrasts
## 
## 
## Fit: aov(formula = hibak.szama ~ csoport, data = d.l)
## 
## Quantile = 2.3106
## 95% family-wise confidence level
##  
## 
## Linear Hypotheses:
##                                 Estimate lwr     upr    
## alacsony.alkohol - placebo == 0  0.3333  -2.2189  2.8856
## magas.alkohol - placebo == 0     4.4167   1.8644  6.9689
par(mar=c(5.1, 11.1, 4.1, 2.1)); plot(glht.1)  # 95%-os konfidenciaintervallumok ábrázolása

A Dunett-próba eredménye alapján azt mondhatjuk, hogy a placebó csoport csak a magas alkohol csoporttól tér el szignifikánsan (\(p<0,0007\)).

Tetszőleges két csoportot, vagy csoportok halmazát összehasonlíthatjuk kontrasztok segítségével. Az rbind() segítségével elkészítjük a kontraxmátrixot, amit a glht() függvényben kell megadnunk.

# kontraszt mátrix elkészítése
contr <- rbind("placebo ---- alkohol átlagosan" = c(2, -1, -1),
               "placebo ---- alacsony alkohol" = c(1, -1, 0), 
               "placebo ---- magas alkohol" = c(1, 0, -1))          
library(multcomp)
glht.1 <- glht(model = aov(hibak.szama ~ csoport, data = d.l), linfct = mcp(csoport = contr)) # kontraszt vizsgálat
summary(glht.1)                  # kontraszt vizsgálat eredménye
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Multiple Comparisons of Means: User-defined Contrasts
## 
## 
## Fit: aov(formula = hibak.szama ~ csoport, data = d.l)
## 
## Linear Hypotheses:
##                                     Estimate Std. Error t value Pr(>|t|)
## placebo ---- alkohol átlagosan == 0  -4.7500     1.9132  -2.483   0.0368
## placebo ---- alacsony alkohol == 0   -0.3333     1.1046  -0.302   0.9370
## placebo ---- magas alkohol == 0      -4.4167     1.1046  -3.998   <0.001
## (Adjusted p values reported -- single-step method)
confint(glht.1, level = 0.95)    # 95%-os konfidenciaintervallumok 
## 
##   Simultaneous Confidence Intervals
## 
## Multiple Comparisons of Means: User-defined Contrasts
## 
## 
## Fit: aov(formula = hibak.szama ~ csoport, data = d.l)
## 
## Quantile = 2.344
## 95% family-wise confidence level
##  
## 
## Linear Hypotheses:
##                                     Estimate lwr     upr    
## placebo ---- alkohol átlagosan == 0 -4.7500  -9.2346 -0.2654
## placebo ---- alacsony alkohol == 0  -0.3333  -2.9225  2.2559
## placebo ---- magas alkohol == 0     -4.4167  -7.0059 -1.8275
par(mar=c(5.1, 11.1, 4.1, 2.1)); plot(glht.1)  # 95%-os konfidenciaintervallumok ábrázolása

A fenti output három kontraszt vizsgálatának az eredményét tartalmazza. A placebó és az átlagos alkoholmérték összehasonlítása szignifikáns eredményt mutatat (\(p=0,0369\)), csakúgy, mint a placebó és a magas alkohol csoport (\(p<0,001\)).

Alkalmazási feltételek ellenőrzése. Először ellenőrizzük a szóráshomogenitási feltételt.

library(car)
leveneTest(y = hibak.szama ~ csoport, data = d.l, center = mean) # Levene-próba
## Levene's Test for Homogeneity of Variance (center = mean)
##       Df F value Pr(>F)
## group  2  0.2149 0.8078
##       33
bartlett.test(formula = hibak.szama ~ csoport, data = d.l)       # Bartlett-próba
## 
##  Bartlett test of homogeneity of variances
## 
## data:  hibak.szama by csoport
## Bartlett's K-squared = 0.75872, df = 2, p-value = 0.6843

A Levene-próba (\(F(2,33)=0,2148;p=0,8078\)) és a Bartlett-próba (\(\chi^2=0,7587;p=0,6843\)) is támogatja a szóráshomogenitási feltételt.

A normalitást ellenőrizzük a Shapiro–Wilk-próbával!

by(d.l$hibak.szama, d.l$csoport, shapiro.test)      # Shapiro-Wilk-próba a három csoportban
## d.l$csoport: placebo
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.93564, p-value = 0.4437
## 
## -------------------------------------------------------- 
## d.l$csoport: alacsony.alkohol
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.97876, p-value = 0.9782
## 
## -------------------------------------------------------- 
## d.l$csoport: magas.alkohol
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.84408, p-value = 0.03105
# library(PASWR2)
# checking.plots(aov.d)

A Shapiro–Wilk próba a placebó (\(p=0,4437\)) és az alacsony alkohol csoportban (\(p=0,9782\)) a normalitást támogatja, míg a magas alkohol csoportban a normalitási feltétel sérül (\(p=0,0311\)).

A hatás mértéke.

\(\eta^2\)

\(\omega^2\)

Alternatívák egyszempontos varianciaelemzésre. Egyszempontos varianciaelemzést a lessR csomag ANOVA() függvényével és a userfriendlyscience csomag oneway() függvényével is végrehajthatunk.

library(lessR)
ANOVA(my.formula = hibak.szama ~ csoport, data = d.l)

##   BACKGROUND
## 
## Response Variable: hibak.szama 
##  
## Factor Variable: csoport 
##   Levels: placebo alacsony.alkohol magas.alkohol 
##  
## Number of cases (rows) of data:  36 
## Number of cases retained for analysis:  36 
## 
## 
##   DESCRIPTIVE STATISTICS 
## 
##                    n    mean     sd    min     max 
## placebo           12    5.83   2.69   2.00   11.00 
## alacsony.alkohol  12    6.17   2.33   2.00   10.00 
## magas.alkohol     12   10.25   3.05   7.00   17.00 
##  
## Grand Mean: 7.417 
## 
## 
##   BASIC ANALYSIS
## 
##                df    Sum Sq   Mean Sq   F-value   p-value 
## csoport         2    145.17     72.58      9.91    0.0004 
## Residuals      33    241.58      7.32 
## 
## 
## R Squared: 0.38 
## R Sq Adjusted: 0.34 
## Omega Squared: 0.33 
##  
## Cohen's f: 0.70 
## 
## 
## Family-wise Confidence Level: 0.95 
## ------------------------------------------------------ 
##                                  diff   lwr  upr p adj 
##         alacsony.alkohol-placebo 0.33 -2.38 3.04  0.95 
##            magas.alkohol-placebo 4.42  1.71 7.13  0.00 
##   magas.alkohol-alacsony.alkohol 4.08  1.37 6.79  0.00 
## 
## 
##   RESIDUALS
## 
## Fitted Values, Residuals, Standardized Residuals 
##    [sorted by Standardized Residuals, ignoring + or - sign] 
##    [res.rows = 20, out of 36 cases (rows) of data, or res.rows="all"] 
## --------------------------------------------------------- 
##               csoport hibak.szama fitted residual z-resid 
##   35    magas.alkohol          17  10.25     6.75    2.61 
##    7          placebo          11   5.83     5.17    1.99 
##   30    magas.alkohol          15  10.25     4.75    1.83 
##   17 alacsony.alkohol           2   6.17    -4.17   -1.61 
##    2          placebo          10   5.83     4.17    1.61 
##    8          placebo           2   5.83    -3.83   -1.48 
##   24 alacsony.alkohol          10   6.17     3.83    1.48 
##   31    magas.alkohol           7  10.25    -3.25   -1.25 
##    4          placebo           3   5.83    -2.83   -1.09 
##    9          placebo           3   5.83    -2.83   -1.09 
##   15 alacsony.alkohol           9   6.17     2.83    1.09 
##   25    magas.alkohol           8  10.25    -2.25   -0.87 
##   27    magas.alkohol           8  10.25    -2.25   -0.87 
##   33    magas.alkohol           8  10.25    -2.25   -0.87 
##   34    magas.alkohol           8  10.25    -2.25   -0.87 
##   21 alacsony.alkohol           4   6.17    -2.17   -0.84 
##   22 alacsony.alkohol           4   6.17    -2.17   -0.84 
##   16 alacsony.alkohol           8   6.17     1.83    0.71 
##   23 alacsony.alkohol           8   6.17     1.83    0.71 
##   28    magas.alkohol           9  10.25    -1.25   -0.48 
## 
## 
## ---------------------------------------- 
## Plot 1: Scatterplot with Cell Means 
## Plot 2: 95% family-wise confidence level 
## ----------------------------------------
library(userfriendlyscience)
oneway(y = d.l$hibak.szama, x = d.l$csoport, levene = T, plot = T, posthoc = "games-howell")

## ### Oneway Anova for y=hibak.szama and x=csoport (groups: placebo, alacsony.alkohol, magas.alkohol)
## 
## Eta Squared: 95% CI = [0.14; 0.52], point estimate = 0.38
## 
##                                     SS Df    MS    F     p
## Between groups (error + effect) 145.17  2 72.58 9.91 <.001
## Within groups (error only)      241.58 33  7.32           
## 
## ### Levene's test:
## 
## Levene's Test for Homogeneity of Variance (center = mean)
##       Df F value Pr(>F)
## group  2  0.2149 0.8078
##       33               
## 
## ### Post hoc test: games-howell
## 
##                                   t    df    p
## placebo:alacsony.alkohol       0.32 21.56 .944
## placebo:magas.alkohol          3.76 21.67 .003
## alacsony.alkohol:magas.alkohol 3.69 20.58 .004

8.2 Összetartozó mintás egyszempontos varianciaelemzés

Az összetartozó mintás egyszempontos varianciaelemzés (repeated-measures one-way ANOVA) tekinthető a páros t-próba általánosításának, amikor kettőnél több alkalomra vagy időpontra vonatkozó adatok állnak rendelkezésre. A próba nullhipotézise az egyes alkalmakkal mért \(k\) változók populációbeli várható értékének azonosságát állítja. Az alkalmazási feltételek között a normalitás és a szóráshomogenitásnak az összetartozó minták kapcsán megjelenő változata, a szfericitás szerepel.

Null- és ellenhipotézisek:

  • Nullhipotézis:
    • \(H_0:\mu_1=\mu_2= \dots =\mu_k\)
  • Ellenhipotézis:
    • \(H_1:\) nem mindegyik várható érték egyenlő egymással

Alkalmazási feltételek:

  • a \(X_1, X_2, \dots, X_k\) változók normális eloszlásúak
  • szfericitás (szórásegyezés)

8.2.1 Példa: az alkohol hatása a vezetési képességekre, összetartozó mintás eset.

Egy kísérletben 12 személy bevonásával az alkohol hatását vizsgálták a vezetési képességekre. A személyeket három alkalommal vizsgálták, három egymást követő hét hétfőjén. Először alkoholmentes, majd alacsony alkoholtartalmú és végül magas alkoholtartalmú italt fogyasztottak. Az alkoholmentes ital ugyanúgy nézett ki, és az íze is pontosan ugyanolyan volt, mint a többi italnak. A fogyasztott ital mennyissége a résztvevő testsúlya alapján lett meghatározva. A ital elfogyasztása után fél órával, a résztvevők 10 percig egy szimulátorban vezettek, amely nyilvántartotta az elkövetett hibák számát. Vizsgáljuk meg, hogy az elfogyasztott alkohol mennyisége milyen hatással van az elkövetett hibák számára!
Forrás: (Dancey and Reidy 2011, 313)

Adatok beolvasása. Olvassuk be az adatokat egy d nevű adattáblába:

d <- read.table(file = textConnection("
Participant placebo alacsony.alkohol magas.alkohol
1 5 5 8
2 10 7 10
3 7 9 8
4 3 8 9
5 5 2 11
6 7 5 15
7 11 6 7
8 2 6 11
9 3 4 8
10 5 4 8
11 6 8 17
12 6 10 11
"), header=T, sep="")
library(reshape2)
d.l <- melt(d, id.vars = "Participant", value.name = "hibak.szama", variable.name = "csoport") # szélesből-hosszú átalakítás
d.l$Participant <- factor(d$Participant)
str(d.l)                       # az adattábla szerkezete
## 'data.frame':    36 obs. of  3 variables:
##  $ Participant: Factor w/ 12 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ csoport    : Factor w/ 3 levels "placebo","alacsony.alkohol",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ hibak.szama: int  5 10 7 3 5 7 11 2 3 5 ...
d.l                            # a beolvasott adattábla
##    Participant          csoport hibak.szama
## 1            1          placebo           5
## 2            2          placebo          10
## 3            3          placebo           7
## 4            4          placebo           3
## 5            5          placebo           5
## 6            6          placebo           7
## 7            7          placebo          11
## 8            8          placebo           2
## 9            9          placebo           3
## 10          10          placebo           5
## 11          11          placebo           6
## 12          12          placebo           6
## 13           1 alacsony.alkohol           5
## 14           2 alacsony.alkohol           7
## 15           3 alacsony.alkohol           9
## 16           4 alacsony.alkohol           8
## 17           5 alacsony.alkohol           2
## 18           6 alacsony.alkohol           5
## 19           7 alacsony.alkohol           6
## 20           8 alacsony.alkohol           6
## 21           9 alacsony.alkohol           4
## 22          10 alacsony.alkohol           4
## 23          11 alacsony.alkohol           8
## 24          12 alacsony.alkohol          10
## 25           1    magas.alkohol           8
## 26           2    magas.alkohol          10
## 27           3    magas.alkohol           8
## 28           4    magas.alkohol           9
## 29           5    magas.alkohol          11
## 30           6    magas.alkohol          15
## 31           7    magas.alkohol           7
## 32           8    magas.alkohol          11
## 33           9    magas.alkohol           8
## 34          10    magas.alkohol           8
## 35          11    magas.alkohol          17
## 36          12    magas.alkohol          11

Leíróstatisztikai mutatók.

library(psych)
psych::describeBy(x = d.l$hibak.szama, group = d.l$csoport, mat = T)
##    item           group1 vars  n      mean       sd median trimmed    mad
## 11    1          placebo    1 12  5.833333 2.691175    5.5     5.7 2.2239
## 12    2 alacsony.alkohol    1 12  6.166667 2.329000    6.0     6.2 2.9652
## 13    3    magas.alkohol    1 12 10.250000 3.048845    9.5     9.9 2.2239
##    min max range        skew   kurtosis        se
## 11   2  11     9  0.46983633 -0.8330127 0.7768754
## 12   2  10     8 -0.02565285 -1.1515253 0.6723245
## 13   7  17    10  0.98247561 -0.2971578 0.8801257
library(DescTools)
Desc(hibak.szama ~ csoport, data = d.l)
## ------------------------------------------------------------------------- 
## hibak.szama ~ csoport
## 
## Summary: 
## n pairs: 36, valid: 36 (100.0%), missings: 0 (0.0%), groups: 3
## 
##                                                             
##                  placebo  alacsony.alkohol     magas.alkohol
## mean           5.8333333         6.1666667        10.2500000
## median         5.5000000         6.0000000         9.5000000
## sd             2.6911753         2.3290003         3.0488448
## IQR            2.5000000         3.2500000         3.0000000
## n                     12                12                12
## np           33.3333333%       33.3333333%       33.3333333%
## NAs                    0                 0                 0
## 0s                     0                 0                 0
## 
## Kruskal-Wallis rank sum test:
##   Kruskal-Wallis chi-squared = 13.77, df = 2, p-value = 0.001023

Grafikus vizsgálatok.

library(PASWR2)
oneway.plots(Y = d.l$hibak.szama, fac1 = d.l$csoport)

library(yarrr)
pirateplot(formula = hibak.szama ~ csoport, data = d.l, hdi.o = 0, line.o = 0, theme.o = 1, pal = "google")

library(gplots)
plotmeans(formula = hibak.szama ~ csoport, data=d.l, xlab="Csoport", ylab="Hibák száma", main="Mean Plot\nwith 95% CI")

library(ggplot2)
pic <- ggplot(data=d.l, aes(x=csoport, y=hibak.szama)) + 
  stat_summary(fun.data=mean_cl_normal, geom="line", size=1, aes(group=1)) +
  stat_summary(fun.data=mean_cl_normal, geom="errorbar", size=1, width=0.1) + 
  stat_summary(fun.y=mean, geom="point", size=4, shape=21, fill="white") +  
  coord_cartesian(ylim = c(0, 16)) + theme_bw() + labs(x="Csoport", y="Hibák száma")
pic

Egyszempontos összetartozó mintás varianciaelemzés végrehajtása. *Egyszempontos összetartozó mintás varianciaelemzés végrehajtható az aov() függvénnyel és az ez csomag ezANOVA() függvényével is. Az aov() függvény hívása során az összetartozó minták miatt szükség van az Error() tagra is, amely tartalmazza a személyek azonosító változó nevét (Participant) és a személyen belüli faktor változót (csoport).

Az ezANOVA() függvény részletesebb outputtal rendelkezik, például Mauchly-próbát is végez a szfericitás ellenőrzésére. A füügvény hívása során meg kell adnunk a függő változó nevét (dv=hibak.szama), a személyek azonosító változóját (wid=Participant) és a személyen belüli faktort (within=csoport). A detailed=T argumentummal részletes outputot kérünk.

aov.d <- aov(hibak.szama ~ csoport + Error(Participant/csoport), data = d.l)
summary(aov.d)
## 
## Error: Participant
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 11  94.08   8.553               
## 
## Error: Participant:csoport
##           Df Sum Sq Mean Sq F value   Pr(>F)
## csoport    2  145.2   72.58   10.83 0.000533
## Residuals 22  147.5    6.70
library(ez)
ezANOVA(data = d.l, dv = hibak.szama, wid = Participant, within = csoport, detailed = T)
## $ANOVA
##        Effect DFn DFd       SSn       SSd         F                 p
## 1 (Intercept)   1  11 1980.2500  94.08333 231.52613 0.000000009803446
## 2     csoport   2  22  145.1667 147.50000  10.82599 0.000532851693527
##   p<.05       ges
## 1     * 0.8912685
## 2     * 0.3753501
## 
## $`Mauchly's Test for Sphericity`
##    Effect         W        p p<.05
## 2 csoport 0.9089291 0.620369      
## 
## $`Sphericity Corrections`
##    Effect       GGe        p[GG] p[GG]<.05      HFe        p[HF] p[HF]<.05
## 2 csoport 0.9165307 0.0008189724         * 1.090699 0.0005328517         *

A fenti outputból kiolvasható, hogy a szfericitási feltétel teljesül (Mauchly-próba: \(W=0,9089; p=0,6204\)), így az egyszempontos összetartozó mintás varianciaelemzés feltétele teljesül. (Megjegyezzük, hogy amennyiben a Mauchly-próba szignifikáns, akkor a szfericitási feltétel hiányban a p[GG] Greenhouse-Geisser vagy a p[HF] Huynh-Feldt korrigált \(p\) értékek nyújtanak tájékozódást az egyszempontos összetartozó mintás varianciaelemzés nullhipotéziséről.)

Az egyszempontos összetartozó mintás varianciaelemzés eredménye szignifikáns (\(F(2, 22)=10,83; p=0,0005\)), vagyis az alkoholfogyasztás mértéke szignigikánsan befolyásolja a vezetési képességet.

Utóelemzések. Végezzünk utóelemzést nem szekvenciális Bonferroni próbával! A pairwise.t.test() függvényben a p.adjust.method= argumentummmal tudjuk beállítani a korrekció módját, Bonferroni-féle korrekció (nem szekvenciális Bonferroni) esetén a p.adjust.method="bonferroni" argumentummal. Összetartozó mintás eset lévén hasznlnunk kell a paired=T argumentumot is.

pairwise.t.test(x = d.l$hibak.szama, g = d.l$csoport, paired = T, p.adjust.method = "bonferroni")
## 
##  Pairwise comparisons using paired t tests 
## 
## data:  d.l$hibak.szama and d.l$csoport 
## 
##                  placebo alacsony.alkohol
## alacsony.alkohol 1.0000  -               
## magas.alkohol    0.0107  0.0068          
## 
## P value adjustment method: bonferroni

A nem szekvenciális Bonferroni próba eredménye alapján azt mondhatjuk, hogy szignifikáns eltérés van a hibák számában a placebó és a magas alkohol csoportok, valamint az alacsony alkohol és magas alkohol csoportok között (mindkét esetben \(p<0,011\)).

library(DescTools)
EtaSq(aov.d, type=1)
##            eta.sq eta.sq.part eta.sq.gen
## csoport 0.3753501   0.4960137  0.3753501

8.3 Többszempontos varianciaelemzés

A többszempontos varianciaelemzés (independent multi-factorial ANOVA) több független faktort hatását vizsgálja a folytonos függő változóra.

A kétszempontos és a háromszempontos (háromfaktoros) varianciaelemzés lineáris modellje:

\[y_{ijk}=\mu+\alpha_i+\beta_j+(\alpha \beta)_{ij} + \varepsilon_{ijk}\]

\[y_{ijkl}=\mu+\alpha_i+\beta_j+\gamma_k+(\alpha \beta)_{ij} + (\alpha \gamma)_{ik} + (\beta \gamma)_{jk} + (\alpha \beta \gamma)_{ijk} + \varepsilon_{ijkl}\]

A fenti egyenletekben a \(\mu\) az összátlag, az \(\alpha\) az \(A\) faktor hatása, a \(\beta\) a \(B\) faktor hatása és a \(\gamma\) a \(C\) faktor hatása. A továbbiakban a kétszempontos varianciaelemzés modelljét tárgyaljuk. Az \(A\) faktor rendelkezzen \(I\), a \(B\) faktor pedig \(J\) különböző szinttel.

Null- és ellenhipotézisek:

  • az \((A \times B)\) interakcióra
    • Nullhipotézis:
      • \(H_0:(\alpha \beta)_{11}=(\alpha \beta)_{12}= \dots =(\alpha \beta)_{IJ}=0\)
        vagy
      • \(H_0:\) nincs \((A \times B)\) interakció
    • Ellenhipotézis:
      • \(H_1:(\alpha \beta)_{ij} \neq 0\) legalább egy \((\alpha \beta)_{ij}\)-re
        vagy
      • \(H_1:\) van \((A \times B)\) interakció
  • az \(A\) faktorra
    • Nullhipotézis:
      • \(H_0:\mu(A)_1=\mu(A)_2= \dots =\mu(A)_I\)
        vagy
      • \(H_0:\alpha_1=\alpha_2= \dots =\alpha_I=0\)
        vagy
      • \(H_0:\) az \(A\) faktornak nincs hatása
    • Ellenhipotézis:
      • \(H_1:\) nem mindegyik \(I\) db várható érték egyenlő egymással
        vagy
      • \(H_1:\alpha_i \neq 0\) legalább egy \(\alpha_i\)-re
        vagy
      • \(H_1:\) az \(A\) faktornak van hatása
  • a \(B\) faktorra
    • Nullhipotézis:
      • \(H_0:\mu(B)_1=\mu(B)_2= \dots =\mu(B)_J\)
        vagy
      • \(H_0:\beta_1=\beta_2= \dots =\beta_J=0\)
        vagy
      • \(H_0:\) a \(B\) faktornak nincs hatása
    • Ellenhipotézis:
      • \(H_1:\) nem mindegyik \(J\) db várható érték egyenlő egymással
        vagy
      • \(H_1:\beta_j \neq 0\) legalább egy \(\beta_j\)-re
        vagy
      • \(H_1:\) a \(B\) faktornak van hatása

Alkalmazási feltételek:

  • független minták
  • normalitás
  • szóráshomogenitás

8.3.1 Példa: antidepresszánsok hatása.

Egy vizsgálatban antidepresszánsok hatását vizsgálták. A kísérlet 18 résztvevőjét 3 csoportba sorolták a kapott gyógyszer szerint. A kontrollcsoport placebót kapott, a másik két csoport Anxifree, valamint Joyzepam nevű antidepresszánst kapott. Mindegyik csoportban voltak olyanok, akiknek a gyógyulását kognitív viselkedésterápiával segítették. Az antidepresszánsok hatását a 3 hónapos kezelés után a hangulati állapotban bekövetkező változás segítségével mérjük (\(\left[-5,5\right]\) közötti skálán). Vizsgáljuk meg, hogy milyen az antidepresszánsok hatása!
Forrás: Daniel Navarro (2015). Learning statistics with R: A tutorial for psychology students and other beginners (Version 0.5)

Adatok beolvasása. Olvassuk be az adatokat egy d nevű adattáblába:

d <- read.table(file = textConnection("
     drug    therapy mood.gain
  placebo no.therapy       0.5
  placebo no.therapy       0.3
  placebo no.therapy       0.1
 anxifree no.therapy       0.6
 anxifree no.therapy       0.4
 anxifree no.therapy       0.2
 joyzepam no.therapy       1.4
 joyzepam no.therapy       1.7
 joyzepam no.therapy       1.3
  placebo        CBT       0.6
  placebo        CBT       0.9
  placebo        CBT       0.3
 anxifree        CBT       1.1
 anxifree        CBT       0.8
 anxifree        CBT       1.2
 joyzepam        CBT       1.8
 joyzepam        CBT       1.3
 joyzepam        CBT       1.4
"), header=T, sep="")
d$drug <- factor(d$drug, levels=c("placebo", "anxifree", "joyzepam"))
d$therapy <- factor(d$therapy, levels=c("no.therapy", "CBT"))
str(d)                       # az adattábla szerkezete
## 'data.frame':    18 obs. of  3 variables:
##  $ drug     : Factor w/ 3 levels "placebo","anxifree",..: 1 1 1 2 2 2 3 3 3 1 ...
##  $ therapy  : Factor w/ 2 levels "no.therapy","CBT": 1 1 1 1 1 1 1 1 1 2 ...
##  $ mood.gain: num  0.5 0.3 0.1 0.6 0.4 0.2 1.4 1.7 1.3 0.6 ...
d                            # a beolvasott adattábla
##        drug    therapy mood.gain
## 1   placebo no.therapy       0.5
## 2   placebo no.therapy       0.3
## 3   placebo no.therapy       0.1
## 4  anxifree no.therapy       0.6
## 5  anxifree no.therapy       0.4
## 6  anxifree no.therapy       0.2
## 7  joyzepam no.therapy       1.4
## 8  joyzepam no.therapy       1.7
## 9  joyzepam no.therapy       1.3
## 10  placebo        CBT       0.6
## 11  placebo        CBT       0.9
## 12  placebo        CBT       0.3
## 13 anxifree        CBT       1.1
## 14 anxifree        CBT       0.8
## 15 anxifree        CBT       1.2
## 16 joyzepam        CBT       1.8
## 17 joyzepam        CBT       1.3
## 18 joyzepam        CBT       1.4

Leíróstatisztikai mutatók. A drug faktor 3 szinttel, a therapy faktor 2 szinttel rendelkezik, így összesen 6 csoportunk van. Határozzuk meg a tapply() függvénnyel ezekben a csoportokban az átlagokat, szórásokat és a csoportok mintaelemszámát!

tapply(d$mood.gain, d[,c("drug", "therapy")], mean, na.rm = T)            # átlagok
##           therapy
## drug       no.therapy      CBT
##   placebo    0.300000 0.600000
##   anxifree   0.400000 1.033333
##   joyzepam   1.466667 1.500000
tapply(d$mood.gain, d[,c("drug", "therapy")], sd, na.rm = T)              # szórások
##           therapy
## drug       no.therapy       CBT
##   placebo   0.2000000 0.3000000
##   anxifree  0.2000000 0.2081666
##   joyzepam  0.2081666 0.2645751
tapply(d$mood.gain, d[,c("drug", "therapy")], function(x) sum(!is.na(x))) # csoportok elemszáma
##           therapy
## drug       no.therapy CBT
##   placebo           3   3
##   anxifree          3   3
##   joyzepam          3   3

Grafikus vizsgálatok. A PASWR2 csomag twoway.plots() függvénye alkalmas a kétszempontos varianciaelemzés grafikus megjelenítésére. Az első két ábrán a két faktor dobozdiagramját kapjuk, majd két átlagábrát tanulmányozhatunk.

library(PASWR2)
twoway.plots(Y = d$mood.gain, fac1 = d$drug, fac2 = d$therapy)

Kétszempontos varianciaelemzés végrehajtása. Az aov() függvényben az interakciót is tartalmazó modellt adjuk meg (formula=mood.gain~drug*therapy), majd a summary() függvénnyel kérjük le az ANOVA táblázatot.

aov.d <- aov(formula = mood.gain ~ drug * therapy, data = d)
summary(aov.d)
##              Df Sum Sq Mean Sq F value    Pr(>F)
## drug          2  3.453  1.7267  31.714 0.0000162
## therapy       1  0.467  0.4672   8.582    0.0126
## drug:therapy  2  0.271  0.1356   2.490    0.1246
## Residuals    12  0.653  0.0544

A kétszempontos varianciaelemzés alapján megállapíthatjuk, hogy mindkét főhatás szignifikáns, a gyógyszeres kezelésnek (\(F(2, 12)=31,71; p<0,0001\)) és a terápiának (\(F(1, 12)=8,58; p=0,0126\)) is van hatása. Az interakció a két faktor között nem szignifikáns (\(F(2, 12)=2,49; p=0,1246\)).

Utóelemzések. Fennt megállapítottuk, hogy mindkét faktor hatása szignifikáns, most nézzük meg ezeket a hatásokat részletesen Tukey-próbával. Mindkét faktorra külön-külön páronkénti összehasonlításokkal megvizsgáljuk, hogy mely csoportok között van szignifikáns különbség. Használhatjuk a multcomp csomag glht() függvényét és a TukeyHSD() függvényt is.

library(multcomp)
glht.1 <- glht(model = aov(mood.gain ~ drug + therapy, data = d), linfct = mcp(drug = "Tukey")) # Tukey-próba
summary(glht.1)                  # a Tukey-próba eredménye
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## 
## Fit: aov(formula = mood.gain ~ drug + therapy, data = d)
## 
## Linear Hypotheses:
##                          Estimate Std. Error t value Pr(>|t|)
## anxifree - placebo == 0    0.2667     0.1484   1.797    0.206
## joyzepam - placebo == 0    1.0333     0.1484   6.965   <0.001
## joyzepam - anxifree == 0   0.7667     0.1484   5.168   <0.001
## (Adjusted p values reported -- single-step method)
confint(glht.1, level = 0.95)    # 95%-os konfidenciaintervallumok 
## 
##   Simultaneous Confidence Intervals
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## 
## Fit: aov(formula = mood.gain ~ drug + therapy, data = d)
## 
## Quantile = 2.6165
## 95% family-wise confidence level
##  
## 
## Linear Hypotheses:
##                          Estimate lwr     upr    
## anxifree - placebo == 0   0.2667  -0.1215  0.6548
## joyzepam - placebo == 0   1.0333   0.6452  1.4215
## joyzepam - anxifree == 0  0.7667   0.3785  1.1548
par(mar=c(5.1, 9.1, 4.1, 2.1)); plot(glht.1)  # 95%-os konfidenciaintervallumok ábrázolása

library(multcomp)
glht.1 <- glht(model = aov(mood.gain ~ drug + therapy, data = d), linfct = mcp(therapy = "Tukey")) # Tukey-próba
summary(glht.1)                  # a Tukey-próba eredménye
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## 
## Fit: aov(formula = mood.gain ~ drug + therapy, data = d)
## 
## Linear Hypotheses:
##                       Estimate Std. Error t value Pr(>|t|)
## CBT - no.therapy == 0   0.3222     0.1211    2.66   0.0187
## (Adjusted p values reported -- single-step method)
confint(glht.1, level = 0.95)    # 95%-os konfidenciaintervallumok 
## 
##   Simultaneous Confidence Intervals
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## 
## Fit: aov(formula = mood.gain ~ drug + therapy, data = d)
## 
## Quantile = 2.1448
## 95% family-wise confidence level
##  
## 
## Linear Hypotheses:
##                       Estimate lwr     upr    
## CBT - no.therapy == 0 0.32222  0.06241 0.58203
par(mar=c(5.1, 9.1, 4.1, 2.1)); plot(glht.1)  # 95%-os konfidenciaintervallumok ábrázolása

A fenti sorok helyett használhatjuk a TukeyHSD() függvényt is, az eredmény az előzőekkel megegyező lesz.

TukeyHSD(aov(mood.gain ~ drug + therapy, data = d))
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = mood.gain ~ drug + therapy, data = d)
## 
## $drug
##                        diff        lwr       upr     p adj
## anxifree-placebo  0.2666667 -0.1216321 0.6549655 0.2062942
## joyzepam-placebo  1.0333333  0.6450345 1.4216321 0.0000186
## joyzepam-anxifree 0.7666667  0.3783679 1.1549655 0.0003934
## 
## $therapy
##                     diff       lwr       upr     p adj
## CBT-no.therapy 0.3222222 0.0624132 0.5820312 0.0186602

A Tukey-próba eredménye alapján a Joyzepam antidepresszánssal szignifikánsan jobb eredményt érhetünk el, mint a placebóval, vagy a korábban használt Anxifree-vel (mindkét esetben \(p<0,0004\)).

Alternatívák kétszempontos varianciaelemzésre. Használjuk a lessR csomag ANOVA() függvényét!

library(lessR)
ANOVA(my.formula = mood.gain ~ drug * therapy, data = d)

##   BACKGROUND
## 
## Response Variable: mood.gain 
##  
## Factor Variable 1: drug 
##   Levels: placebo anxifree joyzepam 
##  
## Factor Variable 2: therapy 
##   Levels: no.therapy CBT 
##  
## Number of cases (rows) of data:  18 
## Number of cases retained for analysis:  18 
##  
## The design is balanced 
##  
## Two-way Between Groups ANOVA 
## 
## 
##   DESCRIPTIVE STATISTICS 
## 
## Cell Sample Size: 3 
## 
## 
##             drug 
##  therapy    placebo anxifree joyzepam 
##   no.therapy    0.30     0.40     1.47 
##         CBT    0.60     1.03     1.50 
## 
## 
## drug 
## ----------------------------- 
##     placebo anxifree joyzepam 
##   1    0.45     0.72     1.48 
##  
## therapy 
## ------------------- 
##     no.therapy  CBT 
##   1       0.72 1.04 
## 
## 
## 0.883 
## 
## 
##             drug 
##  therapy    placebo anxifree joyzepam 
##   no.therapy    0.20     0.20     0.21 
##         CBT    0.30     0.21     0.26 
## 
## 
##   BASIC ANALYSIS
## 
##              df    Sum Sq   Mean Sq   F-value   p-value 
##         drug  2      3.45      1.73     31.71    0.0000 
##      therapy  1      0.47      0.47      8.58    0.0126 
## drug:therapy  2      0.27      0.14      2.49    0.1246 
##    Residuals 12      0.65      0.05 
## 
## 
## Partial Omega Squared for drug: 0.77 
## Partial Omega Squared for therapy: 0.30 
## Partial Omega Squared for drug & therapy: 0.14 
##  
## Cohen's f for drug: 1.85 
## Cohen's f for therapy: 0.65 
## Cohen's f for drug_&_therapy: 0.41 
## 
## 
##  
## Family-wise Confidence Level: 0.95 
## 
## Factor: drug 
## ----------------------------------------- 
##                     diff   lwr  upr p adj 
##    anxifree-placebo 0.27 -0.09 0.63  0.16 
##    joyzepam-placebo 1.03  0.67 1.39  0.00 
##   joyzepam-anxifree 0.77  0.41 1.13  0.00 
## 
## Factor: therapy 
## ------------------------------------- 
##                  diff  lwr  upr p adj 
##   CBT-no.therapy 0.32 0.08 0.56  0.01 
## 
## Cell Means 
## ----------------------------------------------------------------- 
##                                            diff   lwr   upr p adj 
##    anxifree:no.therapy-placebo:no.therapy  0.10 -0.54  0.74  0.99 
##    joyzepam:no.therapy-placebo:no.therapy  1.17  0.53  1.81  0.00 
##            placebo:CBT-placebo:no.therapy  0.30 -0.34  0.94  0.63 
##           anxifree:CBT-placebo:no.therapy  0.73  0.09  1.37  0.02 
##           joyzepam:CBT-placebo:no.therapy  1.20  0.56  1.84  0.00 
##   joyzepam:no.therapy-anxifree:no.therapy  1.07  0.43  1.71  0.00 
##           placebo:CBT-anxifree:no.therapy  0.20 -0.44  0.84  0.89 
##          anxifree:CBT-anxifree:no.therapy  0.63 -0.01  1.27  0.05 
##          joyzepam:CBT-anxifree:no.therapy  1.10  0.46  1.74  0.00 
##           placebo:CBT-joyzepam:no.therapy -0.87 -1.51 -0.23  0.01 
##          anxifree:CBT-joyzepam:no.therapy -0.43 -1.07  0.21  0.28 
##          joyzepam:CBT-joyzepam:no.therapy  0.03 -0.61  0.67  1.00 
##                  anxifree:CBT-placebo:CBT  0.43 -0.21  1.07  0.28 
##                  joyzepam:CBT-placebo:CBT  0.90  0.26  1.54  0.01 
##                 joyzepam:CBT-anxifree:CBT  0.47 -0.17  1.11  0.21 
## 
## 
##   RESIDUALS
## 
## Fitted Values, Residuals, Standardized Residuals 
##    [sorted by Standardized Residuals, ignoring + or - sign] 
##    [res.rows = 18, out of 18 ] 
## ---------------------------------------------------------- 
##          drug    therapy mood.gain fitted residual z-resid 
##   11  placebo        CBT      0.90   0.60     0.30    1.57 
##   16 joyzepam        CBT      1.80   1.50     0.30    1.57 
##   12  placebo        CBT      0.30   0.60    -0.30   -1.57 
##    8 joyzepam no.therapy      1.70   1.47     0.23    1.22 
##   14 anxifree        CBT      0.80   1.03    -0.23   -1.22 
##    3  placebo no.therapy      0.10   0.30    -0.20   -1.05 
##    1  placebo no.therapy      0.50   0.30     0.20    1.05 
##    6 anxifree no.therapy      0.20   0.40    -0.20   -1.05 
##   17 joyzepam        CBT      1.30   1.50    -0.20   -1.05 
##    4 anxifree no.therapy      0.60   0.40     0.20    1.05 
##   15 anxifree        CBT      1.20   1.03     0.17    0.87 
##    9 joyzepam no.therapy      1.30   1.47    -0.17   -0.87 
##   18 joyzepam        CBT      1.40   1.50    -0.10   -0.52 
##   13 anxifree        CBT      1.10   1.03     0.07    0.35 
##    7 joyzepam no.therapy      1.40   1.47    -0.07   -0.35 
##    2  placebo no.therapy      0.30   0.30    -0.00    0.00 
##    5 anxifree no.therapy      0.40   0.40     0.00    0.00 
##   10  placebo        CBT      0.60   0.60    -0.00    0.00

8.3.2 Példa: a mobiltelefon használatának hatása a vezetésre.

Egy kísérletben azt vizsgáljuk, hogy a vezetés közbeni telefonhasználat hogyan hat az elkövetett hibák számára. A függő változó tehát a szimulátorban elkövetett hibák száma volt. A vizsgálati személyeket 3 csoportba soroltuk: a kontrolcsoportban nem volt telefonhasználat, míg a másik kettőben különböző igénybevételű beszélgetést kellett folytatni fejhallgatón keresztül. Az Egyszerű csoportban csak a hallott szavakat kellett megismételni, a Bonyolult csoportban a hallott szó utolsó betűjével kellet egy új szót mondani. Az egyes csoportokban a kísérleti személyek további 2-2 alcsoportba sorolhatók. Az egyik alcsoportban könnyebb, míg a másikban nehezebb vezetési feladatott kellett megoldani. Vizsgáljuk meg, hogy a telefonálás hatását a vezetésre!
Forrás: Andrew Conway: Statistics One, Lecture 17: Factorial ANOVA (https://www.coursera.org/course/stats1)

Adatok beolvasása. Olvassuk be az adatokat egy d nevű adattáblába:

d <- read.table(file = textConnection('
"subject" "beszelgetes" "vezetes" "hibak.szama"
"1" 1 "Nem volt" "Könnyű" 20
"2" 2 "Nem volt" "Könnyű" 19
"3" 3 "Nem volt" "Könnyű" 31
"4" 4 "Nem volt" "Könnyű" 27
"5" 5 "Nem volt" "Könnyű" 31
"6" 6 "Nem volt" "Könnyű" 17
"7" 7 "Nem volt" "Könnyű" 23
"8" 8 "Nem volt" "Könnyű" 26
"9" 9 "Nem volt" "Könnyű" 11
"10" 10 "Nem volt" "Könnyű" 15
"11" 11 "Nem volt" "Könnyű" 13
"12" 12 "Nem volt" "Könnyű" 18
"13" 13 "Nem volt" "Könnyű" 21
"14" 14 "Nem volt" "Könnyű" 13
"15" 15 "Nem volt" "Könnyű" 13
"16" 16 "Nem volt" "Könnyű" 14
"17" 17 "Nem volt" "Könnyű" 20
"18" 18 "Nem volt" "Könnyű" 26
"19" 19 "Nem volt" "Könnyű" 20
"20" 20 "Nem volt" "Könnyű" 14
"21" 21 "Nem volt" "Nehéz" 10
"22" 22 "Nem volt" "Nehéz" 23
"23" 23 "Nem volt" "Nehéz" 31
"24" 24 "Nem volt" "Nehéz" 32
"25" 25 "Nem volt" "Nehéz" 24
"26" 26 "Nem volt" "Nehéz" 26
"27" 27 "Nem volt" "Nehéz" 46
"28" 28 "Nem volt" "Nehéz" 25
"29" 29 "Nem volt" "Nehéz" 23
"30" 30 "Nem volt" "Nehéz" 25
"31" 31 "Nem volt" "Nehéz" 13
"32" 32 "Nem volt" "Nehéz" 32
"33" 33 "Nem volt" "Nehéz" 32
"34" 34 "Nem volt" "Nehéz" 16
"35" 35 "Nem volt" "Nehéz" 26
"36" 36 "Nem volt" "Nehéz" 24
"37" 37 "Nem volt" "Nehéz" 11
"38" 38 "Nem volt" "Nehéz" 15
"39" 39 "Nem volt" "Nehéz" 19
"40" 40 "Nem volt" "Nehéz" 12
"41" 41 "Egyszerű" "Könnyű" 21
"42" 42 "Egyszerű" "Könnyű" 23
"43" 43 "Egyszerű" "Könnyű" 7
"44" 44 "Egyszerű" "Könnyű" 25
"45" 45 "Egyszerű" "Könnyű" 15
"46" 46 "Egyszerű" "Könnyű" 21
"47" 47 "Egyszerű" "Könnyű" 19
"48" 48 "Egyszerű" "Könnyű" 1
"49" 49 "Egyszerű" "Könnyű" 25
"50" 50 "Egyszerű" "Könnyű" 20
"51" 51 "Egyszerű" "Könnyű" 32
"52" 52 "Egyszerű" "Könnyű" 32
"53" 53 "Egyszerű" "Könnyű" 14
"54" 54 "Egyszerű" "Könnyű" 34
"55" 55 "Egyszerű" "Könnyű" 21
"56" 56 "Egyszerű" "Könnyű" 13
"57" 57 "Egyszerű" "Könnyű" 20
"58" 58 "Egyszerű" "Könnyű" 28
"59" 59 "Egyszerű" "Könnyű" 10
"60" 60 "Egyszerű" "Könnyű" 15
"61" 61 "Egyszerű" "Nehéz" 46
"62" 62 "Egyszerű" "Nehéz" 30
"63" 63 "Egyszerű" "Nehéz" 37
"64" 64 "Egyszerű" "Nehéz" 31
"65" 65 "Egyszerű" "Nehéz" 25
"66" 66 "Egyszerű" "Nehéz" 23
"67" 67 "Egyszerű" "Nehéz" 38
"68" 68 "Egyszerű" "Nehéz" 36
"69" 69 "Egyszerű" "Nehéz" 43
"70" 70 "Egyszerű" "Nehéz" 41
"71" 71 "Egyszerű" "Nehéz" 43
"72" 72 "Egyszerű" "Nehéz" 32
"73" 73 "Egyszerű" "Nehéz" 37
"74" 74 "Egyszerű" "Nehéz" 23
"75" 75 "Egyszerű" "Nehéz" 34
"76" 76 "Egyszerű" "Nehéz" 46
"77" 77 "Egyszerű" "Nehéz" 54
"78" 78 "Egyszerű" "Nehéz" 45
"79" 79 "Egyszerű" "Nehéz" 33
"80" 80 "Egyszerű" "Nehéz" 42
"81" 81 "Bonyolult" "Könnyű" 21
"82" 82 "Bonyolult" "Könnyű" 33
"83" 83 "Bonyolult" "Könnyű" 24
"84" 84 "Bonyolult" "Könnyű" 21
"85" 85 "Bonyolult" "Könnyű" 29
"86" 86 "Bonyolult" "Könnyű" 24
"87" 87 "Bonyolult" "Könnyű" 28
"88" 88 "Bonyolult" "Könnyű" 31
"89" 89 "Bonyolult" "Könnyű" 22
"90" 90 "Bonyolult" "Könnyű" 21
"91" 91 "Bonyolult" "Könnyű" 42
"92" 92 "Bonyolult" "Könnyű" 20
"93" 93 "Bonyolult" "Könnyű" 25
"94" 94 "Bonyolult" "Könnyű" 20
"95" 95 "Bonyolult" "Könnyű" 21
"96" 96 "Bonyolult" "Könnyű" 16
"97" 97 "Bonyolult" "Könnyű" 23
"98" 98 "Bonyolult" "Könnyű" 37
"99" 99 "Bonyolult" "Könnyű" 34
"100" 100 "Bonyolult" "Könnyű" 25
"101" 101 "Bonyolult" "Nehéz" 46
"102" 102 "Bonyolult" "Nehéz" 49
"103" 103 "Bonyolult" "Nehéz" 56
"104" 104 "Bonyolult" "Nehéz" 41
"105" 105 "Bonyolult" "Nehéz" 56
"106" 106 "Bonyolult" "Nehéz" 36
"107" 107 "Bonyolult" "Nehéz" 46
"108" 108 "Bonyolult" "Nehéz" 39
"109" 109 "Bonyolult" "Nehéz" 42
"110" 110 "Bonyolult" "Nehéz" 56
"111" 111 "Bonyolult" "Nehéz" 51
"112" 112 "Bonyolult" "Nehéz" 27
"113" 113 "Bonyolult" "Nehéz" 45
"114" 114 "Bonyolult" "Nehéz" 48
"115" 115 "Bonyolult" "Nehéz" 50
"116" 116 "Bonyolult" "Nehéz" 61
"117" 117 "Bonyolult" "Nehéz" 43
"118" 118 "Bonyolult" "Nehéz" 47
"119" 119 "Bonyolult" "Nehéz" 54
"120" 120 "Bonyolult" "Nehéz" 41 
'), header=T, sep="")
d$vezetes <- factor(d$vezetes, levels=c("Könnyű", "Nehéz"))                           # szintsorrend beállítása
d$beszelgetes <- factor(d$beszelgetes, levels=c("Nem volt", "Egyszerű", "Bonyolult")) # szintsorrend beállítása
str(d)                       # az adattábla szerkezete
## 'data.frame':    120 obs. of  4 variables:
##  $ subject    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ beszelgetes: Factor w/ 3 levels "Nem volt","Egyszerű",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ vezetes    : Factor w/ 2 levels "Könnyű","Nehéz": 1 1 1 1 1 1 1 1 1 1 ...
##  $ hibak.szama: int  20 19 31 27 31 17 23 26 11 15 ...
d                            # a beolvasott adattábla
##     subject beszelgetes vezetes hibak.szama
## 1         1    Nem volt  Könnyű          20
## 2         2    Nem volt  Könnyű          19
## 3         3    Nem volt  Könnyű          31
## 4         4    Nem volt  Könnyű          27
## 5         5    Nem volt  Könnyű          31
## 6         6    Nem volt  Könnyű          17
## 7         7    Nem volt  Könnyű          23
## 8         8    Nem volt  Könnyű          26
## 9         9    Nem volt  Könnyű          11
## 10       10    Nem volt  Könnyű          15
## 11       11    Nem volt  Könnyű          13
## 12       12    Nem volt  Könnyű          18
## 13       13    Nem volt  Könnyű          21
## 14       14    Nem volt  Könnyű          13
## 15       15    Nem volt  Könnyű          13
## 16       16    Nem volt  Könnyű          14
## 17       17    Nem volt  Könnyű          20
## 18       18    Nem volt  Könnyű          26
## 19       19    Nem volt  Könnyű          20
## 20       20    Nem volt  Könnyű          14
## 21       21    Nem volt   Nehéz          10
## 22       22    Nem volt   Nehéz          23
## 23       23    Nem volt   Nehéz          31
## 24       24    Nem volt   Nehéz          32
## 25       25    Nem volt   Nehéz          24
## 26       26    Nem volt   Nehéz          26
## 27       27    Nem volt   Nehéz          46
## 28       28    Nem volt   Nehéz          25
## 29       29    Nem volt   Nehéz          23
## 30       30    Nem volt   Nehéz          25
## 31       31    Nem volt   Nehéz          13
## 32       32    Nem volt   Nehéz          32
## 33       33    Nem volt   Nehéz          32
## 34       34    Nem volt   Nehéz          16
## 35       35    Nem volt   Nehéz          26
## 36       36    Nem volt   Nehéz          24
## 37       37    Nem volt   Nehéz          11
## 38       38    Nem volt   Nehéz          15
## 39       39    Nem volt   Nehéz          19
## 40       40    Nem volt   Nehéz          12
## 41       41    Egyszerű  Könnyű          21
## 42       42    Egyszerű  Könnyű          23
## 43       43    Egyszerű  Könnyű           7
## 44       44    Egyszerű  Könnyű          25
## 45       45    Egyszerű  Könnyű          15
## 46       46    Egyszerű  Könnyű          21
## 47       47    Egyszerű  Könnyű          19
## 48       48    Egyszerű  Könnyű           1
## 49       49    Egyszerű  Könnyű          25
## 50       50    Egyszerű  Könnyű          20
## 51       51    Egyszerű  Könnyű          32
## 52       52    Egyszerű  Könnyű          32
## 53       53    Egyszerű  Könnyű          14
## 54       54    Egyszerű  Könnyű          34
## 55       55    Egyszerű  Könnyű          21
## 56       56    Egyszerű  Könnyű          13
## 57       57    Egyszerű  Könnyű          20
## 58       58    Egyszerű  Könnyű          28
## 59       59    Egyszerű  Könnyű          10
## 60       60    Egyszerű  Könnyű          15
## 61       61    Egyszerű   Nehéz          46
## 62       62    Egyszerű   Nehéz          30
## 63       63    Egyszerű   Nehéz          37
## 64       64    Egyszerű   Nehéz          31
## 65       65    Egyszerű   Nehéz          25
## 66       66    Egyszerű   Nehéz          23
## 67       67    Egyszerű   Nehéz          38
## 68       68    Egyszerű   Nehéz          36
## 69       69    Egyszerű   Nehéz          43
## 70       70    Egyszerű   Nehéz          41
## 71       71    Egyszerű   Nehéz          43
## 72       72    Egyszerű   Nehéz          32
## 73       73    Egyszerű   Nehéz          37
## 74       74    Egyszerű   Nehéz          23
## 75       75    Egyszerű   Nehéz          34
## 76       76    Egyszerű   Nehéz          46
## 77       77    Egyszerű   Nehéz          54
## 78       78    Egyszerű   Nehéz          45
## 79       79    Egyszerű   Nehéz          33
## 80       80    Egyszerű   Nehéz          42
## 81       81   Bonyolult  Könnyű          21
## 82       82   Bonyolult  Könnyű          33
## 83       83   Bonyolult  Könnyű          24
## 84       84   Bonyolult  Könnyű          21
## 85       85   Bonyolult  Könnyű          29
## 86       86   Bonyolult  Könnyű          24
## 87       87   Bonyolult  Könnyű          28
## 88       88   Bonyolult  Könnyű          31
## 89       89   Bonyolult  Könnyű          22
## 90       90   Bonyolult  Könnyű          21
## 91       91   Bonyolult  Könnyű          42
## 92       92   Bonyolult  Könnyű          20
## 93       93   Bonyolult  Könnyű          25
## 94       94   Bonyolult  Könnyű          20
## 95       95   Bonyolult  Könnyű          21
## 96       96   Bonyolult  Könnyű          16
## 97       97   Bonyolult  Könnyű          23
## 98       98   Bonyolult  Könnyű          37
## 99       99   Bonyolult  Könnyű          34
## 100     100   Bonyolult  Könnyű          25
## 101     101   Bonyolult   Nehéz          46
## 102     102   Bonyolult   Nehéz          49
## 103     103   Bonyolult   Nehéz          56
## 104     104   Bonyolult   Nehéz          41
## 105     105   Bonyolult   Nehéz          56
## 106     106   Bonyolult   Nehéz          36
## 107     107   Bonyolult   Nehéz          46
## 108     108   Bonyolult   Nehéz          39
## 109     109   Bonyolult   Nehéz          42
## 110     110   Bonyolult   Nehéz          56
## 111     111   Bonyolult   Nehéz          51
## 112     112   Bonyolult   Nehéz          27
## 113     113   Bonyolult   Nehéz          45
## 114     114   Bonyolult   Nehéz          48
## 115     115   Bonyolult   Nehéz          50
## 116     116   Bonyolult   Nehéz          61
## 117     117   Bonyolult   Nehéz          43
## 118     118   Bonyolult   Nehéz          47
## 119     119   Bonyolult   Nehéz          54
## 120     120   Bonyolult   Nehéz          41

Leíróstatisztikai mutatók. A két faktor változó (a vezetes 2 szinttel és a beszelgetes 3 szinttel) összesen 6 csoportot határoz meg. Az egyes csoportokban a leíró statisztikai változókat a szokásos függvényekkel határozzuk meg (psych csomag describeBy(), DescTools csomag Desc()), valamint a tapply() függvénnyel az átlagok, szórások és a csoportok mintaelemszámát is kiíratjuk.

library(psych)
psych::describeBy(d$hibak.szama, d[,c("vezetes", "beszelgetes")], mat = T)
##    item group1    group2 vars  n  mean       sd median trimmed     mad min
## 11    1 Könnyű  Nem volt    1 20 19.60 6.107803   19.5 19.1250  8.1543  11
## 12    2  Nehéz  Nem volt    1 20 23.25 8.961174   24.0 22.8750 11.1195  10
## 13    3 Könnyű  Egyszerű    1 20 19.80 8.507582   20.5 20.1250  8.1543   1
## 14    4  Nehéz  Egyszerű    1 20 36.95 8.274724   37.0 37.0625  8.8956  23
## 15    5 Könnyű Bonyolult    1 20 25.85 6.627495   24.0 25.1250  5.1891  16
## 16    6  Nehéz Bonyolult    1 20 46.70 8.013804   46.5 47.1250  7.4130  27
##    max range        skew   kurtosis       se
## 11  31    20  0.43138298 -1.0634815 1.365746
## 12  46    36  0.45986114 -0.0743921 2.003779
## 13  34    33 -0.24755355 -0.5530346 1.902353
## 14  54    31 -0.02575589 -0.7991620 1.850284
## 15  42    26  0.82043108 -0.2629233 1.481953
## 16  61    34 -0.38873426 -0.1192823 1.791941
library(DescTools)
Desc(hibak.szama ~ vezetes * beszelgetes, data = d)
## ------------------------------------------------------------------------- 
## hibak.szama ~ vezetes
## 
## Summary: 
## n pairs: 120, valid: 120 (100.0%), missings: 0 (0.0%), groups: 2
## 
##                                 
##              Könnyű        Nehéz
## mean     21.7500000   35.6333333
## median   21.0000000   36.5000000
## sd        7.6171639   12.7544830
## IQR       9.2500000   21.0000000
## n                60           60
## np      50.0000000%  50.0000000%
## NAs               0            0
## 0s                0            0
## 
## Kruskal-Wallis rank sum test:
##   Kruskal-Wallis chi-squared = 35.603, df = 1, p-value = 0.00000000242
## ------------------------------------------------------------------------- 
## hibak.szama ~ beszelgetes
## 
## Summary: 
## n pairs: 120, valid: 120 (100.0%), missings: 0 (0.0%), groups: 3
## 
##                                              
##            Nem volt     Egyszerű    Bonyolult
## mean     21.4250000   28.3750000   36.2750000
## median   20.5000000   29.0000000   36.5000000
## sd        7.7918021   12.0014689   12.8122287
## IQR      11.2500000   16.2500000   22.2500000
## n                40           40           40
## np      33.3333333%  33.3333333%  33.3333333%
## NAs               0            0            0
## 0s                0            0            0
## 
## Kruskal-Wallis rank sum test:
##   Kruskal-Wallis chi-squared = 26.629, df = 2, p-value = 0.00000165
## ------------------------------------------------------------------------- 
## hibak.szama ~ vezetes:beszelgetes
## 
## Summary: 
## n pairs: 120, valid: 120 (100.0%), missings: 0 (0.0%), groups: 6
## 
##                                                             
##          Könnyű:Nem volt    Nehéz:Nem volt   Könnyű:Egyszerű
## mean          19.6000000        23.2500000        19.8000000
## median        19.5000000        24.0000000        20.5000000
## sd             6.1078035         8.9611736         8.5075818
## IQR            9.7500000        11.5000000        10.2500000
## n                     20                20                20
## np           16.6666667%       16.6666667%       16.6666667%
## NAs                    0                 0                 0
## 0s                     0                 0                 0
##                                                             
##           Nehéz:Egyszerű  Könnyű:Bonyolult   Nehéz:Bonyolult
## mean          36.9500000        25.8500000        46.7000000
## median        37.0000000        24.0000000        46.5000000
## sd             8.2747237         6.6274946         8.0138039
## IQR           11.2500000         8.5000000        10.0000000
## n                     20                20                20
## np           16.6666667%       16.6666667%       16.6666667%
## NAs                    0                 0                 0
## 0s                     0                 0                 0
## 
## Kruskal-Wallis rank sum test:
##   Kruskal-Wallis chi-squared = 69.378, df = 5, p-value = 1.38e-13
tapply(d$hibak.szama, d[,c("vezetes", "beszelgetes")], mean, na.rm = T)            # átlagok
##         beszelgetes
## vezetes  Nem volt Egyszerű Bonyolult
##   Könnyű    19.60    19.80     25.85
##   Nehéz     23.25    36.95     46.70
tapply(d$hibak.szama, d[,c("vezetes", "beszelgetes")], sd, na.rm = T)              # szórások
##         beszelgetes
## vezetes  Nem volt Egyszerű Bonyolult
##   Könnyű 6.107803 8.507582  6.627495
##   Nehéz  8.961174 8.274724  8.013804
tapply(d$hibak.szama, d[,c("vezetes", "beszelgetes")], function(x) sum(!is.na(x))) # csoportok elemszáma
##         beszelgetes
## vezetes  Nem volt Egyszerű Bonyolult
##   Könnyű       20       20        20
##   Nehéz        20       20        20

Grafikus vizsgálatok. A fenti átlagok jobban áttekinthetők átlagábrák segítségével.

library(PASWR2)
twoway.plots(Y = d$hibak.szama, fac1 = d$beszelgetes, fac2 = d$vezetes)

library(yarrr)
pirateplot(formula = hibak.szama ~ vezetes * beszelgetes, data = d, hdi.o = 0, line.o = 0,
           theme.o = 1, pal = "google")

library(ggplot2)
pd <- position_dodge(0.1) 
pic.d.gog.1 <- ggplot(data=d, aes(x=beszelgetes, y=hibak.szama, colour=vezetes)) + 
  stat_summary(fun.data=mean_cl_normal, geom="line", size=1, aes(group=vezetes), position=pd) +
  stat_summary(fun.data=mean_cl_normal, geom="errorbar", size=1, width=0.1, position=pd) + 
  stat_summary(fun.y=mean, geom="point", size=4, shape=21, fill="white", position=pd) +  
  coord_cartesian(ylim = c(0, 50)) + theme_bw() + labs(x="Beszélgetés", y="Idő") +
  scale_color_discrete(guide = guide_legend(title = "Vezetési feladat"))
pic.d.gog.1

A fenti átlagábrákról az egyes csoportok átlagai leolvashatók, de az interakció ténye is világossá válik.

Alkalmazási feltételek. A kétszempontos varianciaelemzés egyik alkalmazási feltétele a szóráshomogenitás, amely a Levene-próbával vizsgálható. A DescTools csomag LeveneTest() függvényének megadhatjuk a modellformulát.

library(DescTools)
LeveneTest(hibak.szama ~ vezetes * beszelgetes, data = d, center = mean)
## Levene's Test for Homogeneity of Variance (center = mean)
##        Df F value Pr(>F)
## group   5  0.4816 0.7894
##       114

A Levene-próba igazolta, hogy a szóráshomogenitási feltétel fenáll (\(F(5,114)=0,4816; p=0,7894\)).

A kétszempontos varianciaelemzés másik feltétele, hogy két faktor által meghatározott összes csoportban a függő változó közelítőleg normalis eloszlást kövessen. A Shapiro–Wilk-próbákat a shapiro.test() függvénnyel hajtjuk végre.

by(d$hibak.szama, d[,c("vezetes", "beszelgetes")], shapiro.test)
## vezetes: Könnyű
## beszelgetes: Nem volt
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.93135, p-value = 0.1639
## 
## -------------------------------------------------------- 
## vezetes: Nehéz
## beszelgetes: Nem volt
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.93849, p-value = 0.2245
## 
## -------------------------------------------------------- 
## vezetes: Könnyű
## beszelgetes: Egyszerű
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.9749, p-value = 0.8531
## 
## -------------------------------------------------------- 
## vezetes: Nehéz
## beszelgetes: Egyszerű
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.97188, p-value = 0.794
## 
## -------------------------------------------------------- 
## vezetes: Könnyű
## beszelgetes: Bonyolult
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.9141, p-value = 0.07634
## 
## -------------------------------------------------------- 
## vezetes: Nehéz
## beszelgetes: Bonyolult
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.97483, p-value = 0.8516

A fenti Shapiro–Wilk-próbák igazolják a normalitási feltétel teljesülését (mindegyik csoportban \(p>0,07\)).

A normalitást a reziduumok esetében is ellenőrizzük! A residuals() függvénnyel az illesztett modellből kinyerhetők a reziduumok, melyekre grafikus módszerrel és Shapiro–Wilk-próbával is ellenőrizhetjük a normalitási feltételt.

aov.d <- aov(hibak.szama ~ vezetes * beszelgetes, data = d)  # a modell illesztése
aov.d.residuals <- residuals(object = aov.d)                 # reziduumok kiszámítása   
par(mfrow=c(1,2))
hist(aov.d.residuals)                                        # hisztogram a reziduumokra  
qqnorm(aov.d.residuals); qqline(aov.d.residuals)             # QQ-ábra a reziduumokra

par(mfrow=c(1,1))
shapiro.test(aov.d.residuals)                                # Shapiro-Wilk-próba a reziduumokra
## 
##  Shapiro-Wilk normality test
## 
## data:  aov.d.residuals
## W = 0.99377, p-value = 0.8738

A fenti ábrák és a Shapiro–Wilk-próba (\(W=0,9938; p=0,8783\)) is alátámasztja, hogy az reziduumok normalitása nem sérül.

Kétszempontos varianciaelemzés végrehajtása. A kétszempontos varianciaelemzés az aov() függvénnyel is végrehajtható, ahol a modell argumentum: formula=hibak.szama~vezetes*beszelgetes. Az ANOVA táblázatot a summary() függvénnyel kérhetjük le.

aov.d <- aov(formula = hibak.szama ~ vezetes * beszelgetes, data = d)
summary(aov.d)
##                      Df Sum Sq Mean Sq F value   Pr(>F)
## vezetes               1   5782    5782   94.64  < 2e-16
## beszelgetes           2   4416    2208   36.14 6.98e-13
## vezetes:beszelgetes   2   1639     820   13.41 5.86e-06
## Residuals           114   6965      61

A kétszempontos varianciaelemzés eredménye azt mondhatjuk, hogy a vezetési feladat nehézsége szignifikánsan hat a hibázások számára (\(F(1, 114)=94,64; p<0,0001\)), valamint a beszélgetés faktor is szignifikáns főhatású (\(F(2, 114)=36,14; p<0,0001\)). Az két faktor interakciója is szignifikáns (\(F(2, 114)=13,41; p<0,0001\)), vagyis a vezetési feladat nehézségének hatását a hibázások számára módosítja a beszélgetés faktor. A korábban megrajzolt átlagábrákról leolvasható az interakció hatása: a beszélgetés bonyolultságának növekedése mentén megemelkedik a könnyű és nehéz vezetési feladat közötti hibázások számának különbsége, vagyis a bonyolultabb telefonbeszélgetés erősíti a hibázások számának növekedését.

Kétszempontos varianciaelemzés utóelemzése.

Mutassuk ki számszerűen is ezt az erősítő hatást egyszerű hatások (simple effect) vizsgálatával. Szűréssel hozzuk létre a telefonbeszélgetés faktor alapján a minta három csoportját (d.1, d.2 és d.3). Ezekre az almintákra vizsgáljuk meg a vezetési feladat nehézségének hatását. Mivel a vezetes két szinttel rendelkezik, a userfriendlyscience csomag oneway() függvénye mellett az lsr csomag independentSamplesTTest() függvényével is bemutatjuk az egyszerű hatások vizsgálatát.

library(userfriendlyscience)
d.1 <- d[d$beszelgetes=="Nem volt",]
d.2 <- d[d$beszelgetes=="Egyszerű",]
d.3 <- d[d$beszelgetes=="Bonyolult",]
oneway(y = d.1$hibak.szama, x = d.1$vezetes, digits = 4, pvalueDigits = 4)
## ### Oneway Anova for y=hibak.szama and x=vezetes (groups: Könnyű, Nehéz)
## 
## Eta Squared: 95% CI = [0; 0.2002], point estimate = 0.0563
## 
##                                      SS Df      MS      F     p
## Between groups (error + effect) 133.225  1 133.225 2.2656 .1405
## Within groups (error only)      2234.55 38 58.8039
oneway(y = d.2$hibak.szama, x = d.2$vezetes, digits = 4, pvalueDigits = 4)
## ### Oneway Anova for y=hibak.szama and x=vezetes (groups: Könnyű, Nehéz)
## 
## Eta Squared: 95% CI = [0.3245; 0.6422], point estimate = 0.5236
## 
##                                       SS Df       MS       F       p
## Between groups (error + effect) 2941.225  1 2941.225 41.7639 < .0001
## Within groups (error only)       2676.15 38   70.425
oneway(y = d.3$hibak.szama, x = d.3$vezetes, digits = 4, pvalueDigits = 4)
## ### Oneway Anova for y=hibak.szama and x=vezetes (groups: Könnyű, Nehéz)
## 
## Eta Squared: 95% CI = [0.519; 0.7608], point estimate = 0.679
## 
##                                       SS Df       MS       F       p
## Between groups (error + effect) 4347.225  1 4347.225 80.3964 < .0001
## Within groups (error only)       2054.75 38  54.0724
library(lsr)
independentSamplesTTest(formula = hibak.szama ~ vezetes, data = d.1, var.equal = T)
## 
##    Student's independent samples t-test 
## 
## Outcome variable:   hibak.szama 
## Grouping variable:  vezetes 
## 
## Descriptive statistics: 
##             Könnyű  Nehéz
##    mean     19.600 23.250
##    std dev.  6.108  8.961
## 
## Hypotheses: 
##    null:        population means equal for both groups
##    alternative: different population means in each group
## 
## Test results: 
##    t-statistic:  -1.505 
##    degrees of freedom:  38 
##    p-value:  0.141 
## 
## Other information: 
##    two-sided 95% confidence interval:  [-8.559, 1.259] 
##    estimated effect size (Cohen's d):  0.476
independentSamplesTTest(formula = hibak.szama ~ vezetes, data = d.2, var.equal = T)
## 
##    Student's independent samples t-test 
## 
## Outcome variable:   hibak.szama 
## Grouping variable:  vezetes 
## 
## Descriptive statistics: 
##             Könnyű  Nehéz
##    mean     19.800 36.950
##    std dev.  8.508  8.275
## 
## Hypotheses: 
##    null:        population means equal for both groups
##    alternative: different population means in each group
## 
## Test results: 
##    t-statistic:  -6.463 
##    degrees of freedom:  38 
##    p-value:  <.001 
## 
## Other information: 
##    two-sided 95% confidence interval:  [-22.522, -11.778] 
##    estimated effect size (Cohen's d):  2.044
independentSamplesTTest(formula = hibak.szama ~ vezetes, data = d.3, var.equal = T)
## 
##    Student's independent samples t-test 
## 
## Outcome variable:   hibak.szama 
## Grouping variable:  vezetes 
## 
## Descriptive statistics: 
##             Könnyű  Nehéz
##    mean     25.850 46.700
##    std dev.  6.627  8.014
## 
## Hypotheses: 
##    null:        population means equal for both groups
##    alternative: different population means in each group
## 
## Test results: 
##    t-statistic:  -8.966 
##    degrees of freedom:  38 
##    p-value:  <.001 
## 
## Other information: 
##    two-sided 95% confidence interval:  [-25.557, -16.143] 
##    estimated effect size (Cohen's d):  2.835

A telefont nem használók körében nem volt szignifikáns különbség a hibázások számában (egyszempontos varianciaelemzés: \(\eta^2=0,06; F(1,38)=2,2656; p=0,1405\); kétmintás t-próba: Cohen-d\(=0,48; t=-1,505; p=0,141\)). Az egyszerű telefonbeszélgetést folytatók körében már szignifikáns a különbség a két vezetési feladat esetében (egyszempontos varianciaelemzés: \(\eta^2=0,52; F(1,38)=41,7639; p<0,0001\); kétmintás t-próba: Cohen-d\(=2,04; t=-6,463; p<0,001\)). A bonyolult telefonbeszélgetést folytatók körében is szignifikáns a különbség a hibázások számában, de a vezetési feladat nehézségének hatása tovább nő (egyszempontos varianciaelemzés: \(\eta^2=0,68; F(1,38)=80,3964; p<0,0001\); kétmintás t-próba: Cohen-d\(=2,84; t=-8,966; p<0,001\)).

Alternatívák kétszempontos varianciaelemzésre. Használjuk a lessR csomag ANOVA() függvényét!

library(lessR)
ANOVA(my.formula = hibak.szama ~ vezetes * beszelgetes, data = d)   # kétszempontos varianciaelemzés

##   BACKGROUND
## 
## Response Variable: hibak.szama 
##  
## Factor Variable 1: vezetes 
##   Levels: Könnyű Nehéz 
##  
## Factor Variable 2: beszelgetes 
##   Levels: Nem volt Egyszerű Bonyolult 
##  
## Number of cases (rows) of data:  120 
## Number of cases retained for analysis:  120 
##  
## The design is balanced 
##  
## Two-way Between Groups ANOVA 
## 
## 
##   DESCRIPTIVE STATISTICS 
## 
## Cell Sample Size: 20 
## 
## 
##              vezetes 
##  beszelgetes Könnyű Nehéz 
##     Nem volt  19.60 23.25 
##     Egyszerű  19.80 36.95 
##    Bonyolult  25.85 46.70 
## 
## 
## vezetes 
## ---------------- 
##     Könnyű Nehéz 
##   1  21.75 35.63 
##  
## beszelgetes 
## ------------------------------- 
##     Nem.volt Egyszerű Bonyolult 
##   1    21.43    28.38     36.27 
## 
## 
## 28.692 
## 
## 
##              vezetes 
##  beszelgetes Könnyű Nehéz 
##     Nem volt   6.11  8.96 
##     Egyszerű   8.51  8.27 
##    Bonyolult   6.63  8.01 
## 
## 
##   BASIC ANALYSIS
## 
##                      df    Sum Sq   Mean Sq   F-value   p-value 
##             vezetes   1   5782.41   5782.41     94.64    0.0000 
##         beszelgetes   2   4416.47   2208.23     36.14    0.0000 
## vezetes:beszelgetes   2   1639.27    819.63     13.41    0.0000 
##           Residuals 114   6965.45     61.10 
## 
## 
## Partial Omega Squared for vezetes: 0.44 
## Partial Omega Squared for beszelgetes: 0.37 
## Partial Omega Squared for vezetes & beszelgetes: 0.17 
##  
## Cohen's f for vezetes: 0.88 
## Cohen's f for beszelgetes: 0.77 
## Cohen's f for vezetes_&_beszelgetes: 0.45 
## 
## 
##  
## Family-wise Confidence Level: 0.95 
## 
## Factor: vezetes 
## -------------------------------------- 
##                 diff   lwr   upr p adj 
##   Nehéz-Könnyű 13.88 11.06 16.71  0.00 
## 
## Factor: beszelgetes 
## -------------------------------------------- 
##                       diff   lwr   upr p adj 
##    Egyszerű-Nem volt  6.95  2.80 11.10  0.00 
##   Bonyolult-Nem volt 14.85 10.70 19.00  0.00 
##   Bonyolult-Egyszerű  7.90  3.75 12.05  0.00 
## 
## Cell Means 
## ------------------------------------------------------------ 
##                                      diff    lwr   upr p adj 
##     Nehéz:Nem volt-Könnyű:Nem volt   3.65  -3.52 10.82  0.68 
##    Könnyű:Egyszerű-Könnyű:Nem volt   0.20  -6.97  7.37  1.00 
##     Nehéz:Egyszerű-Könnyű:Nem volt  17.35  10.18 24.52  0.00 
##   Könnyű:Bonyolult-Könnyű:Nem volt   6.25  -0.92 13.42  0.12 
##    Nehéz:Bonyolult-Könnyű:Nem volt  27.10  19.93 34.27  0.00 
##     Könnyű:Egyszerű-Nehéz:Nem volt  -3.45 -10.62  3.72  0.73 
##      Nehéz:Egyszerű-Nehéz:Nem volt  13.70   6.53 20.87  0.00 
##    Könnyű:Bonyolult-Nehéz:Nem volt   2.60  -4.57  9.77  0.90 
##     Nehéz:Bonyolult-Nehéz:Nem volt  23.45  16.28 30.62  0.00 
##     Nehéz:Egyszerű-Könnyű:Egyszerű  17.15   9.98 24.32  0.00 
##   Könnyű:Bonyolult-Könnyű:Egyszerű   6.05  -1.12 13.22  0.15 
##    Nehéz:Bonyolult-Könnyű:Egyszerű  26.90  19.73 34.07  0.00 
##    Könnyű:Bonyolult-Nehéz:Egyszerű -11.10 -18.27 -3.93  0.00 
##     Nehéz:Bonyolult-Nehéz:Egyszerű   9.75   2.58 16.92  0.00 
##   Nehéz:Bonyolult-Könnyű:Bonyolult  20.85  13.68 28.02  0.00 
## 
## 
##   RESIDUALS
## 
## Fitted Values, Residuals, Standardized Residuals 
##    [sorted by Standardized Residuals, ignoring + or - sign] 
##    [res.rows = 20, out of 120 cases (rows) of data, or res.rows="all"] 
## ------------------------------------------------------------- 
##       vezetes beszelgetes hibak.szama fitted residual z-resid 
##    27   Nehéz    Nem volt          46  23.25    22.75    2.99 
##   112   Nehéz   Bonyolult          27  46.70   -19.70   -2.59 
##    48  Könnyű    Egyszerű           1  19.80   -18.80   -2.47 
##    77   Nehéz    Egyszerű          54  36.95    17.05    2.24 
##    91  Könnyű   Bonyolult          42  25.85    16.15    2.12 
##   116   Nehéz   Bonyolult          61  46.70    14.30    1.88 
##    54  Könnyű    Egyszerű          34  19.80    14.20    1.86 
##    66   Nehéz    Egyszerű          23  36.95   -13.95   -1.83 
##    74   Nehéz    Egyszerű          23  36.95   -13.95   -1.83 
##    21   Nehéz    Nem volt          10  23.25   -13.25   -1.74 
##    43  Könnyű    Egyszerű           7  19.80   -12.80   -1.68 
##    37   Nehéz    Nem volt          11  23.25   -12.25   -1.61 
##    51  Könnyű    Egyszerű          32  19.80    12.20    1.60 
##    52  Könnyű    Egyszerű          32  19.80    12.20    1.60 
##    65   Nehéz    Egyszerű          25  36.95   -11.95   -1.57 
##     5  Könnyű    Nem volt          31  19.60    11.40    1.50 
##     3  Könnyű    Nem volt          31  19.60    11.40    1.50 
##    40   Nehéz    Nem volt          12  23.25   -11.25   -1.48 
##    98  Könnyű   Bonyolult          37  25.85    11.15    1.46 
##   106   Nehéz   Bonyolult          36  46.70   -10.70   -1.40

8.3.3 Példa. Állatok memóriája.

Egy kísérletben állatok memória-folyamatait vizsgáljuk. A tanulási szakaszban az állatnak úgy kell átlépnie egy felfestett vonalon, hogy közben félelemkeltő ingert mutatunk be számára. Miután ezt többször megismételjük, következik a tesztfázis, ahol újra a vonal átlépése a feladata (félelemkeltő inger nélkül). Ekkor megmérjük, hogy a vonal átlépéséhez mennyi időre van szüksége, ez lesz a függő változó. Az állatokat három csoportba soroltuk abból a szempontból, hogy az agykéreg melyik részébe ültettünk be előzőleg elektródákat (Semleges terület, A terület, B terület). Mindegyik csoport tovább bomlik az elektromos stimuláció késleltetése (50, 100 és 150 ms) szerint, ugyanis a tanulás során a vonal átlépése és a félelemkeltő inger bemutatása után az elektródákon keresztül a késleltetési idő lejárta után stimuláltuk az adott agyterületet. Ha a stimulált agyterület része a memóriának, akkor a stimuláció feltételezhetően zavarja a tanulás folyamatát, így az állat minden nehézség nélkül fogja átlépni a vonalat. Varianciaelemzéssel vizsgáljuk meg, hogy a függő változó értékeit mely tényezők befolyásolják. Az adatok a következő táblázatok tartalmazzák.
Forrás: (Howell 2013, 456)

Semleges terület:

50 ms 100 ms 150 ms
25 30 28
30 25 31
28 27 26
40 35 20
20 23 35

A terület:

50 ms 100 ms 150 ms
11 31 23
18 20 28
26 22 35
15 23 27
14 19 21

B terület:

50 ms 100 ms 150 ms
23 18 28
30 24 21
18 9 30
28 16 30
23 13 23

Adatok beolvasása. Hozzuk létre be a fenti táblázatok alapján az egyes területekre vonatkozó mért adatokat (d.semleges, d.A.terulet és d.B.terulet), végezzük el a hosszú adatformára alakításukat, majd fűzzük őket össze egy d adattáblába.

d.semleges <- read.table(file = textConnection("
ms.50 ms.100 ms.150
25 30 28
30 25 31
28 27 26
40 35 20
20 23 35
"), header=T, sep="")
library(reshape2)
d.semleges <- melt(d.semleges, id.vars = NULL, value.name = "ido", variable.name = "varakozasi.ido") # szélesből- hosszú átalakítás
d.semleges$terulet <- "Semleges"       # a terület címke erre a csoportra

d.A.terulet <- read.table(file = textConnection("
ms.50 ms.100 ms.150
11 31 23
18 20 28
26 22 35
15 23 27
14 19 21
"), header=T, sep="")
library(reshape2)
d.A.terulet <- melt(d.A.terulet, id.vars = NULL, value.name = "ido", variable.name = "varakozasi.ido") # szélesből- hosszú átalakítás
d.A.terulet$terulet <- "A.terulet"    # a terület címke erre a csoportra

d.B.terulet <- read.table(file = textConnection("
ms.50 ms.100 ms.150
23 18 28
30 24 21
18 9 30
28 16 30
23 13 23
"), header=T, sep="")
library(reshape2)
d.B.terulet <- melt(d.B.terulet, id.vars = NULL, value.name = "ido", variable.name = "varakozasi.ido") # szélesből- hosszú átalakítás
d.B.terulet$terulet <- "B.terulet"    # a terület címke erre a csoportra

d <- rbind(d.semleges, d.A.terulet, d.B.terulet)                                            # adattábla létrehozása
d$terulet <- factor(d$terulet)                                                              # faktorrá konvertálás
d$terulet <- factor(d$terulet, levels = c("Semleges", "A.terulet", "B.terulet"))            # faktorszintek sorrendjének beállítása
d$varakozasi.ido <- factor(d$varakozasi.ido, levels = c("ms.50", "ms.100", "ms.150")) # faktorszintek sorrendjének beállítása
str(d)                   # adattábla szerkezete
## 'data.frame':    45 obs. of  3 variables:
##  $ varakozasi.ido: Factor w/ 3 levels "ms.50","ms.100",..: 1 1 1 1 1 2 2 2 2 2 ...
##  $ ido           : int  25 30 28 40 20 30 25 27 35 23 ...
##  $ terulet       : Factor w/ 3 levels "Semleges","A.terulet",..: 1 1 1 1 1 1 1 1 1 1 ...
d                        # adattábla tartalma   
##    varakozasi.ido ido   terulet
## 1           ms.50  25  Semleges
## 2           ms.50  30  Semleges
## 3           ms.50  28  Semleges
## 4           ms.50  40  Semleges
## 5           ms.50  20  Semleges
## 6          ms.100  30  Semleges
## 7          ms.100  25  Semleges
## 8          ms.100  27  Semleges
## 9          ms.100  35  Semleges
## 10         ms.100  23  Semleges
## 11         ms.150  28  Semleges
## 12         ms.150  31  Semleges
## 13         ms.150  26  Semleges
## 14         ms.150  20  Semleges
## 15         ms.150  35  Semleges
## 16          ms.50  11 A.terulet
## 17          ms.50  18 A.terulet
## 18          ms.50  26 A.terulet
## 19          ms.50  15 A.terulet
## 20          ms.50  14 A.terulet
## 21         ms.100  31 A.terulet
## 22         ms.100  20 A.terulet
## 23         ms.100  22 A.terulet
## 24         ms.100  23 A.terulet
## 25         ms.100  19 A.terulet
## 26         ms.150  23 A.terulet
## 27         ms.150  28 A.terulet
## 28         ms.150  35 A.terulet
## 29         ms.150  27 A.terulet
## 30         ms.150  21 A.terulet
## 31          ms.50  23 B.terulet
## 32          ms.50  30 B.terulet
## 33          ms.50  18 B.terulet
## 34          ms.50  28 B.terulet
## 35          ms.50  23 B.terulet
## 36         ms.100  18 B.terulet
## 37         ms.100  24 B.terulet
## 38         ms.100   9 B.terulet
## 39         ms.100  16 B.terulet
## 40         ms.100  13 B.terulet
## 41         ms.150  28 B.terulet
## 42         ms.150  21 B.terulet
## 43         ms.150  30 B.terulet
## 44         ms.150  30 B.terulet
## 45         ms.150  23 B.terulet

Leíróstatisztikai mutatók. A terulet és a varakozasi.ido faktor 3-3 szinttel rendelkezik, így összesen 9 csoportunk van. Határozzuk meg a tapply() függvénnyel ezekben a csoportokban az átlagokat, szórásokat és a csoportok mintaelemszámát!

tapply(d$ido, d[,c("terulet", "varakozasi.ido")], mean, na.rm = T)            # átlagok
##            varakozasi.ido
## terulet     ms.50 ms.100 ms.150
##   Semleges   28.6     28   28.0
##   A.terulet  16.8     23   26.8
##   B.terulet  24.4     16   26.4
tapply(d$ido, d[,c("terulet", "varakozasi.ido")], sd, na.rm = T)              # szórások
##            varakozasi.ido
## terulet        ms.50   ms.100   ms.150
##   Semleges  7.402702 4.690416 5.612486
##   A.terulet 5.718391 4.743416 5.403702
##   B.terulet 4.722288 5.612486 4.159327
tapply(d$ido, d[,c("terulet", "varakozasi.ido")], function(x) sum(!is.na(x))) # csoportok elemszáma
##            varakozasi.ido
## terulet     ms.50 ms.100 ms.150
##   Semleges      5      5      5
##   A.terulet     5      5      5
##   B.terulet     5      5      5

Grafikus vizsgálatok.

library(PASWR2)
twoway.plots(Y = d$ido, fac1 = d$terulet, fac2 = d$varakozasi.ido)

library(yarrr)
pirateplot(formula = ido ~ varakozasi.ido + terulet, data = d, hdi.o = 0, line.o = 0,
           theme.o = 1, pal = "google")

library(ggplot2)
pd <- position_dodge(0.1) 
pic.d.gog.1 <- ggplot(data=d, aes(x=terulet, y=ido, colour=varakozasi.ido)) + 
  stat_summary(fun.data=mean_cl_normal, geom="line", size=1, aes(group=varakozasi.ido), position=pd) +
  stat_summary(fun.data=mean_cl_normal, geom="errorbar", size=1, width=0.1, position=pd) + 
  stat_summary(fun.y=mean, geom="point", size=4, shape=21, fill="white", position=pd) +  
  coord_cartesian(ylim = c(0, 40)) + theme_bw() + labs(x="Terület", y="Idő") +
  scale_color_discrete(guide = guide_legend(title = "Várakozási idő"))
pic.d.gog.1

Kétszempontos varianciaelemzés végrehajtása.

aov.d <- aov(ido ~ terulet * varakozasi.ido, data = d)
summary(aov.d)
##                        Df Sum Sq Mean Sq F value  Pr(>F)
## terulet                 2  356.0  178.02   6.074 0.00534
## varakozasi.ido          2  188.6   94.29   3.217 0.05184
## terulet:varakozasi.ido  4  372.0   92.99   3.172 0.02482
## Residuals              36 1055.2   29.31

A kétszempontos varianciaelemzés szignifikáns főhatást mutatott ki a terület faktor esetében (\(F(2,36)=6,074; p=0,0053\)), míg a várakozási idő faktornak nincs hatása (\(F(2,36)=3,217; p=0,0518\)). A két faktor interakciója is szignifikáns (\(F(4,36)=3,172; p=0,0248\)).

Utóelemzés. A terület faktor szignifikáns főhatását vizsgáljuk meg közelebbről. Végezzünk Tukey-próbát a terület faktorra a TukeyHSD() függvénnyel, amelyben használjuk a which="terulet" argumentumot.

TukeyHSD(aov.d, which = "terulet")
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = ido ~ terulet * varakozasi.ido, data = d)
## 
## $terulet
##                            diff        lwr       upr     p adj
## A.terulet-Semleges  -6.00000000 -10.832140 -1.167860 0.0120787
## B.terulet-Semleges  -5.93333333 -10.765473 -1.101193 0.0131618
## B.terulet-A.terulet  0.06666667  -4.765473  4.898807 0.9993732

A Tukey-próba alapján azt mondhatjuk, hogy a Semleges területre beültetett elektródák esetében mért idő szignifikánsan különbözik az A területre és a B területre beültetett elektródák esetén mért időktől (mindkét esetben \(p<0,0132\)).

A szignifikáns interakció jellegét a 3 egyszempontos varianciaelemzéssel vizsgáljuk meg, a késleltetési idő három szintén.

d.ms.50 <- d[d$varakozasi.ido=="ms.50",]                       # szűrés, 50 ms 
d.ms.100 <- d[d$varakozasi.ido=="ms.100",]                     # szűrés, 100 ms
d.ms.150 <- d[d$varakozasi.ido=="ms.150",]                     # szűrés, 150 ms
aov.ms.50 <- aov(formula = ido ~ terulet, data = d.ms.50)      # egyszempontos varianciaelemzés, 50 ms
aov.ms.100 <- aov(formula = ido ~ terulet, data = d.ms.100)    # egyszempontos varianciaelemzés, 100 ms
aov.ms.150 <- aov(formula = ido ~ terulet, data = d.ms.150)    # egyszempontos varianciaelemzés, 150 ms
summary(aov.ms.50)                                             # ANOVA tábla, 50 ms   
##             Df Sum Sq Mean Sq F value Pr(>F)
## terulet      2  357.7   178.9   4.887  0.028
## Residuals   12  439.2    36.6
summary(aov.ms.100)                                            # ANOVA tábla, 100 ms   
##             Df Sum Sq Mean Sq F value  Pr(>F)
## terulet      2  363.3  181.67   7.171 0.00894
## Residuals   12  304.0   25.33
summary(aov.ms.150)                                            # ANOVA tábla, 150 ms
##             Df Sum Sq Mean Sq F value Pr(>F)
## terulet      2   6.93   3.467   0.133  0.876
## Residuals   12 312.00  26.000
TukeyHSD(aov.ms.50)                                            # utóelemzés, 50 ms
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = ido ~ terulet, data = d.ms.50)
## 
## $terulet
##                      diff        lwr       upr     p adj
## A.terulet-Semleges  -11.8 -22.007847 -1.592153 0.0238502
## B.terulet-Semleges   -4.2 -14.407847  6.007847 0.5334091
## B.terulet-A.terulet   7.6  -2.607847 17.807847 0.1579954
TukeyHSD(aov.ms.100)                                           # utóelemzés, 100 ms    
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = ido ~ terulet, data = d.ms.100)
## 
## $terulet
##                     diff       lwr       upr     p adj
## A.terulet-Semleges    -5 -13.49258  3.492583 0.2950432
## B.terulet-Semleges   -12 -20.49258 -3.507417 0.0069733
## B.terulet-A.terulet   -7 -15.49258  1.492583 0.1117572

Az egyszerű hatások vizsgálatából arra következtethetünk, hogy a 150 ms-os várakozási idő esetén nincs különbség a terület faktor által meghatározott csoportok időre vonatkozó várható értékei között (\(F(2,12)=0,133;p=0,876\)), míg a másik két terület csoport esetén az egyszempontos varianciaelemzés szignifikánsnak bizonyult(50 ms-os várakozási idő esetén: \(F(2,12)=4,887;p=0,028\), 100 ms-os várakozási idő esetén: \(F(2,12)=7,171;p=0,009\)). A végrehajtott Tukey-próbákból továbbá kiderül, hogy az 50 ms-os esetben a Semleges és az A terület közötti különbség (\(p=0,024\)), a 100 ms-os esetben Semleges és B terület közötti különbség szignifikáns (\(p=0,007\)).

Alternatíva kétszempontos varianciaelemzésre.

library(lessR)
ANOVA(my.formula = ido ~ terulet * varakozasi.ido, data = d)

##   BACKGROUND
## 
## Response Variable: ido 
##  
## Factor Variable 1: terulet 
##   Levels: Semleges A.terulet B.terulet 
##  
## Factor Variable 2: varakozasi.ido 
##   Levels: ms.50 ms.100 ms.150 
##  
## Number of cases (rows) of data:  45 
## Number of cases retained for analysis:  45 
##  
## The design is balanced 
##  
## Two-way Between Groups ANOVA 
## 
## 
##   DESCRIPTIVE STATISTICS 
## 
## Cell Sample Size: 5 
## 
## 
##                 terulet 
##  varakozasi.ido Semleges A.terulet B.terulet 
##           ms.50    28.60     16.80     24.40 
##          ms.100    28.00     23.00     16.00 
##          ms.150    28.00     26.80     26.40 
## 
## 
## terulet 
## -------------------------------- 
##     Semleges A.terulet B.terulet 
##   1    28.20     22.20     22.27 
##  
## varakozasi.ido 
## ----------------------- 
##     ms.50 ms.100 ms.150 
##   1 23.27  22.33  27.07 
## 
## 
## 24.222 
## 
## 
##                 terulet 
##  varakozasi.ido Semleges A.terulet B.terulet 
##           ms.50     7.40      5.72      4.72 
##          ms.100     4.69      4.74      5.61 
##          ms.150     5.61      5.40      4.16 
## 
## 
##   BASIC ANALYSIS
## 
##                        df    Sum Sq   Mean Sq   F-value   p-value 
##                terulet  2    356.04    178.02      6.07    0.0053 
##         varakozasi.ido  2    188.58     94.29      3.22    0.0518 
## terulet:varakozasi.ido  4    371.96     92.99      3.17    0.0248 
##              Residuals 36   1055.20     29.31 
## 
## 
## Partial Omega Squared for terulet: 0.18 
## Partial Omega Squared for varakozasi.ido: 0.09 
## Partial Omega Squared for terulet & varakozasi.ido: 0.16 
##  
## Cohen's f for terulet: 0.47 
## Cohen's f for varakozasi.ido: 0.31 
## Cohen's f for terulet_&_varakozasi.ido: 0.44 
## 
## 
##  
## Family-wise Confidence Level: 0.95 
## 
## Factor: terulet 
## ---------------------------------------------- 
##                        diff    lwr   upr p adj 
##    A.terulet-Semleges -6.00 -10.83 -1.17  0.01 
##    B.terulet-Semleges -5.93 -10.77 -1.10  0.01 
##   B.terulet-A.terulet  0.07  -4.77  4.90  1.00 
## 
## Factor: varakozasi.ido 
## -------------------------------------- 
##                  diff   lwr  upr p adj 
##    ms.100-ms.50 -0.93 -5.77 3.90  0.88 
##    ms.150-ms.50  3.80 -1.03 8.63  0.15 
##   ms.150-ms.100  4.73 -0.10 9.57  0.06 
## 
## Cell Means 
## ------------------------------------------------------------- 
##                                       diff    lwr   upr p adj 
##      A.terulet:ms.50-Semleges:ms.50 -11.80 -23.09 -0.51  0.03 
##      B.terulet:ms.50-Semleges:ms.50  -4.20 -15.49  7.09  0.95 
##      Semleges:ms.100-Semleges:ms.50  -0.60 -11.89 10.69  1.00 
##     A.terulet:ms.100-Semleges:ms.50  -5.60 -16.89  5.69  0.78 
##     B.terulet:ms.100-Semleges:ms.50 -12.60 -23.89 -1.31  0.02 
##      Semleges:ms.150-Semleges:ms.50  -0.60 -11.89 10.69  1.00 
##     A.terulet:ms.150-Semleges:ms.50  -1.80 -13.09  9.49  1.00 
##     B.terulet:ms.150-Semleges:ms.50  -2.20 -13.49  9.09  1.00 
##     B.terulet:ms.50-A.terulet:ms.50   7.60  -3.69 18.89  0.42 
##     Semleges:ms.100-A.terulet:ms.50  11.20  -0.09 22.49  0.05 
##    A.terulet:ms.100-A.terulet:ms.50   6.20  -5.09 17.49  0.68 
##    B.terulet:ms.100-A.terulet:ms.50  -0.80 -12.09 10.49  1.00 
##     Semleges:ms.150-A.terulet:ms.50  11.20  -0.09 22.49  0.05 
##    A.terulet:ms.150-A.terulet:ms.50  10.00  -1.29 21.29  0.12 
##    B.terulet:ms.150-A.terulet:ms.50   9.60  -1.69 20.89  0.15 
##     Semleges:ms.100-B.terulet:ms.50   3.60  -7.69 14.89  0.98 
##    A.terulet:ms.100-B.terulet:ms.50  -1.40 -12.69  9.89  1.00 
##    B.terulet:ms.100-B.terulet:ms.50  -8.40 -19.69  2.89  0.29 
##     Semleges:ms.150-B.terulet:ms.50   3.60  -7.69 14.89  0.98 
##    A.terulet:ms.150-B.terulet:ms.50   2.40  -8.89 13.69  1.00 
##    B.terulet:ms.150-B.terulet:ms.50   2.00  -9.29 13.29  1.00 
##    A.terulet:ms.100-Semleges:ms.100  -5.00 -16.29  6.29  0.87 
##    B.terulet:ms.100-Semleges:ms.100 -12.00 -23.29 -0.71  0.03 
##     Semleges:ms.150-Semleges:ms.100   0.00 -11.29 11.29  1.00 
##    A.terulet:ms.150-Semleges:ms.100  -1.20 -12.49 10.09  1.00 
##    B.terulet:ms.150-Semleges:ms.100  -1.60 -12.89  9.69  1.00 
##   B.terulet:ms.100-A.terulet:ms.100  -7.00 -18.29  4.29  0.52 
##    Semleges:ms.150-A.terulet:ms.100   5.00  -6.29 16.29  0.87 
##   A.terulet:ms.150-A.terulet:ms.100   3.80  -7.49 15.09  0.97 
##   B.terulet:ms.150-A.terulet:ms.100   3.40  -7.89 14.69  0.98 
##    Semleges:ms.150-B.terulet:ms.100  12.00   0.71 23.29  0.03 
##   A.terulet:ms.150-B.terulet:ms.100  10.80  -0.49 22.09  0.07 
##   B.terulet:ms.150-B.terulet:ms.100  10.40  -0.89 21.69  0.09 
##    A.terulet:ms.150-Semleges:ms.150  -1.20 -12.49 10.09  1.00 
##    B.terulet:ms.150-Semleges:ms.150  -1.60 -12.89  9.69  1.00 
##   B.terulet:ms.150-A.terulet:ms.150  -0.40 -11.69 10.89  1.00 
## 
## 
##   RESIDUALS
## 
## Fitted Values, Residuals, Standardized Residuals 
##    [sorted by Standardized Residuals, ignoring + or - sign] 
##    [res.rows = 20, out of 45 cases (rows) of data, or res.rows="all"] 
## ----------------------------------------------------------- 
##        terulet varakozasi.ido   ido fitted residual z-resid 
##    4  Semleges          ms.50    40  28.60    11.40    2.35 
##   18 A.terulet          ms.50    26  16.80     9.20    1.90 
##    5  Semleges          ms.50    20  28.60    -8.60   -1.78 
##   28 A.terulet         ms.150    35  26.80     8.20    1.69 
##   14  Semleges         ms.150    20  28.00    -8.00   -1.65 
##   21 A.terulet         ms.100    31  23.00     8.00    1.65 
##   37 B.terulet         ms.100    24  16.00     8.00    1.65 
##   15  Semleges         ms.150    35  28.00     7.00    1.45 
##   38 B.terulet         ms.100     9  16.00    -7.00   -1.45 
##    9  Semleges         ms.100    35  28.00     7.00    1.45 
##   33 B.terulet          ms.50    18  24.40    -6.40   -1.32 
##   16 A.terulet          ms.50    11  16.80    -5.80   -1.20 
##   30 A.terulet         ms.150    21  26.80    -5.80   -1.20 
##   32 B.terulet          ms.50    30  24.40     5.60    1.16 
##   42 B.terulet         ms.150    21  26.40    -5.40   -1.12 
##   10  Semleges         ms.100    23  28.00    -5.00   -1.03 
##   25 A.terulet         ms.100    19  23.00    -4.00   -0.83 
##   26 A.terulet         ms.150    23  26.80    -3.80   -0.78 
##    1  Semleges          ms.50    25  28.60    -3.60   -0.74 
##   34 B.terulet          ms.50    28  24.40     3.60    0.74