Nothing
###################################################################
# plspolychaos R package
# Copyright INRA 2017
# INRA, UR1404, Research Unit MaIAGE
# F78350 Jouy-en-Josas, France.
#
# URL: http://cran.r-project.org/web/packages/plspolychaos
#
# This file is part of plspolychaos R package.
# This is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# See the GNU General Public License at:
# http://www.gnu.org/licenses/
#
# This file is a modified version of the one of the sivipm package
###################################################################
# regression pls2
# @title regression pls multivarie without missing
# @regpls2
# @param Y outputs data.frame
# @param dataX.exp inputs data.frame (expanded polynomial)
# @param nc number of components
# @return ret, R2y, Q2, Q2cum, PRESS
################################################################
regpls2 <- function(Y, dataX.exp, nc = 2) {
X <- as.matrix(dataX.exp)
n <- nrow(X)
p <- ncol(X)
YY <- as.matrix(Y)
q <- ncol(YY)
# centrage reduction
X.old <- scale(X)
YY.old <- scale(YY)
Xx <- X.old
YYy <- YY.old
T <- matrix(0, nrow = nc, ncol = n)
W <- matrix(0, nrow = nc, ncol = p)
P <- matrix(0, nrow = nc, ncol = p)
C <- matrix(0, nrow = nc, ncol = q)
U <- matrix(0, nrow = nc, ncol = n)
# Algo without missing values
ret <- fastregpls2nomissing(X.old, YY.old, C, P, T, U, W, n, p, q, nc)
# fonction pour apply
onek <- function( T, X, i.exist) {
return(cor(T[i.exist], X[i.exist]))
}
onej <- function(X, nc, T) {
# fonction pour apply
i.exist <- which(complete.cases(X))
cor.tx <- apply(T, 1, onek, X, i.exist)
return(cor.tx)
} # fin onej
cor.tx <- apply(X, 2, onej, nc, ret$T)
## cor.tx <- matrix(nrow = nc, ncol = p)
## for (j in 1:p) {
## i.exist <- which(complete.cases(X[, j]))
## # 1st solution
## for (k in 1:nc) {
## cor.tx[k, j] <- cor(ret$T[k, i.exist], X[i.exist, j])
## }
## }
R2x <- cor.tx^2
Rdx <- rowMeans(R2x)
cor.ty <- apply(YY, 2, onej, nc, ret$T)
## cor.ty <- matrix(nrow = nc, ncol = q)
## for (j in 1:q) {
## i.exist <- which(complete.cases(YY[, j]))
## # 1st solution
## for (k in 1:nc) {
## cor.ty[k, j] <- cor(ret$T[k, i.exist], YY[i.exist, j])
## }
## }
R2y <- cor.ty^2
Rdy <- rowMeans(R2y)
Rd.mat <- matrix(0, nc, nc)
for (j in 1:nc) {
Rd.mat[1:j, j] <- Rdy[1:j]
}
# predictions
mu.x <- attributes(Xx)$"scaled:center"
sd.x <- attributes(Xx)$"scaled:scale"
mu.y <- attributes(YYy)$"scaled:center"
sd.y <- attributes(YYy)$"scaled:scale"
# Not used: X.hat <- t(ret$T) %*% ret$P %*% diag(sd.x, p, p) + matrix(rep(mu.x, each = n), n, p)
# Not used: Dx <- sqrt(rowSums((X - X.hat)^2))
if (is.null(ret$YY.hat)) {
ret$YY.hat <- t(ret$T) %*% ret$C %*% diag(sd.y, q, q) + matrix(rep(mu.y,
each = n), n, q)
}
# Not used: Dy <- sqrt(rowSums((YY - YY.hat)^2))
# Q2cumule
Q2cum <- rep(0, nc)
Q2ckh <- matrix(NA, nrow = nc, ncol = ncol(YY))
for (h in 1:nc) {
a <- matrix(ret$PRESS[1:h, ]/ret$RSS[1:h, ], ncol = ncol(YY))
Q2ckh[h, ] <- 1 - apply(a, 2, prod)
Q2cum[h] <- 1 - prod(rowSums(ret$PRESS)[1:h]/rowSums(ret$RSS)[1:h])
if (h > 1) {
Q2cum[h] <- max(Q2cum[h], Q2cum[h - 1])
}
}
# The dimnames
labnc <- paste("c", 1:nc, sep = "")
if (is.null(colnames(YY)))
colnames(YY) <- paste("Y", 1:ncol(YY), sep = "")
if (is.null(colnames(X)))
colnames(X) <- paste("X", 1:ncol(X), sep = "")
dimnames(ret$Ws) <- list(paste("w*", 1:nc, sep = ""), colnames(X))
dimnames(cor.tx) <- list(paste("t", 1:nc, sep = ""), colnames(X))
dimnames(cor.ty) <- list(paste("t", 1:nc, sep = ""), colnames(YY))
# Not used dimnames(X.hat) <- list(1:n, colnames(X))
dimnames(ret$YY.hat) <- list(1:n, colnames(YY))
rownames(R2y) <- labnc
retour <- list(ret = ret, mweights = as.data.frame(ret$Ws), cor.tx = cor.tx,
cor.ty = cor.ty, mu.x = mu.x, sd.x = sd.x, mu.y = mu.y, sd.y = sd.y,
# Not used x.hat = X.hat,
y.hat = ret$YY.hat, R2x = R2x, R2y = R2y, PRESS = ret$PRESS)
# RSS has nc+1 rows
dimnames(ret$RSS) <- list(paste("c", 1:nrow(ret$RSS), sep = ""), colnames(YY))
retour$RSS <- ret$RSS
retour$PRESS <- ret$PRESS
dimnames(retour$PRESS) <- list(labnc, colnames(YY))
colnames(ret$Q2) <- colnames(YY)
retour$Q2 <- ret$Q2
# Q2 less than zero are set to zero
retour$Q2[retour$Q2 < 0] <- 0
rownames(retour$Q2) <- labnc
retour$Q2cum <- cbind(Q2ckh, Q2cum)
colQ2 <- paste("Q2-", colnames(retour$PRESS), sep = "")
colnames(retour$Q2cum) <- c(colQ2, "total-Q2cum")
rownames(retour$Q2cum) <- labnc
return(retour)
} # end regpls2
####################################################
####################################################
## calcbeta compute the beta
calcbeta <- function(W, P, C, nc, p) {
# p is the number of monomials
Ws <- matrix(nrow = nc, ncol = p)
Ws[1, ] <- W[1, ]
if (nc >= 2)
{
for (h in 2:nc) {
wt <- diag(1, p)
for (i in 1:(h - 1)) {
wt <- wt %*% (diag(1, p) - W[i, ] %o% P[i, ])
}
Ws[h, ] <- wt %*% W[h, ]
} # fin h
} # fin (nc >2 )
beta <- t(Ws) %*% C
return(beta)
}
####################################################
# calcbetaNat compute the natural beta
# Input
# beta: matrix nmonomes X nreponses
# YY: matrix nobs X nreponses
# X: matrix nobs X nmonomes
# Return
# betaNat: matrix nmonomes X nreponses
# betaNat0: vector nrep
# Internal function
calcbetaNat <- function(beta, YY, X, mu.x, sd.x, sd.y) {
nrep <- ncol(YY)
nmono <- nrow(beta)
betaNat0 <- rep(NA, nrep)
betaNat <- matrix(nrow = nmono, ncol = nrep)
for (irep in 1:nrep) {
som <- 0
for (imono in 1:nmono) {
fact <- sd.y[irep]/sd.x[imono]
betaNat[imono, irep] <- beta[imono, irep] * fact
som <- som + betaNat[imono, irep] * mu.x[imono]
}
betaNat0[irep] <- mean(YY[, irep], na.rm = TRUE) - som
}
return(list(betaNat = betaNat, betaNat0 = betaNat0))
} # end calcbetaNat
###################################################################
# Fast regression PLS without missing values
# Internal function
# h: first current component indice
# n: number of X and Y rows
# p: number of monomials (ncol(X))
# q: number of response variables (ncol(Y))
# nc: required number of components
# Return: C,P,T,U, W, RSS, PRESS, Q2, beta
fastregpls2nomissing <- function(X.old, YY.old, C, P, T, U, W, n, p, q, nc) {
seuil <- 1e-12
RSS <- matrix(0, nrow = nc + 1, ncol = q)
RSS[1, ] <- rep(n - 1, q)
PRESS <- matrix(NA, nc, q)
Q2 <- matrix(NA, nc, q)
Ws <- matrix(nrow = p, ncol = nc)
## save the genuine data and their mean and std
mu.y <- attributes(YY.old)$"scaled:center"
sd.y <- attributes(YY.old)$"scaled:scale"
YY <- YY.old
XX <- X.old
YY.hat <- matrix(NA, nrow = n, ncol = q)
beta <- matrix(NA, nrow = p, ncol = nc)
# Init
w.dif <- rep(0, p)
RSS <- matrix(0, nrow = nc + 1, ncol = q)
RSS[1, ] <- rep(n - 1, q)
u.new <- YY.old[, 1]
somunew <- sum(u.new^2)
w.old <- rep(1, p)
leRSS <- 0
# fin init
for (hcur in 1:nc) {
retC <- .C("boucleregpls", as.integer(n),
as.integer(p),
Xold=as.double(X.old),
YYold=as.double(YY.old),
W=as.double(W[hcur, ]),
as.double(w.old),
C=as.double(C[hcur,]),
U=as.double(u.new),
T=as.double(T[hcur, ]),
P=as.double(P[hcur, ]),
as.double(w.dif),
as.double(somunew),
RSS=as.double(leRSS))
RSS[hcur + 1, ] <- retC$RSS
## Maj des resultats
P[hcur, ] <- retC$P[1:p]
C[hcur, ] <- retC$C[1:q]
U[hcur, ] <- retC$U[1:n]
T[hcur, ] <- retC$T[1:n]
W[hcur, ] <-retC$W[1:p]
## Le C a modifie X.old et YY.old
# X.old <- X.old - t.new %*% t(p.new)
X.old <- matrix(retC$Xold, n, p)
# YY.old <- YY.old - t.new %*% t(c.new)
YY.old <- matrix(retC$YYold, n, q)
A <- T[1:hcur, , drop = FALSE] %*% t(T[1:hcur, , drop = FALSE])
## A is now a matrix (hcur X hcur)
A <- solve(A)
## A is now a matrix (hcur,hcur)
# Hii <- rep(0, n)
# for (i in 1:n) {
# Hii[i] = sum(A[i, ] * T[1:hcur, i])
# }
Hii <- rep(0, n)
retC <- .C("calcHii", as.integer(nc),
as.integer(hcur), as.integer(n),
as.double(T), as.double(A),
Hii=as.double(Hii))
YY.hat <- t(T[1:hcur, , drop = FALSE]) %*% C[1:hcur, , drop = FALSE] %*%
diag(sd.y, q, q) + matrix(rep(mu.y, each = n), n, q)
if (hcur == 1) {
Ws[, 1] <- W[1, , drop = FALSE]
} else {
wt <- diag(1, p)
for (i in 1:(hcur - 1)) {
wt <- wt %*% (diag(1, p) - W[i, ] %o% P[i, ])
}
Ws[, hcur] <- wt %*% W[hcur, ]
}
beta[, hcur] <- Ws[, 1:hcur, drop = FALSE] %*% C[1:hcur, , drop = FALSE]
# beta is a matrix (nmono,1)
YYz <- XX %*% beta[, hcur, drop = FALSE]
A <- (YY - YYz)
A <- (A * A)/(1 - retC$Hii)^2
## A is now a matrix (n, ncol(Y))
PRESS[hcur, ] <- colSums(A)
Q2[hcur, ] <- 1 - PRESS[hcur, ]/RSS[hcur, ]
} # fin hcur
ret <- list(C = C, P = P, T = T, U = U, W = W, RSS = RSS, PRESS = PRESS, Q2 = Q2,
Ws = t(Ws), YY.hat = YY.hat, beta = beta)
return(ret)
} # end fastreglps2nomissing
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.