Hoe tweeweg-anova uit te voeren in r


Een tweewegs-ANOVA (“variantieanalyse”) wordt gebruikt om te bepalen of er al dan niet een statistisch significant verschil bestaat tussen de gemiddelden van drie of meer onafhankelijke groepen die over twee factoren zijn verdeeld.

In deze tutorial wordt uitgelegd hoe u een tweerichtings-ANOVA uitvoert in R.

Voorbeeld: Tweeweg-ANOVA in R

Laten we zeggen dat we willen bepalen of de trainingsintensiteit en het geslacht invloed hebben op het gewichtsverlies. In dit geval zijn de twee factoren waar we naar kijken lichaamsbeweging en geslacht , en is de responsvariabele gewichtsverlies, gemeten in kilo’s.

We kunnen een tweerichtings-ANOVA uitvoeren om te bepalen of lichaamsbeweging en geslacht invloed hebben op gewichtsverlies en om te bepalen of er een interactie bestaat tussen lichaamsbeweging en geslacht op gewichtsverlies.

We rekruteren 30 mannen en 30 vrouwen om deel te nemen aan een experiment waarbij we willekeurig 10 van elk een maand lang een programma zonder lichaamsbeweging, lichte lichaamsbeweging of intensief bewegen toewijzen.

De volgende code creëert het dataframe waarmee we zullen werken:

 #make this example reproducible
set.seed(10)

#create data frame
data <- data.frame(gender = rep(c("Male", "Female"), each = 30),
                   exercise = rep(c("None", "Light", "Intense"), each = 10, times = 2),
                   weight_loss = c(runif(10, -3, 3), runif(10, 0, 5), runif(10, 5, 9),
                                   runif(10, -4, 2), runif(10, 0, 3), runif(10, 3, 8)))

#view first six rows of data frame
head(data)

# gender exercise weight_loss
#1 Male None 0.04486922
#2 Male None -1.15938896
#3 Male None -0.43855400
#4 Male None 1.15861249
#5 Male None -2.48918419
#6 Male None -1.64738030

#see how many participants are in each group
table(data$gender, data$exercise)

# Intense Light None
# Female 10 10 10
# Male 10 10 10

Verken de gegevens

Voordat we zelfs maar het tweerichtings-ANOVA-model passen, kunnen we de gegevens beter begrijpen door de gemiddelde en standaardafwijking van het gewichtsverlies te vinden voor elk van de zes behandelingsgroepen met behulp van het dplyr- pakket:

 #load dplyr package
library(dplyr)

#find mean and standard deviation of weight loss for each treatment group
data %>%
  group_by (gender, exercise) %>%
  summarize (mean = mean(weight_loss),
            sd = sd(weight_loss))

# A tibble: 6 x 4
# Groups: gender [2]
# gender exercise means sd
#          
#1 Female Intense 5.31 1.02 
#2 Female Light 0.920 0.835
#3 Female None -0.501 1.77 
#4 Male Intense 7.37 0.928
#5 Male Light 2.13 1.22 
#6 Male None -0.698 1.12 

We kunnen ook een boxplot maken voor elk van de zes behandelingsgroepen om de verdeling van het gewichtsverlies voor elke groep te visualiseren:

 #set margins so that axis labels on boxplot don't get cut off
by(mar=c(8, 4.1, 4.1, 2.1))

#create boxplots
boxplot(weight_loss ~ gender:exercise,
data = data,
main = "Weight Loss Distribution by Group",
xlab = "Group",
ylab = "Weight Loss",
col = "steelblue",
border = "black", 
las = 2 #make x-axis labels perpendicular
)

We kunnen meteen zien dat de twee groepen die aan intensieve training deelnamen hogere gewichtsverlieswaarden lijken te hebben. We kunnen ook zien dat mannen doorgaans hogere gewichtsverlieswaarden hebben dan vrouwen in zowel de intensieve als de lichte trainingsgroepen.

Vervolgens passen we het tweerichtings-ANOVA-model aan onze gegevens toe om te zien of deze visuele verschillen daadwerkelijk statistisch significant zijn.

Passend bij het tweeweg ANOVA-model

De algemene syntaxis voor het aanpassen van een tweerichtings-ANOVA-model in R is:

aov(responsvariabele ~predictor_variable1 *predictor_variable2, data = dataset)

Merk op dat de * tussen de twee voorspellende variabelen aangeeft dat we ook willen testen op een interactie-effect tussen de twee voorspellende variabelen.

In ons voorbeeld kunnen we de volgende code gebruiken om het tweerichtings-ANOVA-model aan te passen, waarbij we gewichtsverlies gebruiken als de responsvariabele en geslacht en beweging als de twee voorspellende variabelen.

We kunnen vervolgens de functie summary() gebruiken om het resultaat van ons model weer te geven:

 #fit the two-way ANOVA model
model <- aov(weight_loss ~ gender * exercise, data = data)

#view the model output
summary(model)

# Df Sum Sq Mean Sq F value Pr(>F)    
#gender 1 15.8 15.80 11.197 0.0015 ** 
#exercise 2 505.6 252.78 179.087 <2e-16 ***
#gender:exercise 2 13.0 6.51 4.615 0.0141 *  
#Residuals 54 76.2 1.41                   
#---
#Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Uit de modelresultaten kunnen we zien dat geslacht , lichaamsbeweging en de interactie tussen de twee variabelen allemaal statistisch significant zijn op het significantieniveau van 0,05.

Het controleren van modelaannames

Voordat we verder gaan, moeten we verifiëren dat aan de aannames van ons model wordt voldaan, zodat onze modelresultaten betrouwbaar zijn. Een tweerichtings-ANOVA gaat met name uit van:

1. Onafhankelijkheid – de observaties van elke groep moeten onafhankelijk van elkaar zijn. Omdat we een gerandomiseerd ontwerp hebben gebruikt , zou aan deze veronderstelling moeten worden voldaan, dus we hoeven ons er niet al te veel zorgen over te maken.

2. Normaliteit – de afhankelijke variabele moet een ongeveer normale verdeling hebben voor elke combinatie van groepen van de twee factoren.

Eén manier om deze aanname te testen is door een histogram van de modelresiduen te maken. Als de residuen bij benadering normaal verdeeld zijn, moet aan deze aanname worden voldaan.

 #define model residuals
reside <- model$residuals

#create histogram of residuals
hist(resid, main = "Histogram of Residuals", xlab = "Residuals", col = "steelblue")

De residuen zijn bij benadering normaal verdeeld, dus we kunnen aannemen dat aan de normaliteitsaanname is voldaan.

3. Gelijke variantie – de varianties voor elke groep zijn gelijk of ongeveer gelijk.

Eén manier om deze aanname te controleren is door een Levene-test uit te voeren voor gelijkheid van varianties met behulp van het autopakket :

 #load car package
library(car)

#conduct Levene's Test for equality of variances
leveneTest(weight_loss ~ gender * exercise, data = data)

#Levene's Test for Homogeneity of Variance (center = median)
# Df F value Pr(>F)
#group 5 1.8547 0.1177
#54  

Omdat de p-waarde van de test groter is dan ons significantieniveau van 0,05, kunnen we aannemen dat aan onze aanname van gelijkheid van varianties tussen groepen wordt voldaan.

Analyseer behandelingsverschillen

Zodra we hebben geverifieerd dat aan de aannames van het model is voldaan, kunnen we een post-hoctest uitvoeren om precies te bepalen welke behandelingsgroepen van elkaar verschillen.

Voor onze post-hoc-test zullen we de functie TukeyHSD() gebruiken om de Tukey-test uit te voeren voor meerdere vergelijkingen:

 #perform Tukey's Test for multiple comparisons
TukeyHSD(model, conf.level=.95) 

#Tukey multiple comparisons of means
# 95% family-wise confidence level
#
#Fit: aov(formula = weight_loss ~ gender * exercise, data = data)
#
#$gender
# diff lwr upr p adj
#Male-Female 1.026456 0.4114451 1.641467 0.0014967
#
#$exercise
# diff lwr upr p adj
#Light-Intense -4.813064 -5.718493 -3.907635 0.0e+00
#None-Intense -6.938966 -7.844395 -6.033537 0.0e+00
#None-Light -2.125902 -3.031331 -1.220473 1.8e-06
#
#$`gender:exercise`
# diff lwr upr p adj
#Male:Intense-Female:Intense 2.0628297 0.4930588 3.63260067 0.0036746
#Female:Light-Female:Intense -4.3883563 -5.9581272 -2.81858535 0.0000000
#Male:Light-Female:Intense -3.1749419 -4.7447128 -1.60517092 0.0000027
#Female:None-Female:Intense -5.8091131 -7.3788841 -4.23934219 0.0000000
#Male:None-Female:Intense -6.0059891 -7.5757600 -4.43621813 0.0000000
#Female:Light-Male:Intense -6.4511860 -8.0209570 -4.88141508 0.0000000
#Male:Light-Male:Intense -5.2377716 -6.8075425 -3.66800066 0.0000000
#Female:None-Male:Intense -7.8719429 -9.4417138 -6.30217192 0.0000000
#Male:None-Male:Intense -8.0688188 -9.6385897 -6.49904786 0.0000000
#Male:Light-Female:Light 1.2134144 -0.3563565 2.78318536 0.2185439
#Female:None-Female:Light -1.4207568 -2.9905278 0.14901410 0.0974193
#Male:None-Female:Light -1.6176328 -3.1874037 -0.04786184 0.0398106
#Female:None-Male:Light -2.6341713 -4.2039422 -1.06440032 0.0001050
#Male:None-Male:Light -2.8310472 -4.4008181 -1.26127627 0.0000284
#Male:None-Female:None -0.1968759 -1.7666469 1.37289500 0.9990364

De p-waarde geeft aan of er al dan niet een statistisch significant verschil bestaat tussen elke groep.

In de laatste rij hierboven zien we bijvoorbeeld dat de groep mannen die niet trainde geen statistisch significant verschil in gewichtsverlies ervoer vergeleken met de groep vrouwen die niet trainde (p-waarde: 0,990364).

We kunnen ook de 95% betrouwbaarheidsintervallen visualiseren die het resultaat zijn van de Tukey-test met behulp van de plot()- functie in R:

 #set axis margins so labels don't get cut off
by(mar=c(4.1, 13, 4.1, 2.1))

#create confidence interval for each comparison
plot(TukeyHSD(model, conf.level=.95), las = 2)

Tweerichtings-ANOVA-resultaten rapporteren

Ten slotte kunnen we de resultaten van de tweeweg-ANOVA rapporteren op een manier die de resultaten samenvat:

Er werd een tweeweg-ANOVA uitgevoerd om de effecten van geslacht ( man, vrouw) en trainingsprogramma (geen, licht, intens) op gewichtsverlies te onderzoeken (gemeten in kilo’s). Er was een statistisch significante interactie tussen de effecten van geslacht en lichaamsbeweging op gewichtsverlies (F(2, 54) = 4,615, p = 0,0141). Post-hoc werden de HSD-tests van Tukey uitgevoerd.

Bij mannen resulteerde een intensief oefenprogramma in significant meer gewichtsverlies dan een licht programma (p < 0,0001) of geen oefenprogramma (p < 0,0001). Bovendien resulteerde een licht dieet bij mannen in een significant groter gewichtsverlies dan geen trainingsregime (p < 0,0001).

Bij vrouwen resulteerde een intensief oefenprogramma in significant meer gewichtsverlies dan een licht programma (p < 0,0001) of geen oefenprogramma (p < 0,0001).

Normaliteitscontroles en de Levene-test werden uitgevoerd om te verifiëren dat aan de aannames van de ANOVA werd voldaan.

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert