comparison pcaFactoMineR_functions.R @ 0:7acfb3bdad66 draft default tip

planemo upload commit a2411926bebc2ca3bb31215899a9f18a67e59556
author vmarcon
date Thu, 18 Jan 2018 07:57:36 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:7acfb3bdad66
1 #################### fonctions utilisées #####################################################
2
3 standardisation <- function(rawX,centrage=TRUE,scaling=c("none","uv","pareto"))
4 {
5 # rawX : matrice nxp contenant les données brutes
6 # Forme à confirmer avec SLA colonne 1 = identifiant,colonne 2 = facteur biologique???
7 # Si oui "supprimer" ces 2 colonnes pour n'avoir que variables quantitatives
8 # centrage = parametre booleen (TRUE/FALSE),par défaut = TRUE,indiquant si centrage donnees à faire
9 # scaling = nom de la methode de standardisation à appliquer aux donnees
10 # none = aucune standardisation
11 # uv = division par ecart type
12 # pareto = division par racine carree ecart type
13 # scaledX : matrice nxp contenant les variables quantitatives standardisees (centrage +/- scaling)
14 scaledX <- prep(rawX,center=centrage,scale=scaling)
15 return(scaledX)
16 }
17
18 ###############################################################################################
19 plot_ebouli <- function(res.PCA,mt,cexc)
20 {
21 # res.PCA résultat de l'ACP est renvoyé par la fonction PCA (factoMineR) de type list contient
22 # l'ensemble des résultats dont les valeurs propres et % variance assicées à chaque cp
23 # La fonction plot les valeurs propres et les % de variance
24 # expliquée par chaque composante et la variance cumulée
25
26 eig <- res.PCA$eig
27 barplot(eig[[1]])
28 #abline(h=1)
29 title(main=mt,sub="Eigen values")
30 barplot(eig[[2]],ylim=c(0,100))
31 points(eig[[3]],type="b")
32 title(main=mt,sub="Variance explained",cex=cexc)
33
34 }
35
36 ###############################################################################################
37 plot.contrib <- function(res.PCA,mt,cexc)
38 {
39 # Fonction de plot des contributions sur les n composantes
40 # principales choisies par l'utilisateur (lastpc)
41 # En entrée,la fonction prend le résultats de l'ACP FactoMineR de type list
42
43 lastpc <- dim(res.PCA$var$contrib)[2]
44 ## plot contributions
45 contrib <- res.PCA$var$contrib
46 for (c in 1:lastpc) {
47 barplot(quantile(contrib[,c],probs=seq(0,1,0.025)))
48 title(main=mt,sub=paste("Quantile plot Contrib PC",c,sep=""),cex=cexc)
49 barplot(contrib[order(contrib[,c]),1])
50 title(main=mt,sub=paste("Contributions PC",c,sep=""),cex=cexc)
51 }
52 }
53
54 ###############################################################################################
55 pca.var <- function(res.PCA,contribmin=c(0,0),mt,cexc,linev=3,plotax=c(1,2))
56 {
57 # Loading plot avec eventuellement selection des variables par leurs contributions
58 # En entrée,la fonction prend le résultats de l'ACP FactoMineR de type list
59 # On passe en arguments : les contributions pour les 2 axes définis par l'utilisateur,
60 # le titre du graphique,la taille des caractères (cex),
61 # ??? est-ce que la fonction doit plotter toutes les composantes ???
62
63 ### sélection des variables sur leur contribution.
64 # les valeurs des contributions par défaut (0,0) permettent d'afficher
65 # toutes les variables.
66 selvar=c(which(res.PCA$var$contrib[,plotax[1]]>contribmin[1]),
67 which(res.PCA$var$contrib[,plotax[2]]>contribmin[2]))
68 selvar <- selvar[!duplicated(selvar)]
69 fres.PCA <- res.PCA
70 fres.PCA$var$coord <- res.PCA$var$coord[selvar,]
71 fres.PCA$var$cor <- res.PCA$var$cor[selvar,]
72 fres.PCA$var$cos2 <- res.PCA$var$cos2[selvar,]
73 fres.PCA$var$contrib <- res.PCA$var$contrib[selvar,]
74
75 #### Plot du cercle des corrélations
76 plot.PCA(fres.PCA,choix="var",cex=cexc,axes=plotax,title=NULL, habillage=1)
77 title(main = mt,line = linev,cex=cexc)
78 }
79
80 ###############################################################################################
81 pca.indiv <- function(res.PCA,hb,facteur=NULL,contribmin=c(0,0),mt,cexc,linev=3,plotax=c(1,2))
82 {
83 # Espace des individus
84 # En entrée,la fonction prend le résultats de l'ACP FactoMineR de type list
85 # On passe en arguments : les contributions pour les 2 axes définis par l'utilisateur,
86 # le titre du graphique,la taille des caractères (cex),
87 # ??? est-ce que la fonction doit plotter toutes les composantes ???
88 selvar=c(which(res.PCA$var$contrib[,plotax[1]]>contribmin[1]),
89 which(res.PCA$var$contrib[,plotax[2]]>contribmin[2]))
90
91 fres.PCA <- res.PCA
92 fres.PCA$var$coord <- res.PCA$var$coord[selvar,]
93 fres.PCA$var$cor <- res.PCA$var$cor[selvar,]
94 fres.PCA$var$cos2 <- res.PCA$var$cos2[selvar,]
95 fres.PCA$var$contrib <- res.PCA$var$contrib[selvar,]
96
97 #### Plot l'espace des individus
98 if (hb ==1 )
99 {
100 aa <- cbind.data.frame(facteur,res.PCA$ind$coord)
101 bb <- coord.ellipse(aa,bary=TRUE,level.conf=0.99)
102
103 colVal = rainbow(length(unique(facteur)))
104 plot.PCA(fres.PCA,choix="ind",habillage=1,cex=cexc,axes=plotax,title=NULL,invisible="quali")
105 title(main = mt,line = linev,cex=cexc)
106
107 plot.PCA(fres.PCA,choix="ind",habillage=1,label="none",cex=cexc,axes=plotax,title=NULL,ellipse=bb)
108 title(main = mt,line = linev,cex=cexc)
109 }
110 else
111 {
112 plot.PCA(fres.PCA,choix="ind",cex=cexc,axes=plotax,title=NULL)
113 title(main = mt,line = linev,cex=cexc)
114 }
115 }
116
117 ###############################################################################################
118 ## MODIFICATIONS 15062017
119 ## Suppression standardisation car fonction externe
120 ## Concatenation samplemetadata et datamatrix avec merge si pas meme ordre de tri
121 ## HYPOTHESES : 1) datamatrix : nxp et 2) colonne 1 = identifiants individus
122 ###############################################################################################
123
124 pca.main <- function(ids,bioFact,ncp,hb=0,minContribution=c(0,0),mainTitle=NULL,textSize=0.5,linev=3,
125 principalPlane=c(1,2),eigenplot=0,contribplot=0,scoreplot=0,loadingplot=0,nomGraphe,
126 variable_in_line=0,log_file)
127 {
128
129 res<-NULL
130
131 ## Variable in line or column?
132 if (variable_in_line==1){
133 column_use="individual"
134 line_use="variable"
135 } else {
136 line_use="individual"
137 column_use="variable"
138 }
139
140
141 ## Fonction d'écriture du fichier de log
142
143 log_error=function(message="") {
144 cat("<HTML><HEAD><TITLE>PCA FactoMineR report</TITLE></HEAD><BODY>\n",file=log_file,append=F,sep="")
145 cat("&#9888 An error occurred while trying to read your table.\n<BR>",file=log_file,append=T,sep="")
146 cat("Please check that:\n<BR>",file=log_file,append=T,sep="")
147 cat("<UL>\n",file=log_file,append=T,sep="")
148 cat(" <LI> the table you want to process contains the same number of columns for each line</LI>\n",file=log_file,append=T,sep="")
149 cat(" <LI> the first line of your table is a header line (specifying the name of each ",column_use,")</LI>\n",file=log_file,append=T,sep="")
150 cat(" <LI> the first column of your table specifies the name of each ",line_use,"</LI>\n",file=log_file,append=T,sep="")
151 cat(" <LI> both individual and variable names should be unique</LI>\n",file=log_file,append=T,sep="")
152 cat(" <LI> each value is separated from the other by a <B>TAB</B> character</LI>\n",file=log_file,append=T,sep="")
153 cat(" <LI> except for first line and first column, table should contain a numeric value</LI>\n",file=log_file,append=T,sep="")
154 cat(" <LI> this value may contain character '.' as decimal separator </LI>\n",file=log_file,append=T,sep="")
155 cat("</UL>\n",file=log_file,append=T,sep="")
156 cat("-------<BR>\nError messages recieved :<BR><FONT color=red>\n",conditionMessage(message),"</FONT>\n",file=log_file,append=T,sep="")
157 cat("</BODY></HTML>\n",file=log_file,append=T,sep="")
158 q(save="no",status=1)
159 }
160
161 # Sortie graphique
162 if (eigenplot==1 || contribplot==1 || scoreplot==1 || loadingplot==1)
163 pdf(nomGraphe,onefile=TRUE)
164
165 # Verify data
166 verif_data=function(){
167 if (length(dim(ids)) != 2 | ncol(ids) < 2 | nrow(ids) < 2)
168 log_error(simpleCondition("The table on which you want to do PCA must be a data table with at least 2 rows and 2 columns."))
169
170 tab=as.matrix(data)
171 cell.with.na=c()
172 colstart=2-variable_in_line #
173 for (i in colstart:ncol(tab)) {
174 na.v1=is.na(tab[,i])
175 na.v2=is.na(as.numeric(tab[,i]))
176 if (sum(na.v1)!=sum(na.v2)) {
177 sel=which(na.v1!=na.v2)
178 sel=sel[1]
179 value=tab[sel,i]
180 log_error(simpleCondition(
181 paste("Column '",colnames(tab)[i],"' of your table contains non numeric values. Please check its content (on line #",sel," : value='",value,"'). Maybe you will need to specify that variable are in column.",sep="")
182 ))
183 }
184 if (length(cell.with.na)==0 & sum(na.v1)!=0) {
185 cell.with.na=c(i,which(na.v1)[1])
186 }
187 }
188 }
189
190
191 ## Disposition matrice de donnees
192 ## Transposition si variables en ligne
193 Tids <- ids
194 if (variable_in_line == 1)
195 {
196 Tids <- Tids[,-1]
197 Tids <- t(Tids)
198 Tids <- data.frame(rownames(Tids), Tids)
199 colnames(Tids)[1] <- "Sample"
200 }
201 rownames(Tids) <- as.character(Tids[,1])
202
203
204 ## suivant la presence variable qualitative (hb=1),l'appel a la fonction PCA est modifié
205 if (hb==1)
206 {
207 ## Concatenation
208 data <- merge(bioFact,Tids,by.x=1,by.y=1)
209 rownames(data) <- as.character(data[,1])
210 ## Suppression identifiants individus
211 data <- data[,-1]
212 data[,1] <- as.factor(data[,1])
213 facteur <- as.factor(bioFact[,-1])
214 verif_data()
215
216 ## Analyse
217 res <- PCA(data,scale.unit=FALSE,ncp,graph=F,quali.sup=1)
218 }
219 else
220 {
221 ## Suppression identifiants individus
222 data <- Tids[,-1]
223 verif_data()
224
225 ## Analyse
226 res <- PCA(data,scale.unit=FALSE,ncp,graph=F)
227 }
228
229 if (eigenplot==1)
230 {
231 par(mfrow=c(1,2))
232 plot_ebouli(res,mt=mainTitle,cexc=textSize)
233 }
234
235 if (contribplot==1)
236 {
237 par(mfrow=c(1,2))
238 plot.contrib(res,mt=mainTitle,cexc=textSize)
239 }
240
241 if (scoreplot==1)
242 {
243 if (hb==0)
244 {
245 par(mfrow=c(1,1))
246 pca.indiv(res,hb=0,contribmin=minContribution,mt=mainTitle,cexc=textSize,plotax=principalPlane)
247 }
248 if (hb==1)
249 {
250 par(mfrow=c(1,1))
251 pca.indiv(res,hb=1,facteur=facteur,contribmin=minContribution,mt=mainTitle,cexc=textSize,plotax=principalPlane)
252 }
253 }
254 if (loadingplot==1)
255 {
256 par(mfrow=c(1,1))
257 pca.var(res,contribmin=minContribution,mt=mainTitle,cexc=textSize,plotax=principalPlane)
258 }
259
260 if (eigenplot==1 || contribplot==1 || scoreplot==1 || loadingplot==1)
261 dev.off()
262
263
264 if (!is.null(res)){
265 cat("<HTML><HEAD><TITLE>PCA FactoMineR report</TITLE></HEAD><BODY>\n",file=log_file,append=F,sep="")
266 cat("&#10003; Your process is successfull !<BR>",file=log_file,append=T,sep="")
267 cat("</BODY></HTML>\n",file=log_file,append=T,sep="")
268
269
270
271 }
272 }
273
274 ###############################################################################################