From 2921e6da65f56a12b2b0ae4af2083e7609309590 Mon Sep 17 00:00:00 2001
From: Julien Boccard <julien.boccard@unige.ch>
Date: Fri, 1 Nov 2019 09:59:10 +0100
Subject: [PATCH] Upload New File

---
 RVConsensusOPLS.m | 107 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 107 insertions(+)
 create mode 100644 RVConsensusOPLS.m

diff --git a/RVConsensusOPLS.m b/RVConsensusOPLS.m
new file mode 100644
index 0000000..67382c6
--- /dev/null
+++ b/RVConsensusOPLS.m
@@ -0,0 +1,107 @@
+function [modelCV]=RVConsensusOPLS(collection,Y,A,maxOrtholvs,nrcv,cvType,modelType,verbose)
+%
+%Consensus OPLS-DA with RV oefficients weighting and DQ2 computation for
+%discriminant analysis
+%JB 2012-2013
+%
+% modelCV=RVConsensusOPLS(collection,Y,1,10,100,'nfold','da',0);
+%
+% Reference:
+% J. Boccard, D.N. Rutledge
+% A consensus OPLS-DA strategy for multiblock Omics data fusion
+% Analytica Chimica Acta, 769, 30-39, 2013
+
+tStart = clock; 
+ntable=size(collection,2);
+nrow=size(collection(1).d,1) ; 
+W_mat=zeros(nrow,nrow);
+preProcK='mc';
+preProcY='mc';
+cvFrac=0.75;
+
+if strcmp(modelType,'reg')
+    Yc=koplsScale(Y,'mc','no');
+else
+    Yc.X=Y;
+end
+
+for ta=1:ntable
+	temp=koplsKernel(collection(ta).d,[],'p',1);
+    %xnorm(ta)=norm(collection(ta).d,'fro')^2;
+    xnorm(ta)=norm(temp,'fro');
+	AMat{ta}=temp/xnorm(ta);
+    RV(ta)=(RV_modified(AMat{ta},Yc.X)+1)/2;
+	W_mat=W_mat+RV(ta)*AMat{ta};
+end
+
+modelCV=ConsensusOPLSCV(W_mat,Y,A,maxOrtholvs,nrcv,cvType,preProcK,preProcY,cvFrac,modelType,verbose);
+
+Ylarg=size(Y,2);
+
+if strcmp(modelType,'da') % Search for the optimal model based on DQ2
+    for i=0:maxOrtholvs
+        for j=1:Ylarg
+         [dqq(i+1,j),PRESSD(i+1,j)] = DQ2(modelCV.cv.AllYhat(:,Ylarg*i+j),Y(:,j)); % Compute DQ2 index
+        end
+    end
+    dq2=mean(dqq,2);
+    index=A; %Minimum model size
+    while index<maxOrtholvs+A && dq2(index+1)-dq2(index)>0.01  % 1 percent DQ2 increase criterion
+        index=index+1;
+    end
+    modelCV.cv.DQ2Yhat=dq2;
+    modelCV.cv.OrthoLVsOptimalNum=index-A;
+    
+else % Search for the optimal model based on Q2Yhat
+    index=A; %Minimum model size
+    while index<maxOrtholvs+A && modelCV.cv.Q2Yhat(index+1)-modelCV.cv.Q2Yhat(index)>0.01  % 1 percent Q2 increase criterion
+        index=index+1;
+    end
+    modelCV.cv.OrthoLVsOptimalNum=index-A;
+end
+
+if modelCV.cv.OrthoLVsOptimalNum==0
+    OrthoLVsNum=1;
+else
+    OrthoLVsNum=modelCV.cv.OrthoLVsOptimalNum;
+end
+
+% Recompute the optimal model
+modelCV.koplsModel=koplsModel(W_mat,Y,A,OrthoLVsNum,preProcK,preProcY);
+
+% Adjust Yhat to the selected model size
+modelCV.cv.Yhat=modelCV.cv.AllYhat(:,(Ylarg*A)+(OrthoLVsNum*A):(Ylarg*A)+(OrthoLVsNum*A)+Ylarg-1);
+
+% Compute the blocks contributions for the selected model
+for j=1:ntable
+	for k=1:A
+        lambda(j,k)=modelCV.koplsModel.T(:,k)'*AMat{j}*modelCV.koplsModel.T(:,k);
+    end
+	for l=1:OrthoLVsNum
+        lambda(j,l+A)=modelCV.koplsModel.To(:,l)'*AMat{j}*modelCV.koplsModel.To(:,l);
+    end
+end
+
+modelCV.koplsModel.lambda_raw=lambda;
+
+for nb=1:size(lambda,2)
+	lambda(:,nb)=lambda(:,nb)/sum(lambda(:,nb));
+end
+modelCV.koplsModel.lambda=lambda;
+
+% Compute the loadings for the selected model size
+
+for ta=1:ntable
+    for m=1:A
+        loadings{ta,m}=collection(ta).d'*modelCV.koplsModel.T(:,m)/(modelCV.koplsModel.T(:,m)'*modelCV.koplsModel.T(:,m));
+    end
+    for n=1:OrthoLVsNum
+        loadings{ta,n+m}=collection(ta).d'*modelCV.koplsModel.To(:,n)/(modelCV.koplsModel.To(:,n)'*modelCV.koplsModel.To(:,n));
+    end
+end
+
+modelCV.RV=RV;
+modelCV.koplsModel.loadings=loadings;
+tStop = clock;
+%tElapsed = etime(tStop, tStart)
+%disp('Done!')
\ No newline at end of file
-- 
GitLab