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)