Mercurial > repos > vmarcon > pcafactominer
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("⚠ 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("✓ 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 ############################################################################################### |