Nothing
#' Univariate Partial Least Squares regression
#' @description
#' The function \code{d.spls.pls} performs the PLS1 dimensional reduction methodology using Wold's NIPALS algorithm. It is
#' a Dual-SPLS regression with the norm \deqn{\Omega(w)=||w||_2.}
#' @usage d.spls.pls(X,y,ncp,verbose=TRUE)
#' @param X a numeric matrix of predictors values of dimension \code{(n,p)}. Each row represents one observation and each column one predictor variable.
#' @param y a numeric vector or a one column matrix of responses. It represents the response variable for each observation.
#' @param ncp a positive integer. \code{ncp} is the number of Dual-SPLS components.
#' @param verbose a Boolean value indicating whether or not to display the iterations steps. Default value is \code{TRUE}.
#' @details
#'
#' The resulting solution for \eqn{w} and hence for the coefficients vector, in the PLS regression for one component is
#' \eqn{w=X^Ty}. In order to compute the next components, a deflation step is performed only considering the parts of
#' \eqn{X} that are orthogonal to the previous components.
#' @return A \code{list} of the following attributes
#' \item{Xmean}{the mean vector of the predictors matrix \code{X}.}
#' \item{scores}{the matrix of dimension \code{(n,ncp)} where \code{n} is the number of observations.The \code{scores} represents
#' the observations in the new component basis computed by the compression step
#' of the Dual-SPLS.}
#' \item{loadings}{the matrix of dimension \code{(p,ncp)} that represents the Dual-SPLS components.}
#' \item{Bhat}{the matrix of dimension \code{(p,ncp)} that regroups the regression coefficients for each component.}
#' \item{intercept}{the vector of intercept values for each component.}
#' \item{fitted.values}{the matrix of dimension \code{(n,ncp)} that represents the predicted values of \code{y}}
#' \item{residuals}{the matrix of dimension \code{(n,ncp)} that represents the residuals corresponding
#' to the difference between the responses and the fitted values.}
#' \item{type}{a character specifying the Dual-SPLS norm used. In this case it is \code{ridge}. }
#' @references
#' H. Wold. Path Models with Latent Variables: The NIPALS Approach. In H.M. Blalock et al., editor, Quantitative Sociology: International Perspectives on Mathematical and Statistical Model Building, pages 307–357. Academic Press, 1975.
#' @author Louna Alsouki François Wahl
#'
#' @examples
#' ### load dual.spls library
#' library(dual.spls)
#' ### constructing the simulated example
#' oldpar <- par(no.readonly = TRUE)
#' n <- 100
#' p <- 50
#' nondes <- 20
#' sigmaondes <- 0.5
#' data=d.spls.simulate(n=n,p=p,nondes=nondes,sigmaondes=sigmaondes)
#'
#' X <- data$X
#' y <- data$y
#'
#' #fitting the model
#' mod.dspls <- d.spls.pls(X=X,y=y,ncp=10,verbose=TRUE)
#'
#' str(mod.dspls)
#'
#' ### plotting the observed values VS predicted values for 6 components
#' plot(y,mod.dspls$fitted.values[,6], xlab="Observed values", ylab="Predicted values",
#' main="Observed VS Predicted for 6 components")
#' points(-1000:1000,-1000:1000,type='l')
#'
#' ### plotting the regression coefficients
#' par(mfrow=c(3,1))
#'
#' i=6
#' plot(1:dim(X)[2],mod.dspls$Bhat[,i],type='l',
#' main=paste(" PLS , ncp =", i),
#' ylab='',xlab='' )
#' par(oldpar)
#'
#' @export
#'
d.spls.pls<- function(X,y,ncp,verbose=TRUE)
{
###################################
# Dimensions
###################################
n=length(y) #Number of observations
p=dim(X)[2] #Number of variables
###################################
# Centering Data
###################################
Xm = apply(X, 2, mean) #Mean of X
Xc=X - rep(1,n) %*% t(Xm) #Centering predictor matrix
ym=mean(y) #Mean of y
yc=y-ym #Centering response vector
###################################
# Initialisation
###################################
WW=matrix(0,p,ncp) #Initialising W, the matrix of loadings
TT=matrix(0,n,ncp) #Initialising T, the matrix of scores
Bhat=matrix(0,p,ncp) #Initialising the matrix of coefficients
YY=matrix(0,n,ncp) #Initialising the matrix of coefficients
RES=matrix(0,n,ncp) #Initialising the matrix of coefficients
intercept=rep(0,ncp)
###################################
# Dual-SPLS
###################################
#Each step ic in -for loop- determine the icth column of each W, T and Bhat
Xdef=Xc #Initialising X for Deflation Step
for (ic in 1:ncp)
{
Z=t(Xdef)%*%yc #For cov(t(X)y,w)=0, w must be colinear to t(X)y ==> Z=t(X)y
Z=as.vector(Z)
Z2=d.spls.norm2(Z)
#########
mu=Z2 #
# calculating w,t at the optimum
w=Z/Z2
#Finding T
t=Xdef%*%w
t=t/d.spls.norm2(t)
WW[,ic]=w
TT[,ic]=t
#Deflation
Xdef=Xdef-t%*%t(t)%*%Xdef
#Coefficient vectors
R=t(TT[,1:ic,drop=FALSE])%*%Xc%*%WW[,1:ic,drop=FALSE]
R[row(R)>col(R)]<-0 # inserted for numerical stability
L=backsolve(R,diag(ic))
Bhat[,ic]=WW[,1:ic,drop=FALSE]%*%(L%*%(t(TT[,1:ic,drop=FALSE])%*%yc))
intercept[ic] = ym - Xm %*% Bhat[,ic]
#Predictions
YY[,ic]=X %*% Bhat[,ic] + intercept[ic]
RES[,ic]=y-YY[,ic]
# results iteration
if (verbose){
cat('PLS ic=',ic,'mu=',mu, '\n')
}
}
return(list(Xmean=Xm,scores=TT,loadings=WW,Bhat=Bhat,intercept=intercept,
fitted.values=YY,residuals=RES,type='pls'))
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.