# MinutePlot validation -- PLS regression (oliveoil, pls package)
# Install once (skip on later runs):
#   install.packages(c("pls"))   # exactly what THIS script uses

# Load packages (every session):
library(pls)

# Versions (compare against those stated on this page):
cat(R.version.string, "\n")
for (p in c("pls")) cat(p, as.character(packageVersion(p)), "\n")

# Load data:
data(oliveoil)                   # built-in to pls: 16 olive oils, 5 chemical measurements, 6 sensory scores
chem <- as.data.frame(unclass(oliveoil$chemical))   # Acidity, Peroxide, K232, K270, DK   (or: read.csv("oliveoil_chemical.csv"))
sens <- as.data.frame(unclass(oliveoil$sensory))    # yellow, green, brown, glossy, transp, syrup   (or: read.csv("oliveoil_sensory.csv"))
d    <- data.frame(chem, yellow = sens$yellow)

# Analysis (one print per table shown on the page, in page order):
fit <- plsr(yellow ~ Acidity + Peroxide + K232 + K270 + DK, data = d, ncomp = 3, scale = TRUE)
print(explvar(fit))                                          # X variance per component (%)
print(round(R2(fit, estimate = "train")$val, 4))             # cumulative R2 of yellow
print(round(loadings(fit)[, 1:3], 4))                        # X loadings
print(round(coef(fit, ncomp = 3, intercept = FALSE), 4))     # coefficients per SD of each predictor (scale = TRUE)
