I'm a beginner to using partial least squares analyses, so apologies if this question is a bit basic.
I've been trying out PLS models on my datasets and it usually says that a single component can explain most of the variance in my outcome (when using LOO or CV validation).
However, I've also tried simulating a dataset with 4 principle components with 20 indicators each, and 3 of those components independently predicting the outcome. However, when i run the PLS analyses it usually just says that a single component best explains the outcome variance (when using cross-validation to look at changes in residual error with adding additional components).
My Question Is: I'm confused why a single component solution is working equally well compared to 3 component solution for my simulated data below- as I think i've simulated 3 independent components explaining variance in Y, and a 4th component which is independent of Y.
Doing a principle component regression as expected does find that you need 3-4 components to best explain variance in the outcome, though i know this is not the same as PLS. I've also tried running sparse PLS analyses with mixOmics and found the same result...
N=10000 #Sample Size
#Simuating 4 factors with fixed component loadings.
set.seed(10)
Factor1_score =rnorm(N)
Factor1=sapply(runif(20,.7,1),function(x) Factor1_score*.8+rnorm(1000)) #I added the runif function so later i can simulate the effects of varying the degree to which variable loads onto its component- for now its fixed!
Factor2_score =rnorm(N)
Factor2=sapply(runif(20,.7,1),function(x) Factor2_score*.8+rnorm(1000))
Factor3_score =rnorm(N)
Factor3=sapply(runif(20,.7,1),function(x) Factor3_score*.8+rnorm(1000))
Factor4_score =rnorm(N)
Factor4=sapply(runif(20,.7,1),function(x) Factor4_score*.8+rnorm(1000))
#Bringing variables together
TestX=data.frame(scale(cbind.data.frame(Factor1,Factor2,Factor3,Factor4))) #data frame of predictors variables
colnames(TestX)=c(paste0("F1",1:ncol(Factor1)),paste0("F2",1:ncol(Factor2)),paste0("F3",1:ncol(Factor3)),paste0("F4",1:ncol(Factor4)))
#Simulating Outcome Component - predicted by 3 different factors
FactorY=Factor1_score*1+Factor2_score*.3+Factor3_score*.8+rnorm(N,sd=.6)
Yind=scale(data.frame(sapply(runif(10,.7,1),function(x) FactorY*x+rnorm(N))))
Yind_Mean=scale(data.frame(apply(Yind,1,mean)))
#Confirming that there are 4 components in the X matrix
psych::fa.parallel(TestX)
#PLS analysis with pls r package
pls_test=pls::plsr(as.matrix(I(Yind_Mean)) ~., 10, data = TestX, validation = "CV",scale=TRUE,center=TRUE)
summary(pls_test)
loadings(pls_test)
#PLS analysis with mixOmics r package
mixOmics_test=mixOmics::pls(cbind.data.frame(TestX),Yind_Mean, ncomp=c(4),scale=TRUE) #keepX=c(6,6))
mixOmics_test_cv=mixOmics::perf(mixOmics_test,validation="Mfold",nepeat=10)
#Principle component regression - as expected a 3-4 component solution works best
pcr_test=pls::pcr(as.matrix(I(Yind_Mean)) ~., 10, data = TestX, validation = "CV",scale=TRUE,center=TRUE)
summary(pcr_test)
loadings(pcr_test)