How do I interpret graphs of residuals to check if the assumptions of lm() / anova() are met? I need to run a one way ANOVA on some data (water_content) from 3 treatment groups (Water), but am struggling to interpret whether I need to transformation the data to make it appropriate for my lm() models. The outputs from the plots of my lm() model are included below:
The code I used was:
water_content_model <- lm(water_content~ Water, data=df)


If I was eyeballing the Normal Q-Q plot I would say it was not normally distributed, however when I performed the Shapiro-Wilk normality test it gave a non-significant p-value of 0.2169, indicating that the data is normally distributed. I also did the Shapiro-Wilk test on data that looked more normally distributed than this to me, but got a significant p-value indicating that it was not normally distributed. I am interpreting the graph and test results correctly?
If it is non-normally distributed, how do I correct for this before running the anova model?
The data is also non-orthogonal as there are a different number of samples from each treatment group so I have additionally run a Type III ANOVA as I read that this was appropriate for this:
water_content_aov <- aov(water_content~ Water, data= df)
Anova(water_content_aov, type = "III")
Is this appropriate for this data?

The distribution of residuals in the group modeled with a mean value of about 29 is striking. Unlike the other 2 groups it has no residuals close to 0, with almost all at least one full unit away from the mean. It seems to have much higher residual variance than the other 2 groups. That group probably is what led to your "eyeballing" assessment of the Q-Q plot as not normal. It also leads to the downward slope in the Scale-Location plot.
Although your groups aren't exactly the same size, a rough count of the data points indicates they aren't that different, so you shouldn't worry too much about that.
With only 3 groups and 3 pairwise comparisons total, a simple approach could be just to ignore that you did a preliminary ANOVA, do the 3 pairwise Welch t-tests that allow for unequal variances, and correct p-values for multiple comparisons. That test is reasonably robust to the normality assumption if there isn't skew in the residual distributions, which seems to be the case here.
I'd recommend that you study this thread and its links for potentially better ways to proceed when the assumptions of ANOVA aren't quite met. This answer deals with a 3-group setup similar to yours, showing how to use the oneway.test() extension of the Welch t-test or (preferred in that answer) generalized least squares.
