Kruskal-Wallis test is a non-parametric alternative to the one-way ANOVA test. It extends the two-samples Wilcoxon test in the situation where there are more than two groups to compare. It’s recommended when the assumptions of one-way ANOVA test are not met.
This chapter describes how to compute the Kruskal-Wallis test using the R software. You will also learn how to calculate the effect size based on kruskal-Wallis H-statistic.
Make sure you have installed the following R packages:
tidyversefor data manipulation and visualization
ggpubrfor creating easily publication ready plots
rstatixprovides pipe-friendly R functions for easy statistical analyses.
Load the packages:
library(tidyverse) library(ggpubr) library(rstatix)
Here, we’ll use the built-in R data set named PlantGrowth. It contains the weight of plants obtained under a control and two different treatment conditions.
set.seed(1234) PlantGrowth %>% sample_n_by(group, size = 1)
## # A tibble: 3 x 2 ## weight group ## <dbl> <fct> ## 1 5.58 ctrl ## 2 6.03 trt1 ## 3 4.92 trt2
- Re-order the group levels:
PlantGrowth <- PlantGrowth %>% reorder_levels(group, order = c("ctrl", "trt1", "trt2"))
Compute summary statistics by groups:
PlantGrowth %>% group_by(group) %>% get_summary_stats(weight, type = "common")
## # A tibble: 3 x 11 ## group variable n min max median iqr mean sd se ci ## <fct> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 ctrl weight 10 4.17 6.11 5.16 0.743 5.03 0.583 0.184 0.417 ## 2 trt1 weight 10 3.59 6.03 4.55 0.662 4.66 0.794 0.251 0.568 ## 3 trt2 weight 10 4.92 6.31 5.44 0.467 5.53 0.443 0.14 0.317
Create a box plot of
ggboxplot(PlantGrowth, x = "group", y = "weight")
Question: We want to know if there is any significant difference between the average weights of plants in the 3 experimental conditions.
We’ll use the pipe-friendly
kruskal_test() function [rstatix package], a wrapper around the R base function
res.kruskal <- PlantGrowth %>% kruskal_test(weight ~ group) res.kruskal
## # A tibble: 1 x 6 ## .y. n statistic df p method ## * <chr> <int> <dbl> <int> <dbl> <chr> ## 1 weight 30 7.99 2 0.0184 Kruskal-Wallis
The eta squared, based on the H-statistic, can be used as the measure of the Kruskal-Wallis test effect size. It is calculated as follow :
eta2[H] = (H - k + 1)/(n - k); where
H is the value obtained in the Kruskal-Wallis test;
k is the number of groups;
n is the total number of observations (M. T. Tomczak and Tomczak 2014).
The eta-squared estimate assumes values from 0 to 1 and multiplied by 100 indicates the percentage of variance in the dependent variable explained by the independent variable.
The interpretation values commonly in published literature are: 0.01- < 0.06 (small effect), 0.06 - < 0.14 (moderate effect) and >= 0.14 (large effect).
PlantGrowth %>% kruskal_effsize(weight ~ group)
## # A tibble: 1 x 5 ## .y. n effsize method magnitude ## * <chr> <int> <dbl> <chr> <ord> ## 1 weight 30 0.222 eta2[H] large
A large effect size is detected, eta2[H] = 0.22.
From the output of the Kruskal-Wallis test, we know that there is a significant difference between groups, but we don’t know which pairs of groups are different.
A significant Kruskal-Wallis test is generally followed up by Dunn’s test to identify which groups are different. It’s also possible to use the Wilcoxon’s test to calculate pairwise comparisons between group levels with corrections for multiple testing.
Compared to the Wilcoxon’s test, the Dunn’s test takes into account the rankings used by the Kruskal-Wallis test. It also does ties adjustments.
- Pairwise comparisons using Dunn’s test:
# Pairwise comparisons pwc <- PlantGrowth %>% dunn_test(weight ~ group, p.adjust.method = "bonferroni") pwc
## # A tibble: 3 x 9 ## .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif ## * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr> ## 1 weight ctrl trt1 10 10 -1.12 0.264 0.791 ns ## 2 weight ctrl trt2 10 10 1.69 0.0912 0.273 ns ## 3 weight trt1 trt2 10 10 2.81 0.00500 0.0150 *
- Pairwise comparisons using Wilcoxon’s test:
pwc2 <- PlantGrowth %>% wilcox_test(weight ~ group, p.adjust.method = "bonferroni") pwc2
## # A tibble: 3 x 9 ## .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif ## * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr> ## 1 weight ctrl trt1 10 10 67.5 0.199 0.597 ns ## 2 weight ctrl trt2 10 10 25 0.063 0.189 ns ## 3 weight trt1 trt2 10 10 16 0.009 0.027 *
The pairwise comparison shows that, only trt1 and trt2 are significantly different (Wilcoxon’s test, p = 0.027).
There was a statistically significant differences between treatment groups as assessed using the Kruskal-Wallis test (p = 0.018). Pairwise Wilcoxon test between groups showed that only the difference between trt1 and trt2 group was significant (Wilcoxon’s test, p = 0.027)
# Visualization: box plots with p-values pwc <- pwc %>% add_xy_position(x = "group") ggboxplot(PlantGrowth, x = "group", y = "weight") + stat_pvalue_manual(pwc, hide.ns = TRUE) + labs( subtitle = get_test_label(res.kruskal, detailed = TRUE), caption = get_pwc_label(pwc) )
Tomczak, Maciej T., and Ewa Tomczak. 2014. “The Need to Report Effect Size Estimates Revisited. an Overview of Some Recommended Measures of Effect Size.” Trends in SportSciences.