I have a dataset like the following (n=1400): register country PC1 CMT BD 0.528902409041985 CMT IN 0.659599336404661 CMT LK 0.424746884028921 CMT PK 0.617481735398022 CMT UK 0.432241778651171 CMT US 0.520006978931032 TWT BD -0.120412754435259 TWT IN -0.775416939396557 TWT LK -0.331060813776788 TWT PK -0.0476004644598422 TWT UK -0.751168065821314 TWT US -0.861747850448701 TXM BD -0.899207300872416 TXM IN -1.90230790510253 TXM LK 0.257287440181 TXM PK -1.3102770881823 WBF BD -0.38312607807368 WBF IN -1.4048106311512 WBF LK -0.238559559698407 WBF PK 0.0249239934526432 WBF UK -0.467017637887557 WBF US -0.423802534509881 WBS BD 1.53739431443881 WBS IN 0.275786018712733 WBS LK 1.32988601584956 WBS PK 1.68224760320901 WBS UK 1.6017172088108 WBS US 1.34625059689434 I am interested in ANOVA and if significant groups comparisons using `emmeans` package in R. `afex::check_homogeneiety` throws unequal variance warning for PC1. The residuals are not normally distributed as per `afex::check_noarmality`. See also qqplot below): [![Residuals qq plot][1]][1] Which means that I cannot use `anova()` and `emmeans` in one go like this: library(emmeans) m_dims <- lm(PC1 ~ register*country, data = dims) m_dims anova(m_dims) em_dims <- emmeans(m_dims, pairwise ~ country | register) See the sample output: Analysis of Variance Table Response: PC1 Df Sum Sq Mean Sq F value Pr(>F) register 4 776.63 194.157 468.6266 < 2.2e-16 *** country 5 20.55 4.111 9.9222 2.452e-09 *** register:country 18 33.39 1.855 4.4769 1.411e-09 *** Residuals 1372 568.43 0.414 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 And for `emmeans()$contrasts` (here only first two levels of `register`) register = CMT: contrast estimate SE df t.ratio p.value BD - IN -0.29759 0.129 1372 -2.312 0.1899 BD - LK 0.42673 0.129 1372 3.315 0.0121 BD - PK -0.05777 0.129 1372 -0.449 0.9977 BD - UK 0.07512 0.129 1372 0.584 0.9921 BD - US 0.13296 0.129 1372 1.033 0.9069 IN - LK 0.72432 0.129 1372 5.626 <.0001 IN - PK 0.23981 0.129 1372 1.863 0.4257 IN - UK 0.37271 0.129 1372 2.895 0.0445 IN - US 0.43055 0.129 1372 3.344 0.0109 LK - PK -0.48451 0.129 1372 -3.764 0.0024 LK - UK -0.35161 0.129 1372 -2.731 0.0698 LK - US -0.29377 0.129 1372 -2.282 0.2021 PK - UK 0.13290 0.129 1372 1.032 0.9071 PK - US 0.19073 0.129 1372 1.482 0.6762 UK - US 0.05783 0.129 1372 0.449 0.9977 register = TWT: contrast estimate SE df t.ratio p.value BD - IN -0.38951 0.129 1372 -3.026 0.0303 BD - LK -0.13149 0.129 1372 -1.021 0.9109 BD - PK -0.12868 0.129 1372 -1.000 0.9182 BD - UK 0.10248 0.129 1372 0.796 0.9682 BD - US 0.34901 0.129 1372 2.711 0.0737 IN - LK 0.25802 0.129 1372 2.004 0.3403 IN - PK 0.26083 0.129 1372 2.026 0.3279 IN - UK 0.49199 0.129 1372 3.822 0.0019 IN - US 0.73852 0.129 1372 5.737 <.0001 LK - PK 0.00281 0.129 1372 0.022 1.0000 LK - UK 0.23397 0.129 1372 1.817 0.4547 LK - US 0.48050 0.129 1372 3.733 0.0027 PK - UK 0.23116 0.129 1372 1.796 0.4689 PK - US 0.47769 0.129 1372 3.711 0.0029 UK - US 0.24653 0.129 1372 1.915 0.3932 So I decided to use bootstrapping to resample my data, apply `anova()` and `emmeans()` on each sample and calculate the usual statistics for `register, country, register*country`: `p-values, F statistic, degrees of freedom, R-sq` etc. from `anova()` output, and pair wise comparisons of each `country` level `(PK, UK, US, LK, IN, BD)` within each `register` level `(CMT, TWT, TXM, WBF, WBS)`. As per my very limited understanding of bootstrapping, I thought of averaging the resulting distributions to get each statistic, e.g. median `p-value` from all 1000 or more `anova()` outputs from my data samples. My questions: 1. Am I correct to assume that the `p-value` or any statistic obtained this way is a robust alternative to the one time output of `anova()` (or the subsequent `emmeans()`) as I showed above? 2. If my assumption is not correct, how should I proceed to apply bootstrap in this scenario? Before writing this post, I have consulted various blog posts and searched for ready-made solutions/functions in R but could not find anything suitable or convincing. Some references [An R script for bootstrap ANOVA and post hoc comparisons.][2] (I changed `lsmeans` to `emmeans` but it outputs same p-value for each post-hoc comparison which I do not understand why, so I left it). [Bootstrap resampling with tidymodels][3] [Bootstrap Anova][4]. [Bootstrap followup contrasts][5] (no ANOVA bootstrapping). [1]: https://i.sstatic.net/g3JDU.png [2]: https://gist.github.com/smancuso/c6a045e3972cd525f4a1 [3]: https://www.tidymodels.org/learn/statistics/bootstrap/ [4]: https://nadinespy.github.io/posts/2020/04/bootstrapping-function-for-2way-mixed-effects-ANOVA/ [5]: https://www.r-bloggers.com/2019/05/bootstraping-follow-up-contrasts-for-within-subject-anovas/