Skip to content

Commit a853185

Browse files
committed
Major bug fixed in deflation
1 parent 720e8d9 commit a853185

File tree

3 files changed

+43
-21
lines changed

3 files changed

+43
-21
lines changed

DESCRIPTION

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package: ddsPLS
2-
Version: 1.1.5
3-
Date: 2020-03-11
2+
Version: 1.1.6
3+
Date: 2020-03-18
44
Title: Data-Driven Sparse Partial Least Squares Robust to Missing Samples for Mono and Multi-Block Data Sets
55
Description: Allows to build Multi-Data-Driven Sparse Partial Least Squares models. Multi-blocks with
66
high-dimensional settings are particularly sensible to this. It comes with visualization

R/mddsPLS.R

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ MddsPLS_core <- function(Xs,Y,lambda=0,R=1,mode="reg",
5151
weight=FALSE,
5252
id_na=NULL,
5353
NZV=1e-9){
54-
5554
my_scale <- function(a){
5655
if(!is.matrix(a)){
5756
a <- as.matrix(a,ncol=1)
@@ -181,6 +180,12 @@ MddsPLS_core <- function(Xs,Y,lambda=0,R=1,mode="reg",
181180
u_t_r = u_t_r_0 <- list()
182181
t_r <- list()
183182
z_t=t_t <- list()
183+
for(k in 1:K){
184+
z_t[[k]]=t_t[[k]] <- matrix(NA,n,R)
185+
}
186+
for(r in 1:R){
187+
t_r[[r]] <- matrix(NA,n,K)
188+
}
184189
# BETA_r <- list()
185190
for(k in 1:K){
186191
if(norm(Ms[[k]])==0){
@@ -215,24 +220,37 @@ MddsPLS_core <- function(Xs,Y,lambda=0,R=1,mode="reg",
215220
}else{
216221
svd_k <- list(v=matrix(0,nrow = ncol(Ms[[k]]),ncol = R),
217222
d=rep(0,R))
223+
Phi_r <- list()
218224
for(r in 1:R){
219225
if(r==1){
220226
X_0 <- Xs[[k]]
221227
Y_0 <- Y
228+
Phi_r[[k]] <- diag(ps[k])
222229
}
223230
## Solve optimisation problem
224231
svd_ms_f_def <- svd(Ms[[k]],nu = 0,nv = 1)
225232
u_r_def <- svd_ms_f_def$v
226-
norm_st_sc <- svd_ms_f_def$d[1]
227-
if(norm_st_sc<NZV){
233+
norm_th_sc <- svd_ms_f_def$d[1]
234+
if(norm_th_sc<NZV){
228235
u_r_def <- u_r_def*0
229236
}
230-
svd_k$v[,r] <- u_r_def
231237
t_r_def <- mmultC(X_0,u_r_def)
238+
t_r[[r]][,k] <- t_r_def
239+
z_t[[k]][,r] <- mmultC(Ms[[k]],u_r_def)
240+
t_t[[k]][,r] <- mmultC(X_0,u_r_def)
241+
if(norm_th_sc>NZV){
242+
nrom_t_r_2 <- sum(t_r_def^2)
243+
bXr <- crossprod(t_r_def,X_0)/nrom_t_r_2
244+
if(r>1){
245+
u_r_def <- mmultC(Phi_r[[k]],u_r_def)
246+
}
247+
Phi_r[[k]] = mmultC(Phi_r[[k]],diag(ps[k])-mmultC(u_r_def,bXr))
248+
}
249+
svd_k$v[,r] <- u_r_def
232250
## Perform deflation
233251
norm_sc <- sum(t_r_def^2)
234252
svd_k$d[r] <- sqrt(norm_sc)
235-
if(norm_st_sc!=0){
253+
if(norm_th_sc!=0){
236254
X_0 <- X_0 - mmultC(t_r_def,crossprod(t_r_def,X_0))/norm_sc
237255
if(mode=="reg"){
238256
Y_0 <- Y_0 - mmultC(t_r_def,crossprod(t_r_def,Y_0))/norm_sc
@@ -252,21 +270,23 @@ MddsPLS_core <- function(Xs,Y,lambda=0,R=1,mode="reg",
252270
if(weight & svd_k$d[1]!=0){
253271
u_t_r[[k]] <- u_t_r[[k]]/length(which(rowSums(abs(u_t_r[[k]]))>NZV))
254272
}
255-
if(k==1){
256-
for(r in 1:R){
257-
t_r[[r]] <- matrix(0,n,K)
273+
if(!deflat & is.null(mu)){
274+
if(k==1){
275+
for(r in 1:R){
276+
t_r[[r]] <- matrix(0,n,K)
277+
}
258278
}
259-
}
260-
for(r in 1:R){
261-
if(svd_k$d[r]!=0){
262-
t_r[[r]][,k] <- mmultC(Xs[[k]],u_t_r[[k]][,r,drop=F])
279+
for(r in 1:R){
280+
if(svd_k$d[r]!=0){
281+
t_r[[r]][,k] <- mmultC(Xs[[k]],u_t_r[[k]][,r,drop=F])
282+
}
263283
}
284+
z_t[[k]] <- mmultC(Ms[[k]],u_t_r[[k]])
285+
# if(weight & svd_k$d[1]!=0){
286+
# z_t[[k]] <- z_t[[k]]/length(which(rowSums(abs(u_t_r[[k]]))>NZV))
287+
# }
288+
t_t[[k]] <- mmultC(Xs[[k]],u_t_r[[k]])#crossprod(Y,Xs[[k]]%*%u_t_r[[k]])
264289
}
265-
z_t[[k]] <- mmultC(Ms[[k]],u_t_r[[k]])
266-
# if(weight & svd_k$d[1]!=0){
267-
# z_t[[k]] <- z_t[[k]]/length(which(rowSums(abs(u_t_r[[k]]))>NZV))
268-
# }
269-
t_t[[k]] <- mmultC(Xs[[k]],u_t_r[[k]])#crossprod(Y,Xs[[k]]%*%u_t_r[[k]])
270290
}
271291
U_t_super = beta_list <- list()
272292
if(is.null(mu)){
@@ -355,7 +375,8 @@ MddsPLS_core <- function(Xs,Y,lambda=0,R=1,mode="reg",
355375
count_reg <- count_reg + 1
356376
}
357377
}
358-
Q <- mmultC(solve(crossprod(T_super_reg)+n*mu*diag(1,R*K)),
378+
regulMat_Inv <- solve(crossprod(T_super_reg)+n*mu*diag(1,R*K))
379+
Q <- mmultC(regulMat_Inv,
359380
crossprod(T_super_reg,Y))
360381
count_reg <- 1
361382
for(k in 1:K){

R/predict.mddsPLS.R

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ predict.mddsPLS <- function(object,newdata,type="y",...){
157157
else{
158158
T_super_new <- matrix(0,nrow=n_new,ncol=ncol(mod$T_super))
159159
for(k in 1:K){
160-
T_super_new <- T_super_new + newX[[k]]%*%mod_0$mod$u_t_super[[k]]
160+
t_k <- newX[[k]]%*%mod_0$mod$u_t_super[[k]]
161+
T_super_new <- T_super_new + t_k
161162
}
162163
df_new <- data.frame(T_super_new)# df_new <- data.frame(do.call(cbind,T_super_new))#%*%mod_0$mod$beta_comb)
163164
colnames(df_new) <- paste("X",2:(ncol(df_new)+1),sep="")

0 commit comments

Comments
 (0)