library(moments)
skew <- skewness(airquality, na.rm = T)
n <- colSums(apply(airquality, 2, complete.cases))
ses <- sqrt((6*n*(n-1)) / ((n-2)*(n+1)*(n+3)))
critical <- qt(0.05, df=(n-1), lower.tail=F)
data.frame(skew, n, ses, sig=abs(skew)>critical*ses)
## skew n ses sig
## Ozone 1.225680663 116 0.2245612 TRUE
## Solar.R -0.423634197 146 0.2006795 TRUE
## Wind 0.344398467 153 0.1961246 TRUE
## Temp -0.374169579 153 0.1961246 TRUE
## Month -0.002367988 153 0.1961246 FALSE
## Day 0.002625783 153 0.1961246 FALSE
par(mfrow = c(2, 3))
for (i in 1:ncol(airquality)) {
boxplot(airquality[ ,i], ylab = names(airquality[i]), horizontal=T,
main = paste(names(airquality[i]), "Skew:", round(skew[i], 3)),
col = ifelse(abs(skew[i])>critical[i]*ses[i], "red", "steelblue"))
}

library(car)
boxcox <- powerTransform(airquality, family="yjPower", na.action(rm))
coef(boxcox)
## Ozone Solar.R Wind Temp Month Day
## 0.2236305 0.9604316 0.3077159 1.8375454 0.9133494 0.7605748
transformed <- bcPower(airquality, boxcox$lambda)
skewT <- skewness(transformed, na.rm = T)
data.frame(skewT, n, ses, sig=abs(skewT)>critical*ses)
## skewT n ses sig
## Ozone^0.22 0.02682566 116 0.2245612 FALSE
## Solar.R^0.96 -0.45615611 146 0.2006795 TRUE
## Wind^0.31 -0.51315302 153 0.1961246 TRUE
## Temp^1.84 -0.15172099 153 0.1961246 FALSE
## Month^0.91 -0.02117506 153 0.1961246 FALSE
## Day^0.76 -0.21008206 153 0.1961246 FALSE
par(mfrow = c(2, 3))
for (i in 1:ncol(airquality)) {
boxplot(transformed[ ,i], ylab = names(airquality[i]), horizontal=T,
main = paste(names(airquality[i]), "Skew:", round(skewT[i], 3)),
col = ifelse(abs(skewT[i])>critical[i]*ses[i], "red", "steelblue"))
}
