Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Table des matieres
1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 La regression PLS avec ou sans selection de variables . . . . . . . . . . . . . . . 1
2.1 Le principe de la regression PLS sans selection de variables . . . . . . . 12.2 Le choix du nombre de composantes . . . . . . . . . . . . . . . . . . . . 22.3 Le principe de la selection de variables en regression PLS . . . . . . . . 22.4 Techniques d’obtention d’intervalles de confiance sur les coefficients de
regression PLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Utilisation de l’interface de lancement . . . . . . . . . . . . . . . . . . . . . . . 34 Illustration de la regression PLS a l’aide d’exemples . . . . . . . . . . . . . . . 6
4.1 Illustration de la regression PLS1 sans selection de variables . . . . . . . 64.2 Illustration de la regression PLS1 avec selection de variables . . . . . . . 144.3 Illustration de la regression PLS2 sans selection de variables . . . . . . . 164.4 Illustration de la regression PLS2 avec selection de variables . . . . . . . 22
5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Bibliographie 24
A Programmes preliminaires 25
B Programmation de l’interface 29
C Programme PLS1 sans selection de variables sans donnees manquantes 57
D Programme PLS1 sans selection de variables avec donnees manquantes 61
E Programme PLS1 avec selection de variables 66
F Programme PLS2 sans selection de variables sans donnees manquantes 69
G Programme PLS2 sans selection de variables avec donnees manquantes 73
H Programme PLS2 avec selection de variables 78
I Programmes calculant les equations de regression 81
J Programmes permettant la restitution des donnees et la prediction sur unjeu-test eventuel selon les differentes regressions 86
K Programmes permettant de calculer le VIP et le pouvoir d’explication pourchaque composante 94
L Programmes permettant le calcul d’intervalles de confiance selon differentestechniques 98
M Programmes permettant de choisir le nombre de composantes significatives105
1 Introduction
La regression PLS (Partial Least Squares) est historiquement nee en 1966 de l’algorithmeNIPALS (Non Linear Iterative Partial Least Squares) propose par Herman Wold ([9]). Cettetechnique combine iterativement analyse en composantes principales et regressions simplesdans l’objectif de relier les variables explicatives et les variables reponses. Ses avantages sontmultiples, notamment en ce qui concerne le nombre de variables, qui peut etre important etlargement superieur au nombre d’observations, et le traitement des donnees manquantes. Parconvention, on appellera PLS1 la regression PLS avec une seule variable reponse et PLS2lorsque le nombre de variables reponses est superieur a 1.Ce rapport technique concerne la programmation de cette methode effectuee a l’aide du logicielMatlab sous Linux, version 7.7.0.471 (R2008b). Ce travail a ete effectue au sein de l’uniteMIA de l’INRA de Jouy-en-Josas. Les procedures sont disponibles sur la machine bananier en/home/amblin/R PLS/matlab.Pour les aspects theoriques de la methode, on renvoie le lecteur aux references donnees dansle texte de ce rapport.
2 La regression PLS avec ou sans selection de variables
On adoptera les notations suivantes :
N : Nombre d’observationsM : Nombre de variables explicativesP : Nombre de variables reponsesX : Matrice des donnees (N ×M) pour les variables independantes explicativesY : Matrice des donnees (N × P ) pour les variables dependantes reponsesE0 : Matrice des variables (Xj)j=1...M centrees-reduitesF0 : Matrice des variables (Yk)k=1...P centrees-reduitesA : Nombre de composantes PLS choisi a priori ou par un testth : Composante PLS a l’etape h
2.1 Le principe de la regression PLS sans selection de variables
Tres succinctement, la regression PLS consiste, dans un premier temps, a effectuer descombinaisons lineaires des variables explicatives a l’aide de poids proportionnels a la covarianceentre celles-ci. Ces combinaisons lineaires conduisent ainsi a des composantes sur lesquelleson construit des regressions de E0 et F0. Lorsque des donnees manquantes existent, on faitseulement le calcul sur les donnees disponibles et aucune estimation des donnees manquantesn’est necessaire.Afin d’effectuer les differents algorithmes, on s’appuiera sur le livre de M. Tenenhaus ([6] pages75,76,77,99 pour la regression PLS1 et page 128 pour la regression PLS2) et sur l’article deM. Tenenhaus, J-P Gauchi et C. Menardo ([7]).Les principales etapes de la regression PLS sont les suivantes :
1. Centrage et reduction des tableaux X et Y
2. Recherche des composantes orthogonales th (composantes PLS) .On construit des combinaisons lineaires des colonnes de F0 (notees u1) et des combinai-
1
sons lineaires des colonnes de E0 (notees t1) telle que la covariance entre u1 et t1 soitmaximale.
3. Regressions de E0 et F0 sur t1 . On exprime la regression de F0 en fonction des variablesexplicatives. On obtient les matrices de residus E1 et F1.
4. On reprend les etapes 2 et 3 en remplacant E0 par E1 et F0 par F1 jusqu’a convergencedes composantes t1...th. Le nombre de composantes significatives A est determine soit apriori, soit par un test (du type validation croisee ou inferentiel).
2.2 Le choix du nombre de composantes
Il existe certains tests permettant de garder uniquement les composantes significatives.Dans le cas de la regression PLS1, deux tests ont ete utilises : le test du Q2 ([6] page 83) et letest de Lazraq-Cleroux ([4]). Pour le test du Q2, on quantifie l’apport de la hieme composantePLS au pouvoir predictif au modele (note Q2). La regle de la decision est la suivante : si Q2
h
est superieur ou egal a 0.00975, alors la composante PLS sera consideree significative ([6] page83).Dans le cas de la regression PLS2, seul le test du Q2 sera effectue. On generalise la methodede validation croisee effectuee en PLS1 ([6] page 138). Afin d’etudier la pertinence de chaquevariable explicative pour la prediction des variables reponses a travers les A composantesretenues, on calculera le VIP (Variable Importance Prediction, [6] page 139). Les descripteursseront consideres comme importants dans la construction des variables reponses, si le VIP estsuperieur a 1.
2.3 Le principe de la selection de variables en regression PLS
Lorsque le nombre de variables explicatives est grand, voire considerable (cas des donneesmetagenomiques), on cherche a selectionner les variables intervenant le plus dans l’explicationdes variables reponses. Ici, on a programme une methode de selection de variables developpeedans l’article de J-P Gauchi et P. Chagnon (Methode BQ, [3], [4]).Dans le cas de la regression PLS1, les etapes de cette methode sont les suivantes :
1. Calcul d’un premier modele de regression PLS1 avec toutes les variables explicatives (lesA composantes th retenues sont validees par le test du Q2).
2. Calcul du Q2 cumule du modele (note Q2cum) et stockage de la valeur de ce Q2
cum.
3. Elimination de la variable presentant le plus petit coefficient (en valeur absolue) dansl’equation de ce modele.
4. Retour en 1 avec une variable de moins.
On repete ces etapes jusqu’a obtenir une seule variable explicative, puis on trace la courbe desQ2
cum en fonction des variables eliminees.Dans le cas de la regression PLS2, on considere le VIP pour eliminer les variables.
2.4 Techniques d’obtention d’intervalles de confiance sur les coefficients de
regression PLS
Trois techniques ont ete utilisees, elles sont applicables dans le contexte sans selection devariables. Dans tous les cas, on pourra choisir le niveau de confiance. Des valeurs typiques sont90, 95 et 99%.
2
Approximation
On se referera au livre de M. Tenenhaus ([6] page 116) ainsi qu’a l’article de J-P Gauchiet P. Chagnon ([3]). C’est une methode qui consiste a approximer la variance des coefficientsde regression estimes dans le cas de la regression PLS1 sans donnees manquantes.
Jacknife
On se referera au livre de B. Efron et R-J Tibshinari ([2]) ainsi qu’a l’article de J-P Gauchiet P. Chagnon ([3]). Les etapes sont les suivantes :
1. On cree N paires de tableaux X−i, Y−i obtenus en eliminant une ligne i des tableauxbruts X et Y.
2. On effectue N regressions PLS a partir de ces N paires, en choisissant a chaque fois unnombre de composantes th egal a celui obtenu lors de la validation du modele primaire.
3. On calcule la moyenne et l’erreur standard des N coefficients de regression ainsi obtenus,qui conduisent aux intervalles de confiance souhaites.
Bootstrap
On se referera au livre de B. Efron et R-J Tibshinari ([2]) ainsi qu’a l’article de A. Lazraq,R. Cleroux et J-P Gauchi ([5]). Seule l’etape 1 de la methode jacknife est modifiee. On tire Lfois avec remise la paire de tableaux [X ;Y]. On calcule pour chaque paire des coefficients deregression PLS. On recupere les percentiles α et 1-α de l’histogramme empirique construit apartir des L coefficients pour obtenir un intervalle de confiance de (100-2α) %.
3 Utilisation de l’interface de lancement
L’interface de lancement (3.1) s’obtient a partir de la fenetre de commande de Matlab entapant pour cette version MIAJ RPLS V2009 1.Il est legerement modifie lorsqu’on effectue des regressions PLS avec selection de variables(3.2). Apres avoir clique sur le bouton LANCER, d’autres changements dans l’interface appa-raissent (3.3).
(1) A la question � Choisissez une methode ? �, l’utilisateur dispose d’un menu deroulant luipermettant ainsi de choisir entre differentes regressions PLS :
– PLS1 sans selection– PLS1 avec selection– PLS2 sans selection– PLS2 avec selection
(2) On inscrit le nom du fichier de donnees que l’on veut importer. Le fichier doit etre auformat excel (extension .xls) ou texte standard (.txt). Le tableau des variables explicativesX doit etre place a gauche du tableau des variables reponses Y. Lorsqu’il existe des donneesmanquantes dans le fichier, celles-ci doivent etre codees par un espace dans un fichier au formatexcel et par NaN dans un fichier au format texte standard.(3) Si l’utilisateur souhaite transposer le tableau de donnees, il coche la case correspondante.(4) L’utilisateur donne le nombre de variables reponses. Par defaut, le nombre est fixe a 1 dans
3
Figure 3.1 – Interface de lancement
Figure 3.2 – Interface de lancement lors de selection de variables
le cas de la regression PLS1 et a 2 dans le cas de la regression PLS2. Dans le cas ou l’utilisateurindique 2 alors qu’il s’agit d’une regression PLS1 ou 1 lorsqu’il s’agit d’une regression PLS2,
4
Figure 3.3 – Interface de lancement lors de selection de variables apres avoir clique sur le boutonLANCER
un message d’erreur est envoye.(5) Si il existe des donnees manquantes dans le tableau de donnees, on coche la case corres-pondante.(6) Si on souhaite effectuer un test du Q2 afin d’obtenir le nombre de composantes PLS signi-ficatives, on coche la case correspondante.(7) Si on souhaite effectuer un test de Lazraq-Cleroux, on coche la case correspondante. Dansle cas d’une regression PLS2, on ne dispose pas de ce test dans cette version.Si on ne coche aucune case, aucun test ne sera effectue. Les deux tests peuvent etre effectuessimultanement dans le cas de la regression PLS1.(8) L’utilisateur donne le nombre limite de composantes PLS qu’il souhaite conserver. Pardefaut, ce nombre est fixe a 20 ou au nombre de variables explicatives si celui-ci est inferieura 20. Dans le cas ou on saisit un nombre limite superieur au nombre de variables explicatives,un message d’erreur est envoye.(9) Si l’utilisateur souhaite obtenir des intervalles de confiance, il coche la case correspondante.(10) On a le choix entre trois techniques pour obtenir des intervalles de confiance : l’approxi-mation (dans le cas de la regression PLS1 sans donnees manquantes exclusivement), le jacknifeou le bootstrap. Dans le cas de regressions avec selection, aucun intervalle de confiance n’estcalcule.(11) Dans le cas ou l’utilisateur souhaite obtenir un intervalle de confiance, il donne un niveaude confiance. Les valeurs typiques sont 90, 95 et 99 %. Si les valeurs ne sont comprises entre80 et 99 %, un message d’erreur est envoye.(12) Si l’utilisateur souhaite effectuer une prediction sur un jeu-test, il coche la case corres-pondante.(13) Pour le jeu-test eventuel, soit celui-ci existe deja dans un fichier : il suffit alors de donner
5
un nom avec une extension .txt ou .xls (en respectant X a gauche de Y, le nombre de variablesreponses P et explicatives M), soit l’interface propose d’en construire un. Pour construire cejeu-test, on donne le pourcentage de lignes a tirer aleatoirement parmi les N lignes des tableauxde depart. Notons egalement que le calcul sur le jeu-test n’est effectue que dans le cas ou iln’y a pas de donnees manquantes dans celui-ci.(14) Dans le cas ou on choisit d’effectuer un jeu-test avec tirage aleatoire, on choisit le tauxdes donnees du jeu que l’on veut conserver. Ce taux sera strictement superieur a 0 et inferieura 80 %. Dans le cas contraire, un message d’erreur sera envoye. Dans le cas ou on utilise unjeu test existant dans le fichier, la case � fichier-test �apparaıt. On saisit le nom du fichier-testsans oublier l’extension .txt ou .xls.(15) Si l’utilisateur souhaite une sauvegarde, il coche la case correspondante.(16) Il faut saisir le nom du fichier sans extension. Ce fichier sera automatiquement enregistredans le repertoire courant en format .mat.(17) Le bouton QUITTER permet de quitter l’application ainsi que matlab.(18) Le bouton LANCER permet de lancer le calcul. Dans le cas de regressions avec selection,les valeurs du Q2
cum sont automatiquement enregistrees dans le fichier Q2cum au format .mat.La courbe des Q2
cum en fonction des variables eliminees est egalement automatiquement enre-gistree dans le fichier courbe au format .jpg.(19) Dans le cas de methodes avec selection de variables, au vu du graphique obtenu apres avoirclique sur le bouton LANCER, on choisit le nombre de variables que l’on souhaite conserver(3.3).(20) Le bouton �Tableau des variables �donne le tableau des variables que l’on a gardees apresselection ; ce tableau, au format texte, sera conserve si la case � Sauvegarde des resultats �(14)est cochee.
4 Illustration de la regression PLS a l’aide d’exemples
4.1 Illustration de la regression PLS1 sans selection de variables
Description des donnees
On trouve dans le livre de Michel Tenenhaus ([6] page 78) l’exemple suivant tire de Cornell(1990). On cherche a connaıtre l’influence des proportions de sept composants sur l’indiced’octane moteur de douze differents melanges d’essences. Les variables sont les suivantes :
– y : indice d’octane moteur– x1 : distillation directe (entre 0 et 0.21)– x2 : reformat (entre 0 et 0.62)– x3 : naphta de craquage thermique (entre 0 et 0.12)– x4 : naphta de craquage catalytique (entre 0 et 0.62)– x5 : polymere (entre 0 et 0.12)– x6 : alkylat (entre 0 et 0.74)– x7 : essence naturelle (entre 0 et 0.08)Les donnees ont ete regroupees dans le tableau 4.1.Notons que la somme de chaque ligne des xj est egale a 1.
6
Table 4.1 – Donnees Cornell
xj x1 x2 x3 x4 x5 x6 x7 yn°1 0 0,23 0 0 0 0,74 0,03 98,7n°2 0 0,1 0 0 0,12 0,74 0,04 97,8n°3 0 0 0 0,1 0,12 0,74 0,04 96,6n°4 0 0,49 0 0 0,12 0,37 0,02 92n°5 0 0 0 0,62 0,12 0,18 0,08 86,6n°6 0 0,62 0 0 0 0,37 0,01 91,2n°7 0,17 0,27 0,1 0,38 0 0 0,08 81,9n°8 0,17 0,19 0,1 0,38 0,02 0,06 0,08 83,1n°9 0,17 0,21 0,1 0,38 0 0,06 0,08 82,4n°10 0,17 0,15 0,1 0,38 0,02 0,1 0,08 83,2n°11 0,21 0,36 0,12 0,25 0 0 0,06 81,4n°12 0 0 0 0,55 0 0,37 0,08 88,1
Resultats obtenus
Les resultats suivants ont ete obtenus en selectionnant un choix de trois composantes apriori. Un test du Q2 a ete effectue. La duree d’execution est de l’ordre de quelques centiemesde secondes (si on ne calcule pas d’intervalles de confiance par la methode bootstrap). Lelisting de sortie est le suivant :
*********************************************************
*********************************************************Nom du programme : MIAJ RPLS V2009 1
Methode mise en oeuvre : regression PLS1 sans selection de
variables
Nom du fichier traite
donnees cornell.xls
On n'a pas transpose le tableau de donnees
Nombre de variables explicatives
7
Nombre de variables reponses
1
Nombre d'observations
12
Il n'existe pas de donnees manquantes
*********************************************************
*********************************************************Resultats pour le nombre de composantes choisi a priori
*********************************************************TT : composantes PLS
2.0513 0.8218 1.5820
2.4747 0.6488 0.1094
7
2.3311 0.9267 −0.17292.0372 −1.5957 −0.5015−0.0681 −0.2178 −2.95591.6138 −1.4228 0.9711
−2.2043 −0.1781 0.2375
−1.9935 0.1006 0.1184
−2.0876 0.1486 0.3546
−1.9158 0.3184 0.1965
−2.0763 −0.4606 1.0312
−0.1625 0.9101 −0.9704
*********************************************************PP : coefficients de regression de E0 sur TT
−0.4536 −0.0425 0.2730
0.0317 −1.0032 0.4493
−0.4544 −0.0390 0.2707
−0.3560 0.2781 −0.53320.2943 −0.0454 −0.49530.4620 0.4396 0.1054
−0.4125 0.4768 −0.3389
*********************************************************CC : coefficients de regression de F0 sur TT
0.4820 0.2731 0.1031
*********************************************************WW : vecteurs propres
−0.4370 0.1643 0.2897
−0.0370 −0.6810 0.4513
−0.4373 0.1688 0.2911
−0.3688 −0.1269 −0.56730.2577 −0.3629 −0.44470.5141 0.5174 0.1090
−0.3868 0.2554 −0.3101
*********************************************************WWS : W tilde
−0.4370 0.1203 0.3756
−0.0370 −0.6847 −0.0375−0.4373 0.1248 0.3802
−0.3688 −0.1641 −0.68450.2577 −0.3370 −0.68530.5141 0.5692 0.5153
−0.3868 0.2164 −0.1556
*********************************************************UU : composantes associees au tableau Y
3.2183 2.0597 3.2801
2.9320 0.8072 0.4196
2.5502 0.3868 −1.43061.0869 −1.6772 −0.2158−0.6309 −0.9934 −2.05510.8324 −1.3792 0.1155
−2.1261 0.1380 0.8375
−1.7443 0.4398 0.8989
8
−1.9670 0.2128 0.1701
−1.7125 0.3587 0.1068
−2.2851 −0.3686 0.2438
−0.1538 0.0154 −2.3710
*********************************************************BETA : coefficients de regression de Y sur X pour les
donnees centrees reduites
−0.2106 −0.1778 −0.1391−0.0178 −0.2048 −0.2087−0.2108 −0.1767 −0.1376−0.1778 −0.2226 −0.29320.1242 0.0322 −0.03840.2478 0.4033 0.4564
−0.1865 −0.1273 −0.1434
*********************************************************LEV : matrice des leviers
0.0962 0.1831 0.3531
0.1401 0.1942 0.1950
0.1243 0.2347 0.2367
0.0949 0.4223 0.4393
0.0001 0.0062 0.5999
0.0596 0.3198 0.3839
0.1111 0.1152 0.1190
0.0909 0.0922 0.0931
0.0997 0.1025 0.1111
0.0839 0.0970 0.0996
0.0986 0.1259 0.1981
0.0006 0.1071 0.1711
*********************************************************Coefficients de regressions PLS pour les donnees brutes
*********************************************************betan : coefficients des equations de regression pour
les donnees brutes
92.4322 92.3422 92.6760
−14.8846 −12.5636 −9.8283−0.5942 −6.8312 −6.9602−25.5424 −21.4140 −16.6662−5.1075 −6.3952 −8.421814.1877 3.6776 −4.38895.5177 8.9787 10.1613
−44.9000 −30.6670 −34.5290
*********************************************************Reconstitution sur les donnees d'origine en fonction du
nombre de composantes
*********************************************************ylc : y reconstitue en fonction des composantes (prevision).
La derniere colonne est le y d'origine.
95.0316 96.4953 97.5586 98.7000
96.3624 97.5180 97.5915 97.8000
95.9111 97.5616 97.4453 96.6000
94.9871 92.1450 91.8079 92.0000
9
88.3692 87.9813 85.9945 86.6000
93.6563 91.1223 91.7751 91.2000
81.6543 81.3371 81.4967 81.9000
82.3166 82.4958 82.5754 83.1000
82.0210 82.2856 82.5240 82.4000
82.5611 83.1282 83.2603 83.2000
82.0566 81.2361 81.9292 81.4000
88.0726 89.6936 89.0414 88.1000
*********************************************************rmse : residual mean square error en fonction des
composantes
1.7258 0.9603 0.6068
*********************************************************Choix du nombre de composantes PLS significatives par le
test du Q2
*********************************************************Le premier vecteur donne le Q2cum
0.9086
0.9614
−1.6294
Le deuxieme vecteur donne le resultat du test qui est
egal a 1 si on conserve la composante
1
1
0
Nombre de composantes PLS significatives
2
*********************************************************Choix du nombre de composantes PLS significatives par le
test de Lazraq−Cleroux*********************************************************Nombre de composantes PLS significatives
1
*********************************************************Calcul des pouvoirs d'explication de E0 et F0 (voir
article de M. Tenenhaus, J−P Gauchi et C. Menardo [7])
*********************************************************La premiere colonne donne le pouvoir de chaque t h pour resumer E0
La deuxieme colonne donne le pouvoir des h premiers t h pour resumer E0
La troisieme colonne donne le pouvoir de chaque t h pour resumer F0
La quatrieme colonne donne le pouvoir des h premiers t h pour resumer F0
0.6247 0.6247 0.9324 0.9324
0.1661 0.7908 0.0533 0.9857
0.2092 1.0000 0.0143 1.0000
*********************************************************
Afin de tester un tableau ayant des donnees manquantes, on a utilise le jeu de donneeessuivant :
10
Table 4.2 – Donnees Cornell avec donnees manquantes
xj x1 x2 x3 x4 x5 x6 x7 yn°1 NA 0,23 0 0 0 0,74 0,03 98,7n°2 0 NA 0 0 0,12 0,74 0,04 97,8n°3 0 0 NA 0,1 0,12 0,74 0,04 96,6n°4 0 0,49 0 NA 0,12 0,37 0,02 92n°5 0 0 0 0,62 NA 0,18 0,08 86,6n°6 0 0,62 0 0 0 NA 0,01 91,2n°7 0,17 0,27 0,1 0,38 0 0 NA 81,9n°8 0,17 0,19 0,1 0,38 0,02 0,06 0,08 83,1n°9 0,17 0,21 0,1 0,38 0 0,06 0,08 82,4n°10 0,17 0,15 0,1 0,38 0,02 0,1 0,08 83,2n°11 0,21 0,36 0,12 0,25 0 0 0,06 81,4n°12 0 0 0 0,55 0 0,37 0,08 88,1
Les resultats suivants ont ete obtenus en selectionnant un choix de trois composantes apriori.
*********************************************************
*********************************************************Nom du programme : MIAJ RPLS V2009 1
Methode mise en oeuvre : regression PLS1 sans selection de
variables
Nom du fichier traite
donnees cornellmiss.xls
On n'a pas transpose le tableau de donnees
Nombre de variables explicatives
7
Nombre de variables reponses
1
Nombre d'observations
12
Il existe des donnees manquantes
*********************************************************
*********************************************************Resultats pour le nombre de composantes choisi a priori
*********************************************************TT : composantes PLS
2.1084 0.4527 1.4556
2.5666 0.8118 0.4694
2.5001 1.3901 0.2647
2.0770 −1.4007 −1.2040−0.3453 0.8530 −1.9015
11
2.1672 −2.0184 −0.1637−1.9907 −0.3816 0.0836
−1.8608 0.1007 0.1810
−1.9683 0.0313 0.2870
−1.7984 0.3250 0.3339
−1.9416 −0.8343 0.6354
−0.0975 1.1969 −0.7522
*********************************************************PP : coefficients de regression de E0 sur TT
−0.4366 −0.1750 0.4778
0.1090 −0.9060 0.1546
−0.4491 −0.2340 0.3709
−0.3570 0.3926 −0.63090.2974 0.1738 −0.40430.4726 0.2563 0.2298
−0.4118 0.4647 −0.1969
*********************************************************CC : coefficients de regression de F0 sur TT
0.4726 0.2026 0.1891
*********************************************************WW : vecteurs propres
−0.4671 0.0398 0.4647
0.0086 −0.8025 0.1784
−0.4385 0.0400 0.4428
−0.3515 −0.0614 −0.53080.2941 −0.0317 −0.39020.4914 0.4909 0.2652
−0.3713 0.3273 −0.2277
*********************************************************WWS : W tilde
−0.4671 0.0337 0.4450
0.0086 −0.8024 −0.3509−0.4385 0.0342 0.4260
−0.3515 −0.0660 −0.60600.2941 −0.0279 −0.38220.4914 0.4973 0.6378
−0.3713 0.3225 −0.0480
*********************************************************UU : composantes associees au tableau Y
3.2828 2.7387 2.4496
2.9907 0.9891 0.1900
2.6014 0.2362 −1.23651.1087 −2.2580 −0.9187−0.6436 −0.6957 −1.65950.8491 −3.0739 −1.1311−2.1687 −0.4152 −0.0360−1.7793 0.1901 0.0958
−2.0065 −0.0889 −0.1287−1.7469 0.1202 −0.2194−2.3309 −0.9081 −0.0790
12
−0.1568 −0.1384 −1.4308
*********************************************************BETA : coefficients de regression de Y sur X pour les
donnees centrees reduites
−0.2207 −0.2139 −0.12970.0041 −0.1585 −0.2249−0.2072 −0.2003 −0.1197−0.1661 −0.1795 −0.29410.1390 0.1333 0.0611
0.2322 0.3330 0.4536
−0.1755 −0.1101 −0.1192
*********************************************************LEV : matrice des leviers
0.0994 0.1153 0.3549
0.1473 0.1996 0.2222
0.1397 0.2968 0.3021
0.0964 0.2647 0.4151
0.0027 0.0640 0.4957
0.1050 0.4520 0.4527
0.0886 0.0998 0.1008
0.0774 0.0785 0.0820
0.0866 0.0868 0.0959
0.0723 0.0820 0.0935
0.0843 0.1404 0.1911
0.0002 0.1203 0.1940
*********************************************************Coefficients de regressions PLS pour les donnees brutes
*********************************************************betan : coefficients de regression
92.4768 92.2336 92.3739
−15.3707 −14.8953 −9.03470.1320 −5.1347 −7.2841
−24.7493 −23.9207 −14.2999−4.8599 −5.2514 −8.604016.7001 16.0213 7.3358
4.9401 7.0837 9.6494
−41.8603 −26.2722 −28.4391
*********************************************************Reconstitution sur les donnees d'origine en fonction du
nombre de composantes
*********************************************************ylc : y reconstitue en fonction des composantes (prevision).
La derniere colonne est le y d'origine.
94.9070 95.5064 96.9859 98.7000
96.4621 98.3472 99.2572 97.8000
95.9761 97.8220 98.3968 96.6000
95.5361 93.7357 92.6865 92.0000
87.0041 88.1510 86.5012 86.6000
92.1401 88.7874 87.5733 91.2000
85.5778 83.9274 84.1718 81.9000
82.8488 82.9819 83.2050 83.1000
13
82.5174 82.5588 82.9126 82.4000
83.0411 83.4706 83.8824 83.2000
82.6000 81.4974 82.2810 81.4000
88.2829 89.8645 88.9368 88.1000
*********************************************************rmse : residual mean square error en fonction des
composantes
1.9412 1.5963 1.5626
*********************************************************Choix du nombre de composantes PLS significatives par le
test du Q2
*********************************************************Le premier vecteur donne le Q2cum
0.8862
0.9094
0.9203
Le deuxieme vecteur donne le resultat du test qui est egal
a 1 si on conserve la composante
1
1
1
Nombre de composantes PLS significatives
3
*********************************************************Choix du nombre de composantes PLS significatives par le
test de Lazraq−Cleroux*********************************************************Nombre de composantes PLS significatives
1
*********************************************************Calcul des pouvoirs d'explication de E0 et F0 (voir
article de M. Tenenhaus, J−P Gauchi et C. Menardo [7])
*********************************************************La premiere colonne donne le pouvoir de chaque t h pour resumer E0
La deuxieme colonne donne le pouvoir des h premiers t h pour resumer E0
La troisieme colonne donne le pouvoir de chaque t h pour resumer F0
La quatrieme colonne donne le pouvoir des h premiers t h pour resumer F0
0.6401 0.6401 0.9257 0.9257
0.2317 0.8718 0.0455 0.9712
0.1282 1.0000 0.0288 1.0000
*********************************************************
4.2 Illustration de la regression PLS1 avec selection de variables
Description des donnees
Cet exemple est tire de l’article de J-P Gauchi et P. Chagnon [3]. Il correspond a des donneesindustrielles concernant la preparation de l’adiponitrile (ADPN) intermediaire dans la chaıne
14
de fabrication du Nylon 6-6. Les variables explicatives correspondent a des variables de flux,de pression, de temperatures et de melanges reactionnels. La variable reponse correspond a laperte de nickel implique dans la reaction chimique. On dispose de :
– N=71 (nombre d’observations)– M=100 (nombre de variables explicatives)
Resultats obtenus
Les resultats suivants ont ete obtenus en selectionnant un choix de six composantes a priori.La duree d’execution est de l’ordre de plusieurs secondes. On obtient le graphique suivant :
Figure 4.4 – Evolution du Q2cum en fonction du nombre de variables enlevees
15
4.3 Illustration de la regression PLS2 sans selection de variables
Description des donnees
On trouve dans l’article M. Tenenhaus, J-P Gauchi et C. Menardo ([7]) un exemple deregression PLS sur les donnees suivantes (tableau 4.3). Le Dr. A.C. Linnerud de l’universitede Caroline du Nord a mesure trois caracteristiques physiques sur vingt hommes d’age murs’entraınant a la gymnastique. Il a egalement mesure leurs resultats a trois types d’exercice.Les variables sont les suivantes :
– x1 : le poids– x2 : le tour de taille– x3 : le pouls– y1 : les tractions a la barre fixe– y2 : les flexions– y3 : les sauts
Ainsi, les caracteristiques physiques correspondent aux variables explicatives et les resultatsaux exercices aux variables reponses.
Table 4.3 – Donnees Linnerud
xj x1 x2 x3 y1 y2 y3
n°1 191 36 50 5 162 60n°2 189 37 52 2 110 60n°3 193 38 58 12 101 101n°4 162 35 62 12 105 37n°5 189 35 46 13 155 58n°6 182 36 56 4 101 42n°7 211 38 56 8 101 38n°8 167 34 60 6 125 40n°9 176 31 74 15 200 40n°10 154 33 56 17 251 250n°11 169 34 50 17 120 38n°12 166 33 52 13 210 115n°13 154 34 64 14 215 105n°14 247 46 50 1 50 50n°15 193 36 46 6 70 31n°16 202 37 62 12 210 120n°17 176 37 54 4 60 25n°18 157 32 52 11 230 80n°19 156 33 54 15 225 73n°20 138 33 68 2 110 43
16
Resultats obtenus
Les resultats suivants ont ete obtenus en selectionnant un choix de trois composantes apriori. La duree d’execution est de l’ordre de quelques centiemes de secondes.
*********************************************************
*********************************************************Nom du programme : MIAJ RPLS V2009 1
Methode mise en oeuvre : regression PLS2 sans selection de
variables
Nom du fichier traite
linnerud.txt
Nombre de variables explicatives
3
Nombre de variables reponses
3
Nombre d'observations
20
Il n'existe pas de donnees manquantes
*********************************************************
*********************************************************Resultats pour le nombre de composantes choisi a priori
*********************************************************
*********************************************************TT : composantes PLS
−0.6429 0.5914 0.1305
−0.7697 0.1667 −0.1339−0.9074 −0.5212 −0.04770.6884 −0.6800 −0.3458−0.4867 1.1328 0.1818
−0.2291 −0.0717 −0.0247−1.4037 −0.0767 0.5718
0.7436 −0.2106 0.0322
1.7151 −0.6549 1.5572
1.1626 0.1668 −0.33290.3645 0.7007 −0.20110.7433 0.6983 −0.00231.1867 −0.7570 −0.3362−4.3898 −0.7600 −0.2554−0.8232 0.9738 0.0826
−0.7490 −0.5211 0.6672
−0.3929 −0.2034 −0.56421.1993 0.7827 −0.09241.0485 0.3729 −0.31901.9424 −1.1294 −0.5677
*********************************************************PP : coefficients de regression de E0 sur TT
−0.6659 −0.0198 0.6575
−0.6760 −0.3547 −0.28710.3589 −1.1942 0.6967
17
*********************************************************CC : coefficients de regression de F0 sur TT
0.3416 0.3364 0.4772
0.4161 0.2908 0.4554
0.1430 0.0652 −0.2125
*********************************************************WW : vecteurs propres
−0.5899 0.4688 0.6575
−0.7713 −0.5680 −0.28710.2389 −0.6765 0.6967
*********************************************************WWS : W tilde
−0.5899 0.3679 0.9346
−0.7713 −0.6999 −0.80230.2389 −0.6356 0.2228
*********************************************************UU : composantes associees au tableau Y
−0.6668 −0.3078 −0.4107−2.4062 −2.2958 −1.4307−0.1478 1.0735 0.4507
−0.6372 −1.1754 0.0856
0.8314 1.8497 0.5848
−2.3443 −2.6426 −1.2600−1.5471 0.0191 0.3171
−1.4313 −2.6538 −1.07472.0507 0.7284 1.3600
5.4475 4.5256 0.5898
0.7346 1.1450 0.6590
2.5225 1.9806 0.3539
2.7480 1.8095 1.2521
−3.9903 0.3413 0.5247
−2.6910 −2.0736 −1.46792.3591 3.5093 1.8322
−3.3758 −3.4943 −1.54822.2200 1.0367 0.2283
2.8831 2.3210 1.3039
−2.5590 −5.6963 −2.3499
*********************************************************beta : coefficients de regression de Y sur X pour les
donnees centrees reduites
variable reponse numero
1
−0.2015 −0.0778 0.3683
−0.2635 −0.4989 −0.88180.0816 −0.1322 −0.0258
variable reponse numero
2
−0.2454 −0.1385 0.2872
18
−0.3209 −0.5244 −0.88980.0994 −0.0854 0.0161
variable reponse numero
3
−0.0843 −0.0604 −0.2590−0.1103 −0.1559 0.0146
0.0342 −0.0073 −0.0546
*********************************************************LEV : matrice des leviers
0.0107 0.0528 0.0566
0.0154 0.0187 0.0227
0.0214 0.0540 0.0545
0.0123 0.0679 0.0946
0.0062 0.1603 0.1677
0.0014 0.0020 0.0021
0.0512 0.0519 0.1250
0.0144 0.0197 0.0199
0.0764 0.1280 0.6698
0.0351 0.0385 0.0632
0.0035 0.0624 0.0715
0.0144 0.0729 0.0729
0.0366 0.1054 0.1307
0.5008 0.5702 0.5848
0.0176 0.1315 0.1330
0.0146 0.0472 0.1466
0.0040 0.0090 0.0801
0.0374 0.1110 0.1129
0.0286 0.0453 0.0680
0.0981 0.2513 0.3233
*********************************************************Coefficients de regressions PLS pour les donnees brutes
*********************************************************
betac : constantes des coefficients des equations de
regression pour les donnees brutes
29.2002 47.0197 47.9684
430.2511 612.5671 623.2817
150.4807 183.9849 179.8868
betax : coefficients des equations de regression pour
les donnees brutes
−0.0431 −0.0167 0.0788
−0.4350 −0.8237 −1.45580.0598 −0.0969 −0.0190−0.6220 −0.3509 0.7277
−6.2712 −10.2477 −17.38720.8625 −0.7412 0.1393
−0.1752 −0.1253 −0.5379−1.7662 −2.4969 0.2338
0.2429 −0.0518 −0.3886
19
*********************************************************Reconstitution sur les donnees d'origine en fonction du
nombre de composantes
*********************************************************y ind c : chaque variable reponse reconstituee en fonction
des composantes (prevision)
variable reponse numero
1
8.2890 9.3405 9.6698
8.0599 8.3563 8.0183
7.8112 6.8845 6.7642
10.6933 9.4841 8.6117
8.5710 10.5851 11.0437
9.0363 8.9089 8.8465
6.9149 6.7786 8.2212
10.7929 10.4184 10.4997
12.5474 11.3828 15.3115
11.5495 11.8462 11.0064
10.1083 11.3542 10.8469
10.7925 12.0340 12.0283
11.5931 10.2472 9.3989
1.5223 0.1710 −0.47347.9634 9.6948 9.9032
8.0973 7.1707 8.8538
8.7405 8.3789 6.9555
11.6158 13.0076 12.7745
11.3436 12.0067 11.2019
12.9579 10.9496 9.5175
variable reponse numero
2
137.1028 148.9124 152.9606
133.5713 136.8998 132.7452
129.7384 119.3295 117.8504
174.1649 160.5846 149.8594
141.4502 164.0714 169.7091
148.6226 147.1914 146.4242
115.9217 114.3902 132.1267
175.7011 171.4946 172.4943
202.7461 189.6671 237.9672
187.3647 190.6964 180.3713
165.1479 179.1408 172.9036
175.6941 189.6385 189.5679
188.0367 172.9199 162.4912
32.7935 17.6169 9.6941
132.0834 151.5299 154.0921
134.1478 123.7406 144.4335
144.0624 140.0015 122.5014
188.3864 204.0177 201.1524
184.1898 191.6376 181.7436
209.0740 186.5193 168.9117
20
variable reponse numero
3
202.6894 216.4760 219.1017
198.2279 202.1135 199.4187
193.3854 181.2341 180.2747
249.5123 233.6584 226.7018
208.1816 234.5898 238.2467
217.2430 215.5722 215.0746
175.9300 174.1422 185.6466
251.4529 246.5422 247.1907
285.6205 270.3521 301.6811
266.1883 270.0777 263.3806
238.1205 254.4559 250.4102
251.4442 267.7230 267.6771
267.0373 249.3899 242.6255
70.9091 53.1918 48.0528
196.3481 219.0500 220.7119
198.9562 186.8067 200.2288
211.4819 206.7411 195.3900
267.4791 285.7272 283.8687
262.1773 270.8719 264.4543
293.6150 267.2845 255.8636
*********************************************************rmse : residual mean square error en fonction des
composantes
4.5026 4.3540 4.1872
50.1061 48.7256 46.8393
167.0643 167.5464 168.1087
*********************************************************Calcul des intervalles de confiance sur les coefficients
de regression PLS
*********************************************************intervalles de confiance obtenus par la methode jacknife
pour la derniere composante
pour la variable reponse :
1
−0.5215 1.2502
−1.6303 −0.1230−0.4023 0.3553
pour la variable reponse :
2
−0.6464 1.2410
−1.6722 −0.1269−0.4055 0.4455
pour la variable reponse :
3
21
−1.3578 0.8753
−0.9046 0.9048
−0.5230 0.4292
*********************************************************Choix du nombre de composantes PLS significatives par le
test du Q2
Q2KH
0.1658 −0.1830 −0.24760.2924 −0.2230 −0.4311−0.0338 −0.1423 −0.3068
Nombre de composantes PLS significatives
0
*********************************************************Calcul du VIP
1.0217 1.3360 0.4137 3.0000
0.9982 1.2977 0.5652 3.0000
1.0185 1.2199 0.6888 3.0000
*********************************************************Calcul des pouvoirs d'explication de E0 et F0 (voir
article de M. Tenenhaus, J−P Gauchi et C. Menardo [7])
La premiere colonne donne le pouvoir de chaque t h pour resumer E0
La deuxieme colonne donne le pouvoir des h premiers t h pour resumer E0
La troisieme colonne donne le pouvoir de chaque t h pour resumer F0
La quatrieme colonne donne le pouvoir des h premiers t h pour resumer F0
0.6948 0.6948 0.7455 0.7455
0.2267 0.9215 0.2393 0.9848
0.0785 1.0000 0.0152 1.0000
*********************************************************
4.4 Illustration de la regression PLS2 avec selection de variables
Description des donnees
Les donnees utilisees sont extraites du livre de M. Tenenhaus ([8] page 311). Des jugesont evalue les caracteristiques physico-chimiques et sensorielles de six jus d’orange. La noteattribuee correspond a leur appreciation et varie de 1 (lorqu’ils n’aiment pas) a 5 (excellent).On dispose finalement de 6 observations (N=6), 152 variables explicatives (M=152) et 96variables reponses (P=96).
Resultats obtenus
Les resultats suivants ont ete obtenus en selectionnant un choix de trois composantes apriori. La duree d’execution est d’une minute environ.
On obtient le graphique suivant :
22
Figure 4.5 – Evolution du Q2cum en fonction du nombre de variables enlevees
5 Conclusion
Pour les methodes sans selection, les resultats des exemples sont exactement les memes queceux obtenus avec le logiciel SIMCA de la societe Umetrics. Ces resultats sont deja indiquesdans le livre de M. Tenenhaus ([6]).
23
Bibliographie
[1] Bastien, P., Esposito Vinzi, V., Tenenhaus, M., 2004, PLS generalised linear regression,Computational statistics and Data Analysis.
[2] Efron, B., Tibshirani, R-J., 1993, An introduction to the Bootstrap, Chapman and Hall,New York.
[3] Gauchi, J-P, Chagnon, P., 2001, Comparison of selection methods of explanatory variablesin PLS regression with application to manufactoring process data, Chemometrics AndIntelligent Laboratory Systems, 58 (2), 171-193.
[4] Lazraq, A., Cleroux, R., 2001, The PLS multivariate regression model : testing the signifi-cance of successive PLS components, Journal of chemometrics, 523-536.
[5] Lazraq, A., Cleroux, R., Gauchi, J-P, 2003, Selecting both latent and explanatory variablesin the PLS1 regression model, Chemometrics And Intelligent Laboratory Systems, 66, 117-126.
[6] Tenenhaus, M., 1998, La regression PLS, Editions Technip.
[7] Tenenhaus, M., Gauchi, J-P, Menardo, C., 1995, Regression PLS et applications, Revue deStatistique appliquee, 7-63.
[8] Tenenhaus, M., 2007, Statistique : Methodes pour decrire, expliquer et prevoir, Dunod.
[9] Wold, S., Sjostrom, M., Eriksson, L., 2001, PLS regression : A basic tool of chemometrics,Chemometrics and Intelligent Laboratory Systems, 109-130.
24
Annexe A
Programmes preliminaires
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%moyenne : programme calculant la moyenne de chaque colonne d'une matrice
%lorsqu'il existe des donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[moyX]=moyenne(n,p,X,vmiss)
%%%%Parametres d'entree%%%%
%n : nombre de lignes de la matrice
%p : nombre de colonnes de la matrice
%X : tableau de variables
%vmiss : valeur manquante
%%%%Parametre de sortie%%%%
%moyX : moyenne de chaque colonne de X
som=0;
for j=1:p
som=0;kmis=0;
for i=1:n
if X(i,j)6=vmiss
kmis=kmis+1;
som=som+X(i,j);
end;end;moyX(j)=som/kmis;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ecart type=programme calculant l'ecart−type de chaque colonne d'une
%matrice
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[stdX,ssx]=ecart type(n,p,X,moyX,vmiss)
%%%%Parametres d'entree%%%%
%n : nombre de lignes de la matrice
25
%p : nombre de colonnes de la matrice
%X : tableau de variables
%vmiss : valeur manquante
%moyX : moyenne de chaque colonne de X
%%%%Parametre de sortie%%%%
%stdX : ecart−type de chaque colonne de X
som=0;
for j=1:p
som=0; kmis=0;
for i=1:n
if X(i,j)6=vmiss
kmis=kmis+1;
som=som+(X(i,j)−moyX(j))ˆ2;end;
end;stdX(j)=sqrt(som/(kmis−1));ssx(j)=som;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%reduction=programme de reduction d'un vecteur ou des colonnes d'un
%tableau.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[X]=reduction(n,p,X,stdX,vmiss)
%%%%Parametres d'entree%%%%
%n : nombre de lignes de la matrice
%p : nombre de colonnes de la matrice
%X : tableau de variables
%vmiss : valeur manquante
%stdX : ecart−type des colonnes de X
%%%%Parametre de sortie%%%%
%X : matrice reduite
for j=1:p
for i=1:n
if X(i,j)6=vmiss %vmiss=valeur manquante
X(i,j)=X(i,j)/stdX(j);%stdX=ecart−type des colonnes de X
end;end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%centrage= programme de centrage d'un vecteur ou des colonnes d'un tableau
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[X]=centrage(n,p,vmiss,X,moyX)
%%%%Parametres d'entree%%%%
%n : nombre de lignes de la matrice
%p : nombre de colonnes de la matrice
%X : tableau de variables
26
%vmiss : valeur manquante
%moyX : moyenne de chaque colonne de X
%%%%Parametre de sortie%%%%
%X : matrice centree
for j=1:p
for i=1:n
if X(i,j)6=vmiss
X(i,j)=X(i,j)−moyX(j);end;
end;end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%projection=programme qui permet de calculer la matrice
%T*(T'*T)ˆ(−1)*T'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[L]=projection(TT)
%%%%%Parametre d'entree%%%%
%TT : composante PLS
%%%%%Parametre de sortie%%%%
%L : matrice T*(T'*T)ˆ(−1)*T'
U=TT'*TT;
V=diag(U); %diagonalisation
for i=1:length(V)
Vinv(i)=1/V(i);
endUinv=diag(Vinv);
L=TT*Uinv*TT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%tabmod=fonction qui permet de modifier le tableau de la selection de
% variable pour obtenir les numeros des variables correspondant au tableau
% initial.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[newtab]=tabmod(tab)
%%%%Parametres d'entree%%%%
%tab : tableau initial
%%%%Parametres de sortie%%%%
%tabmod : numeros des variables correspondant au tableau initial
newtab=tab;
for i=(size(newtab,1)−1):−1:1for j=(i+1):size(newtab,1)
if (newtab(j)≥newtab(i))
newtab(j)=newtab(j)+1;
end
end
27
Annexe B
Programmation de l’interface
%INTERFACE GRAPHIQUE de MIAJ RPLS V2009 1
%AUTEUR : Amandine Blin & Jean−Pierre Gauchi
%BIBLIOGRAPHIE :
%Tenenhaus M., 1998, La regression PLS, Editions Technip
%Tenenhaus M., Gauchi J.P, Menardon C., 1995, Regression PLS et
%applications, statistique appliquee, 7−63
%Copyright© INRA 2009
function varargout = MIAJ RPLS V2009 1(varargin)
% Begin initialization code − DO NOT EDIT
gui Singleton = 1;
gui State = struct('gui Name', mfilename, ...
'gui Singleton', gui Singleton, ...
'gui OpeningFcn', @MIAJ RPLS V2009 1 OpeningFcn, ...
'gui OutputFcn', @MIAJ RPLS V2009 1 OutputFcn, ...
'gui LayoutFcn', [] , ...
'gui Callback', []);
if nargin && ischar(varargin{1})gui State.gui Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui mainfcn(gui State, varargin{:});else
gui mainfcn(gui State, varargin{:});end% End initialization code − DO NOT EDIT
function MIAJ RPLS V2009 1 OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = MIAJ RPLS V2009 1 OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
29
%Bouton qui permets de choisir les differentes regressions%
function popupmenu choixfct Callback(hObject, eventdata, handles)
a1=get(hObject,'Value');
switch a1; % suivant le choix de l'utilisateur
case 1 % Cas de la regression PLS1 sans selection de variables
%On modifie la visibilite de certains elements:
set(handles.checkbox donnmanquante,'Visible','on');
set(handles.edit nblim,'Visible','on');
set(handles.pushbutton calcul,'Visible','on');
set(handles.pushbutton quit,'Visible','on');
set(handles.edit nbY,'Visible','on');
set(handles.edit sauvegarde,'Visible','off');
set(handles.edit tjeu,'Visible','off');
set(handles.edit7,'Visible','off');
set(handles.checkbox choix sauvegarde,'Visible','on');
set(handles.checkbox intervalle,'Visible','on');
set(handles.checkbox jeu,'Visible','on');
set(handles.checkbox Q2,'Visible','on');
set(handles.checkbox LC,'Visible','on');
set(handles.checkbox transposition,'Visible','on');
set(handles.text10,'Visible','on');
set(handles.text8,'Visible','on');
set(handles.text5,'Visible','on');
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.text20,'Visible','off');
set(handles.text22,'Visible','off');
set(handles.edit varcons,'Visible','off');
set(handles.fichiertest,'Visible','off');
set(handles.popupmenu choix intervalle,'Visible','on');
set(handles.popupmenu choix jeu,'Visible','on');
set(handles.pushbutton tab,'Visible','off');
%On modifie les valeurs initiales dans les champs:
set(handles.edit nbY,'String','1');
set(handles.edit nblim,'String','20');
case 2 %cas de la regression PLS1 avec selection de variables
%On modifie la visibilite de certains elements:
set(handles.checkbox donnmanquante,'Visible','on');
set(handles.edit nblim,'Visible','on');
set(handles.edit tjeu,'Visible','off');
set(handles.pushbutton calcul,'Visible','on');
set(handles.pushbutton quit,'Visible','on');
set(handles.edit nbY,'Visible','on');
set(handles.edit sauvegarde,'Visible','off');
set(handles.edit7,'Visible','off');
set(handles.checkbox choix sauvegarde,'Visible','on');
set(handles.checkbox intervalle,'Visible','off');
set(handles.checkbox jeu,'Visible','off');
set(handles.checkbox Q2,'Visible','off');
set(handles.checkbox LC,'Visible','off');
set(handles.checkbox transposition,'Visible','on');
set(handles.text10,'Visible','off');
30
set(handles.text8,'Visible','off');
set(handles.text5,'Visible','off');
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.text19,'Visible','off');
set(handles.text20,'Visible','off');
set(handles.text18,'Visible','off');
set(handles.text22,'Visible','off');
set(handles.text23,'Visible','off');
set(handles.edit varcons,'Visible','off');
set(handles.fichiertest,'Visible','off');
set(handles.popupmenu choix intervalle,'Visible','off');
set(handles.text24,'Visible','off');
set(handles.text25,'Visible','off');
set(handles.edit conf,'Visible','off');
set(handles.popupmenu choix jeu,'Visible','off');
set(handles.pushbutton tab,'Visible','on');
%On modifie les valeurs initiales dans les champs:
set(handles.edit nbY,'String','1');
set(handles.edit nblim,'String','20');
case 3 % cas de la regression PLS2 sans selection de variables
% on modifie la visibilite de certains elements
set(handles.checkbox donnmanquante,'Visible','on');
set(handles.edit nblim,'Visible','on');
set(handles.edit tjeu,'Visible','off');
set(handles.pushbutton calcul,'Visible','on');
set(handles.pushbutton quit,'Visible','on');
set(handles.edit nbY,'Visible','on');
set(handles.edit sauvegarde,'Visible','off');
set(handles.edit7,'Visible','off');
set(handles.checkbox choix sauvegarde,'Visible','on');
set(handles.checkbox intervalle,'Visible','on');
set(handles.checkbox jeu,'Visible','on');
set(handles.checkbox Q2,'Visible','on');
set(handles.checkbox LC,'Visible','off');
set(handles.checkbox transposition,'Visible','on');
set(handles.text10,'Visible','on');
set(handles.text8,'Visible','on');
set(handles.text5,'Visible','on');
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.text20,'Visible','off');
set(handles.text22,'Visible','off');
set(handles.text18,'Visible','on');
set(handles.text19,'Visible','on');
set(handles.edit varcons,'Visible','off');
set(handles.fichiertest,'Visible','off');
set(handles.popupmenu choix intervalle,'Visible','on');
set(handles.popupmenu choix jeu,'Visible','on');
set(handles.pushbutton tab,'Visible','off');
%On modifie les valeurs initiales dans les champs:
set(handles.edit nbY,'String','2');
31
set(handles.edit nblim,'String','20');
case 4 % cas de la regression PLS2 avec selection de variables
% on modifie la visibilite de certains elements
set(handles.checkbox donnmanquante,'Visible','on');
set(handles.edit nblim,'Visible','on');
set(handles.edit tjeu,'Visible','off');
set(handles.pushbutton calcul,'Visible','on');
set(handles.pushbutton quit,'Visible','on');
set(handles.edit nbY,'Visible','on');
set(handles.edit sauvegarde,'Visible','off');
set(handles.edit7,'Visible','off');
set(handles.checkbox choix sauvegarde,'Visible','on');
set(handles.checkbox intervalle,'Visible','off');
set(handles.checkbox jeu,'Visible','off');
set(handles.checkbox Q2,'Visible','off');
set(handles.checkbox LC,'Visible','off');
set(handles.checkbox transposition,'Visible','on');
set(handles.text10,'Visible','off');
set(handles.text8,'Visible','off');
set(handles.text5,'Visible','off');
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.text20,'Visible','off');
set(handles.text18,'Visible','off');
set(handles.text19,'Visible','off');
set(handles.text22,'Visible','off');
set(handles.text23,'Visible','off');
set(handles.text24,'Visible','off');
set(handles.text25,'Visible','off');
set(handles.edit conf,'Visible','off');
set(handles.edit varcons,'Visible','off');
set(handles.fichiertest,'Visible','off');
set(handles.popupmenu choix intervalle,'Visible','off');
set(handles.popupmenu choix jeu,'Visible','off');
set(handles.pushbutton tab,'Visible','on');
%On modifie les valeurs initiales dans les champs:
set(handles.edit nbY,'String','2');
set(handles.edit nblim,'String','20');
end %fin pour la programmation du bouton choix des menus
function popupmenu choixfct CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%Bouton pour les donnees manquantes%
function checkbox donnmanquante Callback(hObject, eventdata, handles)
%Choix du nom du fichier que l'on veut importer%
function edit fichier Callback(hObject, eventdata, handles)
fichier=get(handles.edit fichier,'String');
32
function edit fichier CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%On rentre le nombre de variables explicatives%
function edit nbY Callback(hObject, eventdata, handles)
tailleY=str2double(get(hObject,'String'));
% on initialise certains parametres en fonction du choix de l'utilisateur
switch get(handles.popupmenu choixfct,'Value')
case 1 %regression PLS1 sans selection de variables
if ((tailleY)>1)
warndlg('On est en PLS1, Y doit etre un vecteur!','ATTENTION!!');
endcase 2 %regression PLS1 avec selection de variables
if (tailleY>1)
warndlg('On est en PLS1, Y doit etre un vecteur!','ATTENTION!!');
endcase 3 % regression PLS2 sans selection de variables
if (tailleY<2)
warndlg('On est en PLS2, Y doit etre constitue d''au moins 2
variables!','ATTENTION!!');
endcase 4 % regression PLS2 avec selection de variables
if (tailleY<2)
warndlg('On est en PLS2, Y doit etre constitue d''au moins 2
variables!','ATTENTION!!');
endend
function edit nbY CreateFcn(hObject, eventdata, handles)
%Choix du nombre de composantes choisi a priori%
function edit nblim Callback(hObject, eventdata, handles)
function edit nblim CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%taux pour le tirage aleatoire%
function edit tjeu Callback(hObject, eventdata, handles)
tal=str2double(get(hObject,'String'));
if ((tal)>80)
warndlg('Choisissez un taux inferieur');
endif ((tal)==0)
warndlg('Choisissez un taux superieur');
end
function edit tjeu CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
33
%Choix de sauvegarde des resultats%
function checkbox choix sauvegarde Callback(hObject, eventdata, handles)
if (get(hObject,'Value')==1)%on sauvegarde
%visibilite du cadre pour le nom du fichier
set(handles.text fichier sauvegarde,'Visible','on');
set(handles.edit sauvegarde,'Visible','on');
set(handles.text20,'Visible','on');
else%visibilite du cadre pour le nom du fichier
set(handles.text fichier sauvegarde,'Visible','off');
set(handles.edit sauvegarde,'Visible','off');
set(handles.text20,'Visible','off');
end
%nom fichier de sauvegarde
function edit sauvegarde Callback(hObject, eventdata, handles)
function edit sauvegarde CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%Nom du fichier−test que l'on veut importer
function edit7 Callback(hObject, eventdata, handles)
function edit7 CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%Nombre de variables que l'on veut garder lors de regressions avec
%selection
function edit varcons Callback(hObject, eventdata, handles)
function edit varcons CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%niveau de confiance pour IC
function edit conf Callback(hObject, eventdata, handles)
niv=str2double(get(hObject,'String'));
if ((niv)>99)
warndlg('Choisissez un pourcentage inferieur pour le seuil de confiance');
endif ((niv)<80)
warndlg('Choisissez un pourcentage superieur pour le seuil de confiance');
end
function edit conf CreateFcn(hObject, eventdata, handles)
34
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%Cas ou l'on veut calculer des intervalles de confiance%
function checkbox intervalle Callback(hObject, eventdata, handles)
if (get(hObject,'Value')==1)
switch get(handles.popupmenu choix intervalle,'Value')
case 1
set(handles.text24,'Visible','on');
set(handles.text25,'Visible','on');
set(handles.edit conf,'Visible','on');
case 2
set(handles.text24,'Visible','on');
set(handles.text25,'Visible','on');
set(handles.edit conf,'Visible','on');
case 3
set(handles.text24,'Visible','off');
set(handles.text25,'Visible','off');
set(handles.edit conf,'Visible','off');
end;else
set(handles.text24,'Visible','off');
set(handles.text25,'Visible','off');
set(handles.edit conf,'Visible','off');
end;
%Choix de technique pour le calcul d'intervalle de confiance
function popupmenu choix intervalle Callback(hObject, eventdata, handles)
function popupmenu choix intervalle CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%Cas ou l'on veut effectuer un jeu−testfunction checkbox jeu Callback(hObject, eventdata, handles)
if (get(hObject,'Value')==1)
switch get(handles.popupmenu choix jeu,'Value');
case 1
%visibilite du cadre pour le nom du fichier
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.edit tjeu,'Visible','off');
set(handles.fichiertest,'Visible','on');
set(handles.edit7,'Visible','on');
case 2
%visibilite du cadre pour le nom du fichier
set(handles.text11,'Visible','on');
set(handles.text17,'Visible','on');
set(handles.edit tjeu,'Visible','on');
35
set(handles.fichiertest,'Visible','off');
set(handles.edit7,'Visible','off');
end
elseset(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.edit tjeu,'Visible','off');
set(handles.fichiertest,'Visible','off');
set(handles.edit7,'Visible','off');
end;
%Cas ou on veut effectuer un test du Q2
function checkbox Q2 Callback(hObject, eventdata, handles)
%Cas ou on veut effectuer un test de LC
function checkbox LC Callback(hObject, eventdata, handles)
%Cas ou l'on veut transposer le tableau de donnees
function checkbox transposition Callback(hObject, eventdata, handles)
%choix du jeu−testfunction popupmenu choix jeu Callback(hObject, eventdata, handles)
switch get(handles.popupmenu choix jeu,'Value');
case 1
%visibilite du cadre pour le nom du fichier
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.edit tjeu,'Visible','off');
set(handles.fichiertest,'Visible','on');
set(handles.edit7,'Visible','on');
case 2
%visibilite du cadre pour le nom du fichier
set(handles.text11,'Visible','on');
set(handles.text17,'Visible','on');
set(handles.edit tjeu,'Visible','on');
set(handles.fichiertest,'Visible','off');
set(handles.edit7,'Visible','off');
end
function popupmenu choix jeu CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%%%%%%%%%%%%%%%%%%Realisation des differents algorithmes%%%%%%%%%%%%%%%%%%
% −−− Executes on button press in pushbutton calcul.
function pushbutton calcul Callback(hObject, eventdata, handles)
global TT Xnew TAB Don
%Initialisation:on recupere tout ce que contiennent les boites:
36
%debut de l'horloge
tic
donmanquante=get(handles.checkbox donnmanquante,'Value');
composantes=str2double(get(handles.edit nblim,'String'));
tailleY=str2double(get(handles.edit nbY,'String'));
tal=(str2double(get(handles.edit tjeu,'String')))/100;
conf=str2double(get(handles.edit conf,'String'));
choix sauvegarde=get(handles.checkbox choix sauvegarde, 'Value');
intervalle=get(handles.checkbox intervalle,'Value');
sauvegarde=get(handles.edit sauvegarde,'String');
jeu=get(handles.checkbox jeu,'Value');
Q2=get(handles.checkbox Q2,'Value');
LC=get(handles.checkbox LC,'Value');
transposition=get(handles.checkbox transposition,'Value');
vmiss=999999; %remplacement des valeurs manquantes
alpha=0.05;
%Importation des donnees:%
fichier=get(handles.edit fichier,'String');
if (all(fichier(end−2:end)=='xls'))Don=xlsread(fichier(1:end−4));
elseif (all(fichier(end−2:end)=='txt'))
Don=load(fichier);
elsewarndlg('Seuls les formats .xls ou .txt sont acceptes','ATTENTION!!');
endend
%Cas ou on veut transposer les donnees du tableaux
if transposition==1
Don=Don'; %transposition du fichier
end;
%%%Calculs selon la regression choisie%%%
switch get(handles.popupmenu choixfct,'Value')
%%%%%%%%%%%%%CAS REGRESSION PLS1%%%%%%%%%%%%%%%%
case 1
disp('*********************************************************')
disp('*********************************************************')
disp('Nom du programme : MIAJ RPLS V2009 1')
disp('Methode mise en oeuvre : regression PLS1 sans selection de variables')
disp('Nom du fichier traite')
disp(fichier)
if transposition==1
disp('On a transpose le tableau de donnees')
elsedisp('On n''a pas transpose le tableau de donnees')
end;
37
%definition des variables reponses et explicatives:
Y=Don(:,end);X=Don(:,1:(end−1));n=size(Don,1);
p=size(X,2);
q=size(Y,2) ;
disp('Nombre de variables explicatives')
disp(p)
disp('Nombre de variables reponses')
disp(q)
disp('Nombre d''observations')
disp(n)
%identification des donnees manquantes:
if (donmanquante==1)
%on remplace les blancs correspondant aux donnees manquantes par vmiss.
X(isnan(X))=vmiss;
Y(isnan(Y))=vmiss;
end
%%%centrage−reduction des tableaux:%%%
if (donmanquante==1) %donnees avec valeurs manquantes
moyX=moyenne(n,p,X,vmiss);
moyY=moyenne(n,q,Y,vmiss);
[stdX,ssx]=ecart type(n,p,X,moyX,vmiss);
[stdY,ssY]=ecart type(n,q,Y,moyY,vmiss);
elsemoyX=mean(X);
moyY=mean(Y);
stdX=std(X);
stdY=std(Y);
end
[Xc]=centrage(n,p,vmiss,X,moyX);
[E0]=reduction(n,p,Xc,stdX,vmiss);
[Yc]=centrage(n,q,vmiss,Y,moyY);
[F0]=reduction(n,q,Yc,stdY,vmiss);
%initialisation%
snip=10ˆ(−10);A=p;
uini=zeros(n,1);
itnip=100;
L=500;
if (composantes>p)
error('Le nombre limite de composantes PLS fixe depasse le nombre
de variables');
end%lancement des algorithmes:
if (donmanquante==0) %cas ou il n'y a pas de donnees manquantes
disp('Il n''existe pas de donnees manquantes');
38
disp('*********************************************************')
%regression PLS1 sans donnees manquantes
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV,taux]=
PLS1 sans DM(composantes,E0,F0,snip,uini);
disp('*********************************************************')
disp('Resultats pour le nombre de composantes choisi a priori')
disp('*********************************************************')
disp('TT : composantes PLS')
disp(TT)
disp('*********************************************************')
disp('PP : coefficients de regression de E0 sur TT')
disp(PP)
disp('*********************************************************')
disp('CC : coefficients de regression de F0 sur TT')
disp(CC)
disp('*********************************************************')
disp('WW : vecteurs propres');
disp(WW)
disp('*********************************************************')
disp('WWS : W tilde')
disp(WWS)
disp('*********************************************************')
disp('UU : composantes associees au tableau Y')
disp(UU)
disp('*********************************************************')
disp('BETA : coefficients de regression de Y sur X pour les donnees
centrees reduites')
disp(BETA)
disp('*********************************************************')
disp('LEV : matrice des leviers')
disp(LEV)
%calculs des equations de regression
[betan]=eq PLS1 sans DM(composantes,BETA,X,Y);
disp('*********************************************************')
disp('Coefficients de regressions PLS pour les donnees brutes')
disp('*********************************************************')
disp('betan : coefficients des equations de regression pour les
donnees brutes')
disp(betan)
%Reconstitution des donnees et prediction sur un jeu de
%donnees
[ylc,rmse]=res pred jeu(X,Y,betan,composantes);
disp('*********************************************************')
disp('Reconstitution sur les donnees d''origine en fonction du
nombre de composantes')
disp('*********************************************************')
ylc2=[ylc Y];
disp('ylc : y reconstitue en fonction des composantes (prevision).
La derniere colonne est le y d''origine.')
disp(ylc2)
disp('*********************************************************')
39
disp('rmse : residual mean square error en fonction des composantes')
disp(rmse)
if intervalle==1
%intervalle de confiance
disp('*********************************************************')
disp('Calcul des intervalles de confiance sur les coefficients de
regression PLS')
disp('*********************************************************')
% suivant le choix de l'utilisateur
switch get(handles.popupmenu choix intervalle,'Value');
case 1 %jacknife
intervalle=JACK(n,p,q,Don,composantes,vmiss,snip,conf) ;
disp('*********************************************************')
disp('intervalles de confiance obtenus par la methode jacknife
pour la derniere composante')
disp(intervalle)
case 2 %boostrap
intervalle=bootstrap(L,Don,composantes,vmiss,snip,uini,conf);
disp('*********************************************************')
disp('intervalles de confiance obtenus par la methode bootstrap
pour la derniere composante')
disp(intervalle)
case 3 %approximation
intervalle=approximation PLS1(n,p,X,Y,composantes,ylc,BETA);
disp('*********************************************************')
disp('intervalles de confiance par approximation pour la derniere
composante')
disp(intervalle)
endend;
if jeu==1
disp('*********************************************************')
disp('Reconstitution et prediction sur un jeu−test en fonction du
nombre de composantes')
disp('*********************************************************')
switch get(handles.popupmenu choix jeu,'Value');
case 1
%Importation des donnees:%
fichier test=get(handles.edit7,'String');
disp('Nom du fichier−test')disp(fichier test)
if (all(fichier test(end−2:end)=='xls'))Don test=xlsread(fichier test(1:end−4));
elseif (all(fichier test(end−2:end)=='txt'))
Don test=load(fichier test);
elsewarndlg('Seuls les formats .xls ou .txt sont
40
acceptes','ATTENTION!!');
endendytest=Don test(:,end);xtest=Don test(:,1:(end−1));ntest=size(Don test,1);
ptest=size(xtest,2);
qtest=size(ytest,2);
uini=zeros(ntest,1);
moyXtest=mean(xtest);
moyYtest=mean(ytest);
stdXtest=std(xtest);
stdYtest=std(ytest);
[Xctest]=centrage(ntest,ptest,vmiss,xtest,moyXtest);
[E0test]=reduction(ntest,ptest,Xctest,stdXtest,vmiss);
[Yctest]=centrage(ntest,qtest,vmiss,ytest,moyYtest);
[F0test]=reduction(ntest,qtest,Yctest,stdYtest,vmiss);
[TTtest,PPtest,UUtest,WWtest,WWStest,CCtest,BETAtest,
ychaptest,LEVtest,tauxtest]=
PLS1 sans DM(composantes,E0test,F0test,snip,uini);
[betantest]=eq PLS1 sans DM(composantes,BETAtest,xtest,ytest);
[ylc,rmse]=res pred jeu(xtest,ytest,betantest,composantes);
disp('*********************************************************')
disp('ylc : y reconstitue en fonction des composantes pour le
jeu−test')disp(ylc)
disp('*********************************************************')
disp('rmse : residual mean square error en fonction des composantes
pour le jeu−test')disp(rmse)
case 2
[nal,seldef,nlearn,ntest,xtest,ytest]=tirage aleatoire(X,Y,tal);
[ylc,rmse]=res pred jeu(xtest,ytest,betan,composantes);
disp('*********************************************************')
disp('ylc : y reconstitue en fonction des composantes pour le
jeu−test')disp(ylc)
disp('*********************************************************')
disp('rmse : residual mean square error en fonction des composantes
pour le jeu−test')disp(rmse)
end;end;
else %cas ou il y a des donnees manquantes
disp('Il existe des donnees manquantes');
disp('*********************************************************')
%regression PLS1 avec donnees manquantes
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV,taux]=
PLS DM(composantes,E0,F0,vmiss,itnip,composantes);
disp('*********************************************************')
disp('Resultats pour le nombre de composantes choisi a priori')
41
disp('*********************************************************')
disp('TT : composantes PLS')
disp(TT)
disp('*********************************************************')
disp('PP : coefficients de regression de E0 sur TT')
disp(PP);
disp('*********************************************************')
disp('CC : coefficients de regression de F0 sur TT')
disp(CC);
disp('*********************************************************')
disp('WW : vecteurs propres');
disp(WW);
disp('*********************************************************')
disp('WWS : W tilde')
disp(WWS);
disp('*********************************************************')
disp('UU : composantes associees au tableau Y')
disp(UU);
disp('*********************************************************')
disp('BETA : coefficients de regression de Y sur X pour les donnees
centrees reduites')
disp(BETA)
disp('*********************************************************')
disp('LEV : matrice des leviers')
disp(LEV);
%calculs equations de regression
[betan]=eq PLS1 DM(composantes,BETA,X,Y);
disp('*********************************************************')
disp('Coefficients de regressions PLS pour les donnees brutes')
disp('*********************************************************')
disp('betan : coefficients de regression')
disp(betan);
%Reconstitution des donnees et prediction sur un jeu de
%donnees
[ylc,rmse]=res pred jeu DM(X,Y,betan,composantes,vmiss);
disp('*********************************************************')
disp('Reconstitution sur les donnees d''origine en fonction du nombre
de composantes')
disp('*********************************************************')
ylc2=[ylc Y];
disp('ylc : y reconstitue en fonction des composantes (prevision).
La derniere colonne est le y d''origine.')
disp(ylc2);
disp('*********************************************************')
disp('rmse : residual mean square error en fonction des composantes')
disp(rmse);
if intervalle==1
disp('*********************************************************')
disp('Calcul des intervalles de confiance sur les coefficients de
regression PLS')
disp('*********************************************************')
% suivant le choix de l'utilisateur
42
switch get(handles.popupmenu choix intervalle,'Value');
case 1 %jacknife
intervalle=
JACK DM(n,p,q,Don,composantes,vmiss,donmanquante,itnip,conf);
disp('*********************************************************')
disp('intervalles de confiance obtenus par la methode jacknife
pour la derniere composante')
disp(intervalle)
case 2 %boostrap
intervalle=
bootstrap DM(L,Don,composantes,vmiss,donmanquante,itnip,conf);
disp('*********************************************************')
disp('intervalles de confiance obtenus par la methode boostrap
pour la derniere composante')
disp(intervalle)
case 3 %approximation
disp('Il n''existe pas d''intervalles de confiance par la methode
d''approximation')
endend;
end
%tests
if Q2==1
disp('*********************************************************')
disp('Choix du nombre de composantes PLS significatives par le
test du Q2')
%validation croisee
[Q2cum,H,nb]=validation croisee PLS1(F0,ychap,LEV,composantes);
disp('*********************************************************')
disp('Le premier vecteur donne le Q2cum')
disp(H(:,1))
disp('Le deuxieme vecteur donne le resultat du test qui est egal
a 1 si on conserve la composante')
disp(H(:,2))
disp('Nombre de composantes PLS significatives')
disp(nb)
end;
if LC==1 %test de LC
disp('*********************************************************')
disp('Choix du nombre de composantes PLS significatives par le
test de Lazraq−Cleroux')[thsig]=Lazraq cleroux(E0,F0,composantes,TT,alpha);
disp('*********************************************************')
disp('Nombre de composantes PLS significatives')
disp(thsig)
end;
%Calcul des pouvoirs d'explication de E0 et F0
disp('*********************************************************')
43
disp('Calcul des pouvoirs d''explication de E0 et F0 (voir article
de M. Tenenhaus, J−P Gauchi et C. Menardo [7])')
pouvoir explication=calcul taux explication(composantes,TT,PP,CC);
disp('*********************************************************')
disp('La premiere colonne donne le pouvoir de chaque t h pour resumer E0')
disp('La deuxieme colonne donne le pouvoir des h premiers t h pour resumer E0')
disp('La troisieme colonne donne le pouvoir de chaque t h pour resumer F0')
disp('La quatrieme colonne donne le pouvoir des h premiers t h pour resumer F0')
disp(pouvoir explication)
%Enregistrement des resultats
if (choix sauvegarde==1)
nom=strcat(sauvegarde, '.mat');
save(nom, 'TT', 'PP', 'UU', 'WW', 'WWS','CC', 'BETA', 'ylc');
end
t=toc;
disp('*********************************************************')
disp('temps ecoule en secondes')
disp(t)
%fin horloge
%%%%%%%%%%%%%CAS REGRESSION PLS1 avec selection de variables%%%%%%%%%%%%%%%%
case 2
disp('*********************************************************')
disp('*********************************************************')
disp('Nom du programme : MIAJ RPLS V2009 1')
disp('Methode mise en oeuvre : regression PLS1 avec selection de
variables')
disp('Nom du fichier traite')
disp(fichier)
%definition des variables reponses et explicatives:
Y=Don(:,end);X=Don(:,1:(end−1));
%identification des donnees manquantes:
if (donmanquante==1)
%on remplace les blancs correspondant aux donnees manquantes par vmiss.
X(isnan(X))=vmiss;
Y(isnan(Y))=vmiss;
end
%centrage−reduction des tableaux%
n=size(Don,1);
p=size(X,2);
q=size(Y,2);
disp('Nombre de variables explicatives')
disp(p)
disp('Nombre de variables reponses')
disp(q)
disp('Nombre d''observations')
disp(n)
44
if (donmanquante==1) %donnees avec valeurs manquantes
moyX=moyenne(n,p,X,vmiss);
moyY=moyenne(n,q,Y,vmiss);
[stdX,ssx]=ecart type(n,p,X,moyX,vmiss);
[stdY,ssY]=ecart type(n,q,Y,moyY,vmiss);
elsemoyX=mean(X);
moyY=mean(Y);
stdX=std(X);
stdY=std(Y);
end
[Xc]=centrage(n,p,vmiss,X,moyX);
[E0]=reduction(n,p,Xc,stdX,vmiss);
[Yc]=centrage(n,q,vmiss,Y,moyY);
[F0]=reduction(n,q,Yc,stdY,vmiss);
%initialisation%
snip=10ˆ(−10);A=composantes;
uini=zeros(n,1);
if (composantes>p)
error('Le nombre limite de composantes PLS fixe depasse le
nombre de variables');
end%lancement des algorithmes:
if (donmanquante==0) %cas ou il n'y a pas de donnees manquantes
disp('Il n''existe pas de donnees manquantes');
disp('*********************************************************')
disp('Veuillez patienter')
disp('*********************************************************')
[Xnew,TAB]=PLS1 selection(X,E0,F0,A,snip,uini,composantes);
else %cas ou il y a des donnees manquantes
disp('Il existe des donnees manquantes');
disp('*********************************************************')
disp('Veuillez patienter')
disp('*********************************************************')
[Xnew,TAB]=PLS1 selectionDM(X,E0,F0,A,snip,uini,composantes);
end
set(handles.checkbox donnmanquante,'Visible','off');
set(handles.edit nblim,'Visible','off');
set(handles.pushbutton calcul,'Visible','off');
set(handles.pushbutton quit,'Visible','on');
set(handles.edit nbY,'Visible','off');
set(handles.edit sauvegarde,'Visible','off');
set(handles.edit tjeu,'Visible','off');
set(handles.edit7,'Visible','off');
set(handles.checkbox choix sauvegarde,'Visible','on');
set(handles.checkbox intervalle,'Visible','off');
set(handles.checkbox jeu,'Visible','off');
set(handles.checkbox Q2,'Visible','off');
set(handles.checkbox LC,'Visible','off');
45
set(handles.checkbox transposition,'Visible','off');
set(handles.text10,'Visible','off');
set(handles.text8,'Visible','off');
set(handles.text5,'Visible','off');
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.text20,'Visible','off');
set(handles.text22,'Visible','on');
set(handles.text23,'Visible','off');
set(handles.text1,'Visible','off');
set(handles.text2,'Visible','off');
set(handles.text12,'Visible','off');
set(handles.text13,'Visible','off');
set(handles.text7,'Visible','off');
set(handles.text9,'Visible','off');
set(handles.text14,'Visible','off');
set(handles.text15,'Visible','off');
set(handles.text4,'Visible','off');
set(handles.edit varcons,'Visible','on');
set(handles.edit fichier,'Visible','off');
set(handles.fichiertest,'Visible','off');
set(handles.popupmenu choix intervalle,'Visible','off');
set(handles.popupmenu choix jeu,'Visible','off');
set(handles.popupmenu choixfct,'Visible','off');
toc
t=toc ;
%fin horloge
%%%%%%%%%%%%%CAS REGRESSION PLS2 sans selection de variables%%%%%%%%%%%%%%%%
case 3
disp('*********************************************************')
disp('*********************************************************')
disp('Nom du programme : MIAJ RPLS V2009 1')
disp('Methode mise en oeuvre : regression PLS2 sans selection de variables')
disp('Nom du fichier traite')
disp(fichier)
%definition des variables
Y=Don(:,end−(tailleY−1):end);%variables explicatives
X=Don(:,1:(end−tailleY)); %variables reponses
%centrage−reduction des tableaux:%
n=size(Don,1);
p=size(X,2);
q=size(Y,2);
disp('Nombre de variables explicatives')
disp(p)
disp('Nombre de variables reponses')
disp(q)
disp('Nombre d''observations')
disp(n)
46
if (donmanquante==1) %donnees avec valeurs manquantes
X(isnan(X)==1)=vmiss;
Y(isnan(Y)==1)=vmiss;
moyenne X=moyenne(n,p,X,vmiss);
moyenne Y=moyenne(n,q,Y,vmiss);
[stdX,ssx]=ecart type(n,p,X,moyenne X,vmiss);
[stdY,ssY]=ecart type(n,q,Y,moyenne Y,vmiss);
elsemoyenne X=mean(X);
moyenne Y=mean(Y);
stdX=std(X);
stdY=std(Y);
end
[Xc]=centrage(n,p,vmiss,X,moyenne X);
[E0]=reduction(n,p,Xc,stdX,vmiss);
[Yc]=centrage(n,q,vmiss,Y,moyenne Y);
[F0]=reduction(n,q,Yc,stdY,vmiss);
%initialisation%
snip=10ˆ(−10);A=p;
uini=zeros(n,1);
itnip=100;
L=500;
if (composantes>p)
error('Le nombre limite de composantes PLS fixe depasse
le nombre de variables');
end
%lancement de l'algorithme:
if (donmanquante==0)
disp('Il n''existe pas de donnees manquantes');
disp('*********************************************************')
%regression PLS2
disp('*********************************************************')
disp('Resultats pour le nombre de composantes choisi a priori')
disp('*********************************************************')
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV]=
PLS2 sans DM(composantes,E0,F0,snip,uini);
disp('*********************************************************')
disp('TT : composantes PLS')
disp(TT)
disp('*********************************************************')
disp('PP : coefficients de regression de E0 sur TT')
disp(PP)
disp('*********************************************************')
disp('CC : coefficients de regression de F0 sur TT')
disp(CC)
disp('*********************************************************')
disp('WW : vecteurs propres');
disp(WW)
disp('*********************************************************')
disp('WWS : W tilde')
47
disp(WWS)
disp('*********************************************************')
disp('UU : composantes associees au tableau Y')
disp(UU)
disp('*********************************************************')
disp('beta : coefficients de regression de Y sur X pour les donnees
centrees reduites ')
for k=1:q
num=k;
disp('variable reponse numero')
disp(num)
beta=BETA(((k−1)*q+1):(q*k),:);disp(beta)
enddisp('*********************************************************')
disp('LEV : matrice des leviers')
disp(LEV)
%calcul equations de regression
[betan]=eq PLS2 sans DM(composantes,BETA,X,Y);
disp('*********************************************************')
disp('Coefficients de regressions PLS pour les donnees brutes')
disp('*********************************************************')
for h=1:composantes
betac(:,h)=betan(1:q,h);
betax(:,h)=betan(q+1:size(betan,1),h);
end;disp('*********************************************************')
disp('betac : constantes des coefficients des equations de
regression pour les donnees brutes ')
disp(betac)
disp('betax : coefficients des equations de regression pour les
donnees brutes')
disp(betax)
%Reconstitution des donnees et prediction sur un jeu de
%donnees
[ylctot,rmse]=res pred jeu PLS2(X,Y,betan,composantes);
disp('*********************************************************')
disp('Reconstitution sur les donnees d''origine en fonction du
nombre de composantes')
disp('*********************************************************')
disp('y ind c : chaque variable reponse reconstituee en fonction
des composantes (prevision)')
for k=1:q
num=k;
disp('variable reponse numero')
disp(num)
y ind c=ylctot((k−1)*size(X,1)+1:k*size(X,1),:);disp(y ind c)
end;
48
disp('*********************************************************')
disp('rmse : residual mean square error en fonction des composantes')
disp(rmse)
if intervalle==1
disp('*********************************************************')
disp('Calcul des intervalles de confiance sur les coefficients de
regression PLS')
% suivant le choix de l'utilisateur
switch get(handles.popupmenu choix intervalle,'Value');
case 1 %jacknife
disp('*********************************************************')
disp('intervalles de confiance obtenus par la methode jacknife pour
la derniere composante')
intervalle=
JACK PLS2(n,p,q,Don,composantes,vmiss,snip,tailleY,conf);
case 2 %boostrap
disp('*********************************************************')
disp('intervalles de confiance obtenus par la methode bootstrap pour
la derniere composante')
[intervalle]=
bootstrap PLS2(p,q,L,Don,composantes,vmiss,snip,uini,tailleY,conf);
case 3
end
end;if jeu==1
disp('*********************************************************')
disp('Reconstitution et prediction sur les donnees en fonction du
nombre de composantes')
switch get(handles.popupmenu choix jeu,'Value');
case 1
%Importation des donnees:%
fichier test=get(handles.edit7,'String');
fichier test=get(handles.edit7,'String');
disp('Nom du fichier−test')if (all(fichier test(end−2:end)=='xls'))
Don test=xlsread(fichier test(1:end−4));else
if (all(fichier test(end−2:end)=='txt'))Don test=load(fichier test);
elsewarndlg('Seuls les formats .xls ou .txt sont
acceptes','ATTENTION!!');
endendytest=Don test(:,end−(tailleY−1):end);%variables explicatives
xtest=Don test(:,1:(end−tailleY)); %variables reponses
ntest=size(Don test,1);
49
ptest=size(xtest,2);
qtest=size(ytest,2);
uinitest=zeros(ntest,1);
moyXtest=mean(xtest);
moyYtest=mean(ytest);
stdXtest=std(xtest);
stdYtest=std(ytest);
[Xctest]=centrage(ntest,ptest,vmiss,xtest,moyXtest);
[E0test]=reduction(ntest,ptest,Xctest,stdXtest,vmiss);
[Yctest]=centrage(ntest,qtest,vmiss,ytest,moyYtest);
[F0test]=reduction(ntest,qtest,Yctest,stdYtest,vmiss);
[TTtest,PPtest,UUtest,WWtest,WWStest,CCtest,BETAtest,
ychaptest,LEVtest]=
PLS2 sans DM(composantes,E0test,F0test,snip,uinitest);
[betantest]=eq PLS2 sans DM(composantes,BETAtest,xtest,ytest);
[ylctot,rmse]=res pred jeu PLS2(xtest,ytest,betantest,composantes);
disp('*********************************************************')
disp('ylctot : y reconstitue en fonction des composantes pour
le jeu−test')disp(ylctot)
disp('*********************************************************')
disp('rmse : residual mean square error en fonction des composantes
pour le jeu−test')disp(rmse)
case 2
[nal,seldef,nlearn,ntest,xtest,ytest]=tirage aleatoire(X,Y,tal);
[ylctot,rmse]=res pred jeu PLS2(xtest,ytest,betan,composantes);
disp('*********************************************************')
disp('ylctot : y reconstitue en fonction des composantes pour le
jeu−test')disp(ylctot)
disp('*********************************************************')
disp('rmse : residual mean square error en fonction des composantes
pour le jeu−test')disp(rmse)
end;
end;
else %cas des DM
disp('Il existe des donnees manquantes');
disp('*********************************************************')
%regression PLS2
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV,taux]=PLS2 DM(A,E0,F0,vmiss,itnip);
disp('*********************************************************')
disp('Resultats pour le nombre de composantes choisi a priori')
disp('*********************************************************')
disp('TT : composantes PLS')
disp(TT)
disp('*********************************************************')
disp('PP : coefficients de regression de E0 sur TT')
disp(PP)
disp('*********************************************************')
50
disp('CC : coefficients de regression de F0 sur TT')
disp(CC)
disp('*********************************************************')
disp('WW : vecteurs propres');
disp(WW)
disp('*********************************************************')
disp('WWS : W tilde')
disp(WWS)
disp('*********************************************************')
disp('UU : composantes associees au tableau Y')
disp(UU)
disp('*********************************************************')
disp('beta : coefficients de regression de Y sur X pour les donnees
centrees reduites ')
for k=1:q
num=k;
disp('variable reponse numero')
disp(num)
beta=BETA(((k−1)*q+1):(q*k),:);disp(beta)
end
disp('*********************************************************')
disp('LEV : matrice des leviers')
disp(LEV);
%calcul equations de regression
[betan]=eq PLS2 DM(composantes,BETA,X,Y);
disp('*********************************************************')
disp('Coefficients de regressions PLS pour les donnees brutes')
disp('*********************************************************')
for h=1:composantes
betac(:,h)=betan(1:q,h);
betax(:,h)=betan(q+1:size(betan,1),h);
end;disp('*********************************************************')
disp('betac : constantes des coefficients des equations de regression
pour les donnees brutes ')
disp(betac)
disp('betax : coefficients des equations de regression pour les
donnees brutes')
disp(betax)
%Reconstitution des donnees et prediction sur un jeu de
%donnees
[ylctot,rmse]=res pred jeu PLS2 DM(X,Y,betan,composantes,vmiss);
disp('*********************************************************')
disp('Reconstitution et prediction sur les donnees en fonction du
nombre de composantes')
disp('*********************************************************')
disp('y ind c : chaque variable reponse reconstituee en fonction
des composantes (prevision)')
51
for k=1:q
num=k;
disp('variable reponse numero')
disp(num)
y ind c=ylctot((k−1)*size(X,1)+1:k*size(X,1),:);disp(y ind c)
end;
disp('*********************************************************')
disp('rmse : residual mean square error en fonction des composantes')
disp(rmse)
if intervalle==1
disp('*********************************************************')
disp('Calcul des intervalles de confiance sur les coefficients
de regression PLS')
% suivant le choix de l'utilisateur
switch get(handles.popupmenu choix intervalle,'Value');
case 1 %jacknife
disp('*********************************************************')
disp('intervalles de confiance obtenu par la methode jacknife
pour la derniere composante')
intervalles=
JACK PLS2 DM(n,p,q,Don,composantes,vmiss,tailleY,donmanquante,itnip,conf);
case 2 %boostrap
disp('*********************************************************')
disp('intervalles de confiance obtenu par la methode bootstrap
pour la derniere composante')
intervalle=
bootstrap PLS2 DM(p,q,L,Don,composantes,vmiss,itnip,tailleY,
donmanquante,conf);
endend;
end
%test
if Q2==1
%validation croisee
[Q2KH,Q2H,test,nb]=validation PLS2(composantes,F0,CC,TT,vmiss);
disp('*********************************************************')
disp('Choix du nombre de composantes PLS significatives par le test
du Q2')
disp('Q2KH')
disp(Q2KH)
disp('Nombre de composantes PLS significatives')
disp(nb)
end;
% Calcul du VIP:%
52
[VIP]=Variable Importance Projection(E0,F0,WW,TT,composantes);
disp('*********************************************************')
disp('Calcul du VIP')
disp(VIP)
disp('*********************************************************')
%Calcul des pouvoirs d'explication de E0 et F0
disp('Calcul des pouvoirs d''explication de E0 et F0 (voir article de M.
Tenenhaus, J−P Gauchi et C. Menardo [7])')
pouvoir explication=calcul taux explication(composantes,TT,PP,CC);
disp('La premiere colonne donne le pouvoir de chaque t h pour resumer E0')
disp('La deuxieme colonne donne le pouvoir des h premiers t h pour resumer E0')
disp('La troisieme colonne donne le pouvoir de chaque t h pour resumer F0')
disp('La quatrieme colonne donne le pouvoir des h premiers t h pour resumer F0')
disp(pouvoir explication)
%enregistrement des reultats
if (choix sauvegarde==1)
nom=strcat(sauvegarde, '.mat');
save(nom, 'TT', 'PP', 'UU', 'WW', 'WWS','CC','BETA', 'betan',
'ylctot','Q2KH','VIP');
enddisp('*********************************************************')
toc
t=toc
%fin de l'horloge
disp('*********************************************************')
%%%%%%%%%%%%%CAS REGRESSION PLS2 avec selection de variables%%%%%%%%%%%%%%%%
case 4
disp('*********************************************************')
disp('*********************************************************')
disp('Nom du programme : MIAJ RPLS V2009 1')
disp('Methode mise en oeuvre : regression PLS2 avec selection de variables')
disp('Nom du fichier traite')
disp(fichier)
%definition des variables reponses et explicatives:
Y=Don(:,end−(tailleY−1):end);%variables explicatives
X=Don(:,1:(end−tailleY)); %variables reponses
%centrage−reduction des tableaux:%
n=size(Don,1);
p=size(X,2);
q=size(Y,2);
disp('Nombre de variables explicatives')
disp(p)
disp('Nombre de variables reponses')
disp(q)
disp('Nombre d''observations')
disp(n)
if (donmanquante==1) %donnees avec valeurs manquantes
53
X(isnan(X)==1)=vmiss;
Y(isnan(Y)==1)=vmiss;
moyX=moyenne(n,p,X,vmiss);
moyY=moyenne(n,q,Y,vmiss);
[stdX,ssx]=ecart type(n,p,X,moyX,vmiss);
[stdY,ssY]=ecart type(n,q,Y,moyY,vmiss);
elsemoyX=mean(X);
moyY=mean(Y);
stdX=std(X);
stdY=std(Y);
end
[Xc]=centrage(n,p,vmiss,X,moyX);
[E0]=reduction(n,p,Xc,stdX,vmiss);
[Yc]=centrage(n,q,vmiss,Y,moyY);
[F0]=reduction(n,q,Yc,stdY,vmiss);
%initialisation%
snip=10ˆ(−10);A=composantes;
uini=zeros(n,1);
if (composantes>p)
error('Le nombre limite de composantes PLS fixe depasse le nombre
de variables');
end%lancement des algorithmes:
if (donmanquante==0) %cas ou il n'y a pas de donnees manquantes
disp('Il n''existe pas de donnees manquantes');
disp('Veuillez patienter')
disp('*********************************************************')
[Xnew,TAB]=PLS2 selection(X,E0,F0,A,snip,uini,composantes,vmiss);
else %cas ou il y a des donnees manquantes
disp('Il existe des donnees manquantes');
disp('*********************************************************')
disp('Veuillez patienter')
disp('*********************************************************')
[Xnew,TAB]=PLS2 selection DM(X,E0,F0,A,snip,uini,composantes,vmiss);
end;
set(handles.text22,'Visible','on');
set(handles.text23,'Visible','on');
set(handles.edit varcons,'Visible','on');
toc
t=toc ;
set(handles.checkbox donnmanquante,'Visible','off');
set(handles.edit nblim,'Visible','off');
set(handles.pushbutton calcul,'Visible','off');
set(handles.pushbutton quit,'Visible','on');
set(handles.edit nbY,'Visible','off');
set(handles.edit sauvegarde,'Visible','off');
set(handles.edit tjeu,'Visible','off');
54
set(handles.edit7,'Visible','off');
set(handles.checkbox choix sauvegarde,'Visible','on');
set(handles.checkbox intervalle,'Visible','off');
set(handles.checkbox jeu,'Visible','off');
set(handles.checkbox Q2,'Visible','off');
set(handles.checkbox LC,'Visible','off');
set(handles.checkbox transposition,'Visible','off');
set(handles.text10,'Visible','off');
set(handles.text8,'Visible','off');
set(handles.text5,'Visible','off');
set(handles.text11,'Visible','off');
set(handles.text17,'Visible','off');
set(handles.text20,'Visible','off');
set(handles.text22,'Visible','on');
set(handles.text1,'Visible','off');
set(handles.text2,'Visible','off');
set(handles.text12,'Visible','off');
set(handles.text13,'Visible','off');
set(handles.text7,'Visible','off');
set(handles.text9,'Visible','off');
set(handles.text14,'Visible','off');
set(handles.text15,'Visible','off');
set(handles.text23,'Visible','on');
set(handles.text4,'Visible','off');
set(handles.edit varcons,'Visible','on');
set(handles.edit fichier,'Visible','off');
set(handles.fichiertest,'Visible','off');
set(handles.popupmenu choix intervalle,'Visible','off');
set(handles.popupmenu choix jeu,'Visible','off');
set(handles.popupmenu choixfct,'Visible','off');
end;%Fin du programme pour le lancement des algorithmes
%Tableau des variables conservees (regressions avec selection)
function pushbutton tab Callback(hObject, eventdata, handles)
global TAB Don
choix sauvegarde=get(handles.checkbox choix sauvegarde, 'Value');
fichier=get(handles.edit sauvegarde,'String');
nbvar=str2double(get(handles.edit varcons,'String'));
disp('*********************************************************')
disp('Nombre de variables que l''on souhaite conserver')
disp(nbvar)
tailleY=str2double(get(handles.edit nbY,'String'));
switch get(handles.popupmenu choixfct,'Value')
case 1
case 2
Y=Don(:,end);X=Don(:,1:end−1);TAB=TAB(2:end,1);for i=1:length(TAB)
Xnew1(:,i)= X(:,TAB(i));
end;
55
tableau des variables=[Xnew1(:,(end−nbvar+1):end) Y];
disp('*********************************************************')
disp('Tableau des variables conservees')
disp(tableau des variables)
case 3
case 4
Y=Don(:,end−(tailleY−1):end);X=Don(:,1:end−tailleY);TAB=TAB(2:end,1);for i=1:length(TAB)
Xnew1(:,i)= X(:,TAB(i));
end;tableau des variables=[Xnew1(:,(end−nbvar+1):end) Y];
disp('*********************************************************')
disp('Tableau des variables conservees')
disp(tableau des variables)
end;
%enregistrement
if (choix sauvegarde==1)
nom=strcat(fichier, '.txt');
save(nom,'tableau des variables','−ascii','−double','−tabs');end
%Pour quitter matlab
function pushbutton quit Callback(hObject, eventdata, handles)
close(MIAJ RPLS V2009 1)
56
Annexe C
Programme PLS1 sans selection de
variables sans donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%PLS1 sans DM : Cet algorithme effectue une regression PLS1 dans le cas ou il n'y a pas
% de donnees manquantes
% Il s'appuie sur le livre de M. Tenenhaus page 99
% N : Nombre d'individus
% M : Nombre de variables independantes Xj
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[TT,PP,UU,WW,WWS,CC,BETA,ychap,matrice chapeau,taux]
=PLS1 sans DM(a,E0,F0,seuil,u initial)
%%parametres d'entree%%
% E0 : matrice des variables Xj centrees−reduites% F0 : matrice des variables Yk centrees−reduites% a : rang de la matrice X
% seuil : utilse pour la boucle while
% u unitial : valeur de u au debut de la boucle
%%parametres de sortie%%
% TT : composantes PLS
% PP : coefficient de regression de E0 sur tl
% CC : coefficient de regression de F0 sur tl
% WW : vecteurs propres
% WWS : calcul des w tilde
% UU : composante PLS
% BETA : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
% ychap : prediction des y avec j composantes PLS
% matrice chapeau : matrice levier inverse(TT TT'% TT)*TT'
%Debut du programme
%Initialisation: etape 1
57
N=size(E0,1); %nombre de lignes de E0
M=size(E0,2); %nombre de colonnes de E0
E=E0;
F=F0;
ident=eye(M); %matrice identite
yc=zeros(N,1); %initialisation pour les y chapeau
nc=0;
bc=0;
%debut de la boucle FOR (1) : etape 2
for h=1:a
u=F(:,1);
%debut de la boucle WHILE
while norm(u−u initial)>seuil
w=E'*u/(u'*u); %etape 2.1
w=w/sqrt(w'*w); %etape 2.2 : normalisation de w
t=E*w/(w'*w); %etape 2.3 : calcul de la composante PLS
c=F'*t/(t'*t); %etape 2.6 : coefficient de regression de y sur t
u initial=u;
u=F*c/(c'*c); %etape 2.7
end%fin de la boucle WHILE
p=E'*t/(t'*t); % etape 2.4
%%%%%%%Debut du calcul de la matrice des leviers%%%%%%%%%%%%
%debut de la condition et du IF 1
if h==1 %cas initial
TT=t; %composante PLS
UU=u;
PP=p; %vecteur propre
WW=w;
WWS=w;
CC=c; %coefficient de la composante PLS
BETA=WWS*(CC)'; %composante de regression (page 121 du livre)
ychap=E0*BETA; %reconstitution des y
%debut boucle FOR 2
for i=1:N
%debut du IF 2
if (ychap(i)<0.5)
bc=bc+1;
elsenc=nc+1;
end;%fin du IF 2
end;%fin boucle FOR 2
taux=bc/nc;
[L1]=projection(TT);%projection de la composante PLS
L1=diag(L1);%diagonalisation
matrice chapeau=L1; %matrice des leviers
else %cas pour h=2 a a
58
matrice decompo=eye(M); %initialisation
%debut de la boucle FOR 3
for k=1:(h−1)%formule de decomposition
matrice decompo=matrice decompo*(ident−WW(:,k)*PP(:,k)');end%fin de la boucle FOR 3
%calcul de w tilde voir par 17 article de M. Tenenhaus
w tilde=matrice decompo*w;
WWS=[WWS w tilde];
TT=[TT t]; %composantes PLS
UU=[UU u];
PP=[PP p]; %vecteurs propres
WW=[WW w];
CC=[CC c];%coefficients des composantes PLS
BETA=[BETA WWS*(CC)']; %composantes de regression
%debut de la boucle FOR 3
for k=1:h
%reconstitution des y avec l'equation de regression
yc(:,1)=yc(:,1)+TT(:,k)*CC(:,k);
end%fin de la boucle FOR 3
ychap=[ychap yc]; %calcul predictions
%calcul du taux de classement
%debut de la boucle FOR 4
for i=1:N
%debut de la boucle FOR 5
for j=1:h
%debut du IF 3
if (ychap(i,j)<0.5)
bc=bc+1;
elsenc=nc+1;
end;%fin du IF 3
end;%fin de la boucle FOR 5
end;%fin de la boucle FOR 4
taux=bc/nc;
[L]=projection(TT); %projection des composantes PLS
L=diag(L); %diagonalisation
%matrice levier(inverse(X'X))*X'y
matrice chapeau=[matrice chapeau L];
end%fin du IF 1
%%%%%%%%%%%Calcul de la matrice des residus%%%%%%%%%%%%%%%%
%matrice des residus de la decomposition de E0 en utilisant h
%composantes (etape 2.5)
E=E−t*p';%matrice des residus de la decomposition de F0 en utilisant h
%composantes (etape 2.8)
F=F−t*c';
59
Annexe D
Programme PLS1 sans selection de
variables avec donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Algorithme PLS DM%
%L'algorithme utilise est celui du livre de M. Tenenhaus (page 28)
% Cet algorithme effectue une regression PLS1 dans le cas ou il y a
% des donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[TT,PP,UU,WW,WWS,CC,BETA,ychap,matrice chapeau,taux]=
PLS DM(a,X,Y,vmiss,itnip,composante)
% N : Nombre d'individus
% M : Nombre de variables independantes Xj
%%%%parametres d'entree%%%%
% E0 : matrice des variables Xj centrees−reduites% F0 : matrice des variables Yk centrees−reduites% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% a : rang de la matrice X
% seuil : utilse pour la boucle while
% u unitial : valeur de u au debut de la boucle
%%%%parametres de sortie%%%%
% TT : composantes PLS
% PP : coefficient de regression de E0 sur tl
% CC : coefficient de regression de F0 sur tl
% WW : vecteurs propres
% WWS : calcul des w tilde
% UU : composante PLS
% BETA : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
% ychap : prediction des y avec j composantes PLS
% matrice chapeau : matrice inverse(TT TT'% TT)*TT'
%initialisation
N=size(X,1);
61
M=size(X,2);
P=size(Y,2);
ident=diag(ones(M,1));
nc=0;
bc=0;
% debut de la boucle principale en A
for h=1:a
%debut IF 1
if h==1
uh=Y(:,1);
UU=uh;
wh=X(1,:)';
ch=Y(1,:)';
th=X(:,1);
ph=X(1,:)';
elseuh=Y(:,1);
th=X(:,1);
end%fin IF 1
%debut de l'etape d'iteration
for iter=1:itnip
%Traitement des donnees manquantes dans X
for j=1:M
whj=0;
uhj=0;
for i=1:N
%condition a ajouter lorsqu'on a des donnees manquantes
%pour calculer le w (condition (41') livre)
if (X(i,j)6=vmiss & uh(i)6=vmiss)
whj=whj+X(i,j)*uh(i);
uhj=uhj+uh(i)ˆ2;
endend%nouveau w obtenu dans le cas de donnees manquantes
whj=whj/uhj;
wh(j)=whj;
endwh=wh/sqrt(wh'*wh); %normalisation
for i=1:N
whj=0;thj=0;
for j=1:M
%condition a ajouter lorqu'on a des donnees manquantes pour
%calculer les composantes PLS t
if X(i,j)6=vmiss
thj=thj+X(i,j)*wh(j);
whj=whj+wh(j)ˆ2;
endend
thj=thj/whj;
th(i)=thj;
end
62
%Traitement des donnees manquantes dans Y
for j=1:P
chj=0;thj=0;
for i=1:N
%condition a ajouter lorsqu'on a des donnees manquantes
%pour calculer le c (condition (41') livre)
if ((Y(i,j)6=vmiss) & (th(i)6=vmiss))
chj=chj+Y(i,j)*th(i);
thj=thj+th(i)ˆ2;
endend
chj=chj/thj;
ch(j)=chj;
end
for i=1:N
chj=0;uhj=0;
for j=1:P
%condition a ajouter lorqu'on a des donnees manquantes pour
%calculer les composantes u
if Y(i,j)6=vmiss
uhj=uhj+Y(i,j)*ch(j);
chj=chj+ch(j)ˆ2;
endend
%On enleve le cas ou il y aurait une division par zero
if chj==0
chj=vmiss;
uhj=vmiss;
elseuhj=uhj/chj;
enduh(i)=uhj;
endend%fin de l'iteration
%calcul des p lors de valeurs manquantes
for j=1:M
phj=0;thj=0;
for i=1:N
if ((X(i,j)6=vmiss) & (th(i)6=vmiss))
phj=phj+X(i,j)*th(i);
thj=thj+th(i)ˆ2;
endend
phj=phj/thj;
ph(j)=phj;
end
if h==1
TT=th; %composante PLS th
PP=ph; %vecteur propre
63
UU=uh;
CC=ch;
WW=wh;
WWS=wh;
BETA=WWS*CC'; %coefficient de la regression
SX=TT(:,1)*PP(:,1)';
SY=TT(:,1)*CC(:,1)';
ychap=CC'*TT; % y reconstitues
for i=1:N
if (ychap(i)<0.5)
bc=bc+1;
elsenc=nc+1;
end;end;taux=bc/nc;
L1=diag(TT*(TT'*TT)ˆ(−1)*TT');matrice chapeau=L1; %matrice chapeau
elseTT=[TT th];%composantes PLS th
PP=[PP ph]; %vecteurs propres
UU=[UU uh];
CC=[CC ch];%coefficients des th
SX=TT(:,1)*PP(:,1)';
SY=TT(:,1)*CC(:,1)';
WW=[WW wh];
L=diag(TT*(TT'*TT)ˆ(−1)*TT');matrice chapeau=[matrice chapeau L]; %matrice chapeau
matrice decompo=diag(ones(M,1)); %initialisation
for k=1:(h−1)%formule de decomposition
matrice decompo=matrice decompo*(ident−WW(:,k)*PP(:,k)');end
%calcul de w tilde voir par 17 article
w tilde=matrice decompo*wh;
WWS=[WWS w tilde];
BETA=[BETA WWS*(CC)']; %coefficients de regression
SX=TT(:,h)*PP(:,h)';
SY=TT(:,h)*CC(:,h);
yc=zeros(N,1); %calcul des y reconstitues
for k=1:h
yc(:,1)=yc(:,1)+TT(:,k)*CC(:,k);
endychap=[ychap yc];
%calcum taux de classement
for i=1:N
for j=1:a
if (ychap<0.5)
bc=bc+1;
elsenc=nc+1;
end;end;
end;taux=bc/nc;
64
end
%calcul des matrices de residus avec les donnees manquantes
for i=1:N
for j=1:M
if X(i,j)6=vmiss
X(i,j)=X(i,j)−SX(i,j);end
endendfor i=1:N
for j=1:P
if Y(i,j)6=vmiss
Y(i,j)=Y(i,j)−SY(i,j);end
endend
end
%fin boucle pour la fin du programme
65
Annexe E
Programme PLS1 avec selection de
variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PLS1 selection :
%Ce programme est utilisee dans le cas de la regression PLS1 avec selection
%de variables avec la methode BQ.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[Xnew,TAB]=PLS1 selection(X,E0,F0,A,snip,uini,hlim)
%%%%Parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% E0 : matrice des variables Xj centrees−reduites% F0 : matrice des variables Yk centrees−reduites% A : nombre de variables explicatives
% snip : utilse pour la boucle while
% uini : valeur de u au debut de la boucle
%hlim : nombre maximal de composantes
%%%%Parametres de sortie%%%%
% Xnew : X obtenu apres selection
% TAB : tableau donnant le numeros des variables, Q2cumules et le nombre de
%composantes
%Debut du programme
%initialisation:
tab1=[];
tab2=[];
tab3=[];
Xnew=[];
%debut de la boucle WHILE
while (size(E0,2)>1) %on effectue des modeles de regression tant qu'on a
%plus d'une variable explicative
%%%%%%%Premiere etape : on effectue les modeles de regression pour p
%%%%%%%variables explicatives et on recupere les Q2cum correspondants%%%%%%%%%%%
%Creation du modele PLS1 a p variables:
66
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV,taux]=PLS1 sans DM(A,E0,F0,snip,uini);
%Test de validation croisee:
[Q2cum,H,nb]=validation croisee PLS1(F0,ychap,LEV,A); %calcul des Q2cum
%pour les p variables explicatives
%%%%%%%Deuxieme etape : calcul du nombre de composantes h a utiliser%%%%%
if nb==0 %debut IF 1
Amax=1;
end %fin IF 1
if nb>hlim %debut IF 2
Amax=hlim;
else %alternative
Amax=nb;
end %fin IF 2
%%%%%%%Troisieme etape : on recupere les BETA chapeau correspondant aux
%%%%%%%nombre de composantes h optimales%%%%%
betachap=BETA(:,Amax);
%On recupere le min des betachap en retenant bien le numero de la variable
%a enlever au sein du nouveau E0
[i,Var]=min(abs(betachap));
%Tableau des numeros des variables
tab1=[tab1;Var];
%Tableau des Q2cumules
tab2=[tab2;Q2cum(Amax)];
%Tableau du nombre de composantes
tab3=[tab3;Amax];
% On enleve la variable E0 correspondant au minimum des beta
E0=[E0(:,1:(Var−1)) E0(:,(Var+1):(size(E0,2)))];
Xnew=[Xnew X(:,Var)];
end%Fin de la boucle WHILE
%on modifie le tableau de selection de variables pour obtenir les numeros
%des variables R correspondants au tableau initial
[newtab]=tabmod(tab1);
Ord=sort(newtab);%on ordonne de facon ascendante
for i=1:size(Ord,1) %debut boucle FOR 1
if Ord(1)6=1 %debut IF 3
R=1;
else %alternative
if Ord(i)6=i %debut IF 4
R=i;
end %fin IF 4
end %fin IF 3
end %fin FOR 1
disp('*********************************************************')
disp('Numeros des variables enlevees')
67
disp(tab1)
newtab=[0;newtab;R];
tab2=[tab2;0;0];
tab3=[tab3;0;0];
TAB=[newtab tab2 tab3];
Xnew=[Xnew X(:,R)];
disp('*********************************************************')
disp('Numeros des variables conservees correspondants au tableau initial')
disp(TAB(:,1))
%sauvegarde des Q2cum dans le fichier Q2cum.mat
TAB1=TAB(:,2);
savefile = 'Q2cum.mat';
save(savefile,'TAB1','−ascii','−double','−tabs');
%%%%%Representation graphique%%%%%
figure
h=plot(TAB(:,2),'−−rs');ylabel('Qˆ2 {cum}','FontSize',12)xlabel('Nombre de variables enlevees','FontSize',12)
title('Representation graphique du nombre du Qˆ2 {cum} en fonction du
nombre du variables enlevees','FontSize',10)
saveas(h,'courbe.jpg')
hold off
grid on
%Fin du programme
%%%%%cas des donnees manquantes%%%%
Le programme est identique au precedent mis a part le fait que l'on effectue
une regression PLS1 avec donnees manquantes.
68
Annexe F
Programme PLS2 sans selection de
variables sans donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Algorithme PLS2 sans DM%
%L'algorithme utilise est celui du livre de M. Tenenhaus (page 28)
% Cet algorithme effectue une regression PLS2 dans le cas ou il n'y a pas
% de donnees manquantes
% X : matrice des donnees pour les variables independantes
% Y : matrice des donnees pour les variables dependantes.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[TT,PP,UU,WW,WWS,CC,BETA,ychap,matrice chapeau,taux]
=PLS2 sans DM(a,E0,F0,seuil,u initial)
%%parametres d'entree%%
% E0 : matrice des variables X j centrees−reduites% F0 : matrice des variables Y k centrees−reduites% a : rang de la matrice X
% seuil : utilse pour la boucle while
% u unitial : valeur de u au debut de la boucle
%%parametres de sortie%%
% TT : composantes PLS
% PP : coefficient de regression de E0 sur t l
% CC : coefficient de regression de F0 sur t l
% WW : vecteurs propres
% WWS : calcul des w tilde
% UU : composante PLS
% BETA : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
% ychap : prediction des y avec j composantes PLS
% matrice chapeau : pour le calcul PRESS, correspond a la matrice inverse(TT TT'
% TT)*TT'
%Debut du programme
%etape 1 : initialisation
s2=size(E0,2); %nombre de colonnes de E0
69
m1=size(F0,1); %nombre de lignes de F0
m2=size(F0,2); %nombre de colonnes de F0
E=E0;
F=F0;
ychap=zeros(m1,m2);
yc=zeros(m1,m2);
nc=0;
bc=0;
%etape 2 : debut de la boucle FOR 1
for h=1:a
%etape 2.1
%debut IF 1
if h==1
u=F(:,1);
UU=u;
w=E(1,:)';
c=(F(1,:))';
t=E(:,1);
p=(E(1,:))';
elseu=F(:,1);
end;%fin du IF 1
%debut de la boucle while
while norm(u−u initial)>seuil %etape 2.2: repeter jusqu'a convergence de w h
w=E'*u/(u'*u); %etape 2.2.1
w=w/sqrt(w'*w);%etape 2.2.2 : normalisation de w h
t=E*w/(w'*w);%etape 2.2.3
c=F'*t/(t'*t);%etape 2.2.4
u initial=u;
u=F*c/(c'*c); %etape 2.2.5
end%fin de la boucle while
p=E'*t/(t'*t);%etape 2.3
%Debut de la condition et du IF 2
if h==1 %separation cas, ici cas initial
TT=t;
UU=u;
PP=p;
WW=w;
WWS=w;
CC=c;
%debut boucle FOR 2
for k=1:m2
BETA(s2*(k−1)+1:k*s2,1)=WWS*(CC(k,1));end;%fin boucle FOR 2
ychap=TT*CC';
%debut boucle FOR 3
for i=1:m1
%debut IF 3
70
if (ychap(i)<0.5)
bc=bc+1;
elsenc=nc+1;
end;%fin IF 3
end;%fin boucle FOR 3
taux=bc/nc;
[L1]=projection(TT);
L1=diag(L1);
matrice chapeau=L1; %matrice des leviers
else %traitement des autres cas
matrice decompo=eye(s2); %matrice ayant des 1 sur la diagonale
%debut de la boucle FOR 4
for k=1:(h−1)%formule de decomposition pour calculer les w tilde
matrice decompo=matrice decompo*(eye(s2)−WW(:,k)*PP(:,k)');end%fin de la boucle FOR 4
w tilde=matrice decompo*w; %definition des w tilde
WWS=[WWS w tilde];
TT=[TT t];
UU=[UU u];
PP=[PP p];
WW=[WW w];
CC=[CC c];
%debut boucle FOR 5
for k=1:m2
BETA(s2*(k−1)+1:k*s2,h)=WWS*(CC(k,:))';end;%fin boucle FOR 5
%debut de la boucle FOR 6
for k=1:m2
yc(:,k)=yc(:,k)+TT(:,h)*CC(k,h);
end%fin de la boucle FOR 6
ychap=[ychap yc];
%calcul taux de classement
%debut boucle FOR 7
for i=1:m1
%debut boucle FOR 8
for j=1:a
%debut IF 4
if (ychap<0.5)
bc=bc+1;
elsenc=nc+1;
end;%fin IF 4
end;%fin boucle FOR 8
end;%fin boucle FOR 8
71
taux=bc/nc;
[L]=projection(TT);
L=diag(L);
matrice chapeau=[matrice chapeau L]; %matrice des leviers
end%fin du IF 1
%%%%%%%%%%%%%%%%%calcul des matrices de residus%%%%%%%%%%%%%%%%%%%%%%
E=E−t*p';%etape 2.5
F=F−t*c';%etape 2.8
end%fin de la boucle FOR 1
%Fin du programme
72
Annexe G
Programme PLS2 sans selection de
variables avec donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Algorithme PLS2 DM%
%L'algorithme utilise est celui du livre de M. Tenenhaus (page 28)
% Cet algorithme effectue une regression PLS2 dans le cas ou il y a
% des donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[TT,PP,UU,WW,WWS,CC,BETA,ychap,matrice chapeau,taux]=PLS2 DM(a,X,Y,vmiss,itnip)
% N : Nombre d'individus
% M : Nombre de variables independantes Xj
%%parametres d'entree%%
% E0 : matrice des variables Xj centrees−reduites% F0 : matrice des variables Yk centrees−reduites% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% a : rang de la matrice X
% seuil : utilse pour la boucle while
% u unitial : valeur de u au debut de la boucle
%%parametres de sortie%%
% TT : composantes PLS
% PP : coefficient de regression de E0 sur tl
% CC : coefficient de regression de F0 sur tl
% WW : vecteurs propres
% WWS : calcul des w tilde
% UU : composante PLS
% BETA : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
% ychap : prediction des y avec j composantes PLS
% matrice chapeau : matrice inverse(TT TT'% TT)*TT'
%initialisation
N=size(X,1);
M=size(X,2);
73
P=size(Y,2);
m1=size(Y,1);
m2=size(Y,2);
yc=zeros(m1,m2);
bc=0;
nc=0;
% debut de la boucle principale en A, on fait varier h qui est le nombre de
%composantes
for h=1:a
if h==1
uh=Y(:,1);
UU=uh;
wh=X(1,:)';
ch=Y(1,:)';
th=X(:,1);
ph=X(1,:)';
elseuh=Y(:,1);
th=X(:,1);
end
%debut de l'etape d'iteration
for iter=1:itnip
%Traitement des donnees manquantes dans X
for j=1:M
whj=0;
uhj=0;
for i=1:N
%condition a ajouter lorsqu'on a des donnees manquantes
%pour calculer le w (condition (41') livre)
if (X(i,j)6=vmiss & uh(i)6=vmiss)
whj=whj+X(i,j)*uh(i);
uhj=uhj+uh(i)ˆ2;
endendwhj=whj/uhj;%nouveau w obtenu dans le cas de donnı¿½es manquantes
wh(j)=whj;
endwh=wh/sqrt(wh'*wh); %normalisation
for i=1:N
whj=0;thj=0;
for j=1:M
%condition a ajouter lorsqu'on a des donnees manquantes
%pour calculer le w (condition (41') livre)
if X(i,j)6=vmiss %condition a ajouter lorqu'on a des d
%onnees manquantes pour calculer les composantes PLS t
thj=thj+X(i,j)*wh(j);
whj=whj+wh(j)ˆ2;
endend
thj=thj/whj;
th(i)=thj;
74
end
%Traitement des donnees manquantes dans Y
for j=1:P
chj=0;thj=0;
for i=1:N
%condition a ajouter lorsqu'on a des donnees manquantes
%pour calculer le c (condition (41') livre)
if ((Y(i,j)6=vmiss) & (th(i)6=vmiss))
chj=chj+Y(i,j)*th(i);
thj=thj+th(i)ˆ2;
endend
chj=chj/thj;
ch(j)=chj;
end
for i=1:N
chj=0;uhj=0;
for j=1:P
%condition a ajouter lorqu'on a des donnees manquantes pour
%calculer les composantes u
if Y(i,j)6=vmiss
uhj=uhj+Y(i,j)*ch(j);
chj=chj+ch(j)ˆ2;
endend
%On enleve le cas ou il y aurait une division par zero
if chj==0
chj=vmiss;
uhj=vmiss;
elseuhj=uhj/chj;
enduh(i)=uhj;
endend %fin de l'iteration
%calcul des p lors de valeurs manquantes
for j=1:M
phj=0;thj=0;
for i=1:N
if ((X(i,j)6=vmiss) & (th(i)6=vmiss))
phj=phj+X(i,j)*th(i);
thj=thj+th(i)ˆ2;
endend
phj=phj/thj;
ph(j)=phj;
end
if h==1
TT=th; %composante PLS th
PP=ph; %vecteur propre
75
UU=uh;
CC=ch; %coefficient des th
WW=wh;
WWS=wh;
for k=1:m2
BETA(M*(k−1)+1:k*M,1)=WWS*(CC(k,1));end;SX=TT(:,1)*PP(:,1)';
SY=TT(:,1)*CC(:,1)';
ychap=TT*CC';
for i=1:m1
if (ychap(i)<0.5)
bc=bc+1;
elsenc=nc+1;
end;end;taux=bc/nc;
L1=diag(TT*(TT'*TT)ˆ(−1)*TT');matrice chapeau=L1; %matrice chapeau
elsematrice decompo=eye(M); %nitialisation
for k=1:(h−1)%formule de decomposition pour calculer les w tilde
matrice decompo=matrice decompo*(eye(M)−WW(:,k)*PP(:,k)');endw tilde=matrice decompo*wh; %definition des w tilde
WWS=[WWS w tilde];
TT=[TT th];%composantes PLS th
PP=[PP ph]; %vecteurs propres
UU=[UU uh];
WW=[WW wh];
CC=[CC ch];%coefficients des th
for k=1:m2
BETA(M*(k−1)+1:k*M,h)=WWS*(CC(k,:))';end;L1=diag(TT*(TT'*TT)ˆ(−1)*TT');matrice chapeau=[matrice chapeau, L1]; %matrice chapeau
SX=TT(:,h)*PP(:,h)';
SY=TT(:,h)*CC(:,h)';
m2=size(Y,2); %nombre de colonnes de F0
for k=1:m2
yc(:,k)=yc(:,k)+TT(:,h)*CC(k,h)';
endychap=[ychap yc];
%calcul taux de classement
for i=1:m1
for j=1:a
if (ychap<0.5)
bc=bc+1;
elsenc=nc+1;
end;
76
end;end;taux=bc/nc;
end
%calcul des matrices de residus avec les donnees manquantes
for i=1:N
for j=1:M
if X(i,j)6=vmiss
X(i,j)=X(i,j)−SX(i,j);end
endendfor i=1:N
for j=1:P
if Y(i,j)6=vmiss
Y(i,j)=Y(i,j)−SY(i,j);end
endend
endend%fin boucle pour la fin du programme
77
Annexe H
Programme PLS2 avec selection de
variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PLS2 selection :
%Ce programme est utilisee dans le cas de la regression PLS2 avec selection
%de variables avec la methode BQ.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[Xnew,TAB]=PLS2 selection(X,E0,F0,A,snip,uini,hlim,vmiss)
%%%%Parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% E0 : matrice des variables Xj centrees−reduites% F0 : matrice des variables Yk centrees−reduites% A : nombre de variables explicatives
% snip : utilse pour la boucle while
% uini : valeur de u au debut de la boucle
%hlim : nombre maximal de composantes
%%%%Parametres de sortie%%%%
% Xnew : X obtenu apres selection
% TAB : tableau donnant le numeros des variables, Q2cumules et le nombre de
%composantes
%Debut du programme
%initialisation:
tab1=[];
tab2=[];
tab3=[];
Xnew=[];
R=0;
%debut de boucle WHILE
while (size(E0,2)>1)
p=size(E0,2);
%Creation du modele PLS1 a p variables:
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV]=PLS2 sans DM(A,E0,F0,snip,uini);
%Test de validation croisee:
%[Q2cum,H]=validation croisee PLS2(F0,ychap,LEV,A);
78
[Ychapeau,Q2KH,Q2CKH,Q2H,Q2CH]=calcul(A,F0,CC,TT,vmiss);
%nombre de composantes significatives:
if size(Q2CKH,1)==0 %debut IF 1
Amax=1;
else %fin IF 1
if size(Q2CKH,1)>hlim %debut IF 2
Amax=hlim;
else %alternative
Amax=size(Q2CKH,1);
end; %fin IF 2
end;[VIP]=Variable Importance Projection(E0,F0,WW,TT,Amax);
vip=VIP(Amax,:);
vip=vip(1:p)';
[i,Var]=min(abs(vip));
Var
%On retient le numero de la variable:
tab1=[tab1;Var];
tab2=[tab2;Q2CKH(Amax)];
tab3=[tab3;Amax];
% On enleve la variable correspondant au minimum des beta
E0=[E0(:,1:(Var−1)) E0(:,(Var+1):(size(E0,2)))];
Xnew=[Xnew X(:,Var)];
end
%Fin de la boucle WHILE
[newtab]=tabmod(tab1);
%On recupere la variable restante:
Ord=sort(newtab);
for i=1:size(Ord,1) %debut boucle FOR 1
if Ord(1)6=1 %debut IF 3
R=1;
else %alternative
if Ord(i)6=i %debut IF 4
R=i;
end %fin IF 4
end %fin IF 3
end %fin FOR 1
newtab=[0;newtab;R];
tab2=[tab2;0;0];
tab3=[tab3;0;0];
TAB=[newtab tab2 tab3];
Xnew=[Xnew X(:,R)];
newtab=[0;newtab;R];
disp('Numeros des variables enlevees')
disp(tab1)
disp('*********************************************************')
disp('Numeros des variables conservees correspondants au tableau initial')
disp(TAB(:,1))
%sauvegarde des Q2cum dans le fichier Q2cum.mat
TAB1=TAB(:,2);
savefile = 'Q2cum.mat';
79
save(savefile,'TAB1','−ascii','−double','−tabs');
%representation graphique:
figure
h=plot(TAB(:,2),'−−rs');ylabel('Qˆ2 {cum}','FontSize',10)xlabel('nombre de variables enlevees','FontSize',10)
title('Representation graphique du nombre du Qˆ2 {cum} en fonction du
nombre du variables supprimees','FontSize',10)
saveas(h,'courbe.jpg')
hold off
grid on
%%%%%cas des donnees manquantes%%%%
Le programme est identique au precedent mis a part le fait que l'on effectue
une regression PLS2 avec donnees manquantes.
80
Annexe I
Programmes calculant les equations
de regression
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme qui calcule les equations de regression PLS pour les variables
%en echelles naturelles a la derniere etape h dans le cas de PLS1 sans
%donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[betan]=eq PLS1 sans DM(h,beta,X,Y,betan)
%%%%%%%%%%% parametres d'entree%%%%%%%%%%%%%%%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% h : nombres maximales de composantes
% beta : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
%%%%%%%%%%%%parametre de sortie%%%%%%%%%%%%%%%%%%%%%%%%%
%betan : coefficients des equations de regression
%debut du programme
%initialisation
M=size(X,2);
beta0=zeros(1,h);
%calcul de la moyenne
moyX=mean(X);
moyY=mean(Y);
%calcul ecart−typestdX=std(X);
stdY=std(Y);
%debut de la boucle FOR 1
for u=1:h
%debut de la boucle FOR 2
for j=1:M
betan(j,u)=beta(j,u)*(stdY(1)/stdX(j));
81
end;%fin de la boucle FOR 2
%debut de la boucle FOR 3
for j=1:M
beta0(1,u)=beta0(1,u)+(beta(j,u)*(moyX(j)/stdX(j)));
end;%fin de la boucle FOR 3
beta0(1,u)=(moyY(1)/stdY(1))−beta0(1,u);beta0(1,u)=beta0(1,u)*stdY(1);
end;%fin de la boucle FOR 1
betan=[beta0;betan];
%Fin du programme
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme qui calcule les equations de regression PLS pour les variables
%en echelles naturelles a la derniere etape h dans le cas de PLS 1 avec
%donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[betan]=eq PLS1 DM(h,beta,X,Y,betan)
%%%%parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% h : nombre maximale de composantes
% beta : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
%%%%parametres de sortie%%%%
%betan : coefficients des equations de regression
%debut du programme
%initialisation
N=size(X,1);
M=size(X,2);
P=size(Y,2);
vmiss=999999;
beta0=zeros(1,h);
%calcul des moyennes lorsqu'il y a des donnees manquantes
moyX=moyenne(N,M,X,vmiss);
moyY=moyenne(N,P,Y,vmiss);
%calcul des ecarts−type lorsqu'il y a des donnees manquantes
[stdX,ssx]=ecart type(N,M,X,moyX,vmiss);
[stdY,ssY]=ecart type(N,P,Y,moyY,vmiss);
%debut de la boucle FOR 1
for u=1:h
%debut de la boucle FOR 2
for j=1:M
betan(j,u)=beta(j,u)*(stdY(1)/stdX(j));
end;
82
%fin de la boucle FOR 2
%debut de la boucle FOR 3
for j=1:M
beta0(1,u)=beta0(1,u)+(beta(j,u)*(moyX(j)/stdX(j)));
end;%fin de la boucle FOR 3
beta0(1,u)=(moyY(1)/stdY(1))−beta0(1,u);beta0(1,u)=beta0(1,u)*stdY(1);
end;%fin de la boucle FOR 1
%calcul des coefficients de regression
betan=[beta0;betan];
%Fin du programme
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme qui calcule les equations de regression PLS pour les variables en
%echelles naturelles a la derniere etape h dans le cas de PLS2 sans
%donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[betan]=eq PLS2 sans DM(h,beta,X,Y)
%%%%%%%%%%% parametres d'entree%%%%%%%%%%%%%%%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% h : nombres maximales de composantes
% beta : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
%%%%%%%%%%%%parametres de sortie%%%%%%%%%%%%%%%%%%%%%%%%%
%betan : coefficients des equations de regression
%debut du programme
%initialisation
betan=beta;
M=size(X,2);
P=size(Y,2);
beta0n=zeros(P,h);
beta0=zeros(P,h);
coef=zeros(M,h);
coefn=zeros(M,h);
moyX=mean(X);
moyY=mean(Y);
stdX=std(X);
stdY=std(Y);
%debut de la boucle FOR 1
for k=1:P
coef=betan(M*(k−1)+1:k*M,:);for u=1:h
%debut de la boucle FOR 2
for j=1:M
83
coefn(j,u)=coef(j,u)*(stdY(k)/stdX(j));
end;%fin de la boucle FOR 2
%debut de la boucle FOR 3
for j=1:M
beta0(k,u)=beta0(k,u)+(coef(j,u)*(moyX(j)/stdX(j)));
end;%fin de la boucle FOR 3
beta0(k,u)=(moyY(k)/stdY(k))−beta0(k,u);beta0(k,u)=beta0(k,u)*stdY(k);
beta0n(k,u)=beta0(k,u);
betan(M*(k−1)+1:k*M,u)=coefn(:,u);end;end;%fin de la boucle FOR 1
betan=[beta0;betan];
%Fin du programme
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme qui calcule les equations de regression PLS pour les variables en
%echelles naturelles a la derniere etape h dans le cas de PLS2 avec
%donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[betan]=eq PLS2 DM(h,beta,X,Y)
%%%% parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes.
% h : nombres maximales de composantes
% beta : vecteur des coefficients de regression de la regression multiple
% de y sur X (=inverse(X'X)X'y)
%%%%parametres de sortie%%%%
%betan : coefficients des equations de regression
%debut du programme
%initialisation
betan=beta;
N=size(X,1);
M=size(X,2);
P=size(Y,2);
vmiss=999999;
beta0n=zeros(P,h);
beta0=zeros(P,h);
coef=zeros(M,h);
coefn=zeros(M,h);
moyX=moyenne(N,M,X,vmiss);
moyY=moyenne(N,P,Y,vmiss);
[stdX,ssx]=ecart type(N,M,X,moyX,vmiss);
[stdY,ssY]=ecart type(N,P,Y,moyY,vmiss);
%debut de la boucle FOR 1
for k=1:P
coef=betan(M*(k−1)+1:k*M,:);for u=1:h
84
%debut de la boucle FOR 2
for j=1:M
coefn(j,u)=coef(j,u)*(stdY(k)/stdX(j));
end;%fin de la boucle FOR 2
%debut de la boucle FOR 3
for j=1:M
beta0(k,u)=beta0(k,u)+(coef(j,u)*(moyX(j)/stdX(j)));
end;%fin de la boucle FOR 3
beta0(k,u)=(moyY(k)/stdY(k))−beta0(k,u);beta0(k,u)=beta0(k,u)*stdY(k);
beta0n(k,u)=beta0(k,u);
betan(M*(k−1)+1:k*M,u)=coefn(:,u);end;end;%fin de la boucle FOR 1
betan=[beta0;betan];
%Fin du programme
85
Annexe J
Programmes permettant la
restitution des donnees et la
prediction sur un jeu-test eventuel
selon les differentes regressions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme permettant la restitution des donnees et la prediction sur un
%jeu−test eventuel sans donnees manquantes dans le cas de la regression PLS1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ylc,rmse]=res pred jeu(X,Y,betan,hlim)
%%%%Parametres d'entree%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% betan : coefficients de regression
% hlim : nombre de composantes
%%%%Parametres de sortie%%%%
% ylc : y avec les nouveaux coefficients
% rmse : "Residual Mean square Error"
%Debut du programme
%initialisation
N=size(X,1);
m2=size(X,2);
s1=size(Y,1);
beta0=betan(1,:);
betan=betan(2:m2+1,:);
ylc=zeros(N,hlim);
rmse=zeros(1,hlim);
%Calcul des ylc
%Debut de la boucle FOR 1
86
for h=1:hlim
%Debut de la boucle FOR 2
for i=1:N
%Debut de la boucle FOR 3
for j=1:m2
ylc(i,h)=ylc(i,h)+betan(j,h)*X(i,j);
end;%Fin de la boucle FOR 3
ylc(i,h)=ylc(i,h)+beta0(1,h);
end;%Fin de la boucle FOR 2
end;%Fin de la boucle FOR 1
%coefficients de regression
betan=[beta0;betan];
%calcul des rmse
%Debut de la boucle FOR 4
for h=1:hlim
%Debut de la boucle FOR 5
for i=1:N
rmse(1,h)=rmse(1,h)+(1/N)*((ylc(i,h)−Y(i))ˆ2);end;%fin de la boucle FOR 5
end;%Fin de la boucle FOR 4
%Debut de la boucle FOR 5
for h=1:hlim
rmse(h)=sqrt(rmse(h));
end;%Fin de la boucle FOR 5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme permettant la restitution des donnees et la prediction sur un
%jeu−test eventuel avec donnees manquantes dans le cas de la regression PLS1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ylc,rmse]=res pred jeu DM(X,Y,betan,hlim,vmiss)
%%%%Parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% betan : coefficients de regression
% hlim : nombre de composantes
%%%%Parametres de sortie%%%%
% ylc : y avec les nouveaux coefficients
% rmse : "Residual Mean square Error"
%Debut du programme
%initialisation
N=size(X,1);
87
m2=size(X,2);
s1=size(Y,1);
beta0=betan(1,:);
betan=betan(2:m2+1,:);
ylc=zeros(N,hlim);
rmse=zeros(1,hlim);
%Debut de la boucle FOR 1
for h=1:hlim
%Debut de la boucle FOR 2
for i=1:N
%Debut de la boucle FOR 3
for j=1:m2
if X(i,j)6=vmiss
ylc(i,h)=ylc(i,h)+betan(j,h)*X(i,j);
end;end;%Fin de la boucle FOR 3
ylc(i,h)=ylc(i,h)+beta0(1,h);
end;%Fin de la boucle FOR 2
end;%Fin de la boucle FOR 1
betan=[beta0;betan];
%Debut de la boucle FOR 4
for h=1:hlim
%Debut de la boucle FOR 5
for i=1:N
if Y(i)6=vmiss
rmse(1,h)=rmse(1,h)+(1/N)*(ylc(i,h)−Y(i))ˆ2;end;
end;%fin de la boucle FOR 5
end;%Fin de la boucle FOR 4
%Debut de la boucle FOR 5
for h=1:hlim
rmse(h)=sqrt(rmse(h));
end;%Fin de la boucle FOR 5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme permettant la restitution des donnees et la prediction sur un
%jeu−test eventuel dans le cas d'une regression PLS2 sans donnees manquantes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ylc,rmse]=res pred jeu PLS2(X,Y,betan,hlim)
%%%%Parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes.
% betan : coefficients de regression
88
% hlim : nombre de composantes
%%%%Parametres de sortie%%%
% ylctot : y avec les nouveaux coefficients
% rmse : "Residual Mean square Error"
%Debut du programme
%initialisation
N=size(X,1);
m2=size(X,2);
s1=size(Y,1);
s2=size(Y,2);
beta0=betan(1:s2,:);
betan=betan(s2+1:size(betan,1),:);
ylc=zeros(N,hlim);
rmse=zeros(s2,hlim);
mse=zeros(s2,hlim);
ny=N*ones(s2,1);
%calcul des coefficients de regression
for k=1:s2
coef=betan(m2*(k−1)+1:k*m2,:);%Debut de la boucle FOR 1
for h=1:hlim
%Debut de la boucle FOR 2
for i=1:N
%Debut de la boucle FOR 3
for j=1:m2
ylc(i,h)=ylc(i,h)+coef(j,h)*X(i,j);
end;%Fin de la boucle FOR 3
ylc(i,h)=ylc(i,h)+beta0(k,h);
end;%Fin de la boucle FOR 2
end;%Fin de la boucle FOR 1
if k==1
ylctot=ylc;
elseylctot=[ylctot;ylc];
end;end;
betan=[beta0;betan];
%Calcul du rmse
for k=1:s2
ylc=ylctot((k−1)*N+1:k*N,:);%Debut de la boucle FOR 4
for h=1:hlim
%Debut de la boucle FOR 5
for i=1:N
rmse(k,h)=rmse(k,h)+(1/ny(k))*(ylc(i,h)−Y(i,k))ˆ2;end;%fin de la boucle FOR 5
89
end;%Fin de la boucle FOR 4
end;for k=1:s2
%Debut de la boucle FOR 5
for h=1:hlim
rmse(k,h)=sqrt(rmse(k,h));
end;%Fin de la boucle FOR 5
end;ylc=ylctot;
%fin du programme
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Programme permettant la restitution des donnees et la prediction sur un
%jeu−test eventuel avec donnees manquantes dans le cas de la regression PLS2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ylctot,rmse]=res pred jeu PLS2 DM(X,Y,betan,hlim,vmiss)
%%%%Parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes.
% betan : coefficients de regression
% hlim : nombre de composantes
%vmiss : valeur manquante
%%%%Parametres de sortie%%%
% ylctot : y avec les nouveaux coefficients
% rmse : "Residual Mean square Error"
%Debut du programme
%initialisation
N=size(X,1);
m2=size(X,2);
s1=size(Y,1);
s2=size(Y,2);
beta0=betan(1:s2,:);
betan=betan(s2+1:size(betan,1),:);
ylc=zeros(N,hlim);
rmse=zeros(s2,hlim);
ny=ones(s2,1);
for k=1:s2
coef=betan(m2*(k−1)+1:k*m2,:);%Debut de la boucle FOR 1
for h=1:hlim
%Debut de la boucle FOR 2
for i=1:N
%Debut de la boucle FOR 3
for j=1:m2
if X(i,j)6=vmiss
ylc(i,h)=ylc(i,h)+coef(j,h)*X(i,j);
90
end;end;%Fin de la boucle FOR 3
ylc(i,h)=ylc(i,h)+beta0(k,h);
end;%Fin de la boucle FOR 2
end;%Fin de la boucle FOR 1
if k==1
ylctot=ylc;
elseylctot=[ylctot;ylc];
end;end;
betan=[beta0;betan];
for k=1:s2
ylc=ylctot((k−1)*N+1:k*N,:);
%Debut de la boucle FOR 4
for h=1:hlim
%Debut de la boucle FOR 5
for i=1:N
if Y(i,k)6=vmiss
rmse(k,h)=rmse(k,h)+(1/ny(k))*(ylc(i,h)−Y(i,k))ˆ2;end;
end;%fin de la boucle FOR 5
end;%Fin de la boucle FOR 4
end;
for k=1:s2
%Debut de la boucle FOR 5
for h=1:hlim
rmse(k,h)=sqrt(rmse(k,h));
end;%Fin de la boucle FOR 5
end;ylc=ylctot;
%%%%Programme de selection aleatoire des observations dans un tableau N*P
%%%%pour constituer un jeu−test%%%%%
function [nal,seldef,nlearn,ntest,xtest,ytest]=tirage aleatoire(X,Y,taux)
%%%%Parametres d'entree%%%%
% X : variables explicatives
% Y : variables reponses
%%%%Parametres de sortie%%%
% nlearn : nombre de lignes de X
% ntest : nombre d'observations du jeu−test% xtest : variables explicatives du jeu−test
91
% ytest : variables reponses du jeu−test
%%%%%%%%%%%%%%%%%%%%%%%%Debut du programme%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%initialisation des parametres
N=size(X,1); %nombre d'individus
M=size(X,2); %nombre de variables explicatives
P=size(Y,2);%nombre de variables reponses
nal=floor(N*taux);
xlearn=zeros(N−nal,M);ylearn=zeros(N−nal,P);xtest=zeros(nal,M); %X issus du jeu−testytest=zeros(nal,P); %Y issus du jeu−testnalsel=zeros(nal,1);
seldef=zeros(nal,1);
lk=0;
flag=0;
RandStream.setDefaultStream(RandStream('mt19937ar','seed',sum(100*clock)));
%debut boucle FOR 1
for u=1:nal
u2 = rand(1,2*nal);
nalsel(u)=u2(u);
nalsel(u)=1+(N−1)*nalsel(u);nalsel=floor(nalsel);
%debut IF 1
if (u==1)
seldef(u)=nalsel(u);
else %alternative
flag=0;
for k=1:(u−1) %debut FOR 2
%debut IF 2
if (nalsel(u)==seldef(k))
flag=1;
end;%fin IF 2
end;%fin FOR 2
end;%fin IF 1
if (flag==1)
nalsel(u)=u2(u);
nalsel(u)=1+(N−1)*nalsel(u);nalsel=floor(nalsel);
%debut IF 1
if (u==1)
seldef(u)=nalsel(u);
else %alternative
flag=0;
for k=1:(u−1) %debut FOR 2
%debut IF 2
if (nalsel(u)==seldef(k))
flag=1;
end;%fin IF 2
end;
92
%fin FOR 2
end;%fin IF 1
end;seldef(u)=nalsel(u);
end;
for k=1:nal %debut de la boucle FOR 3
xtest(k,:)=X(seldef(k),:);
ytest(k,:)=Y(seldef(k),:);
end; %fin de la boucle FOR 3
ll=0;
for i=1:N %debut boucle FOR 4
flag=0;
for k=1:nal %debut boucle FOR 5
if (seldef(k)==i) %debut IF 3
flag=1;
end; %fin IF 3
end; %fin de la boucle FOR 5
if flag==0 %debut IF 4
ll=ll+1;
xlearn(ll,:)=X(i,:);
ylearn(ll,:)=Y(i,:);
end; %fin IF 4
end;%fin de la boucle FOR 4
nlearn=size(xlearn,1);
ntest=size(xtest,1);
%%%%%%%%%%%%%%%%%%%%%%%%%Fin du programme%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93
Annexe K
Programmes permettant de calculer
le VIP et le pouvoir d’explication
pour chaque composante
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Variable importance=algorithme pour le calcul VIP (Variable Importance in
%the Projection) qui mesure la contribution de la variable x j dans la
% construction de Y a travers les t h
%Les variables ayant un VIP superieur a 1 sont les plus importantes dans la
%construction
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[VIP]=Variable Importance Projection(X,Y,WW,TT,a)
%%Parametres d'entree%%
% X : matrice des donnees pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes
% WW : vecteurs propres
% TT : composantes PLS
% a : rang de la matrice X
%%Parametre de sortie%%
% VIP : Cacul du VIP
M=size(X,2);
P=size(Y,2);
%On commence par calculer le tableaux des redondances:
%On se reportera au livre page 10
%Debut du programme
%%Calcul de la redondance (Y;th) que l'on note RD1%%
RD1=zeros(a,2); %initialisation
%debut de la boucle FOR 1%
for h=1:a
RD1(h,1)=h;
94
%debut de la boucle FOR 2
for k=1:P
RD1(h,2)=RD1(h,2)+(1/P)*corr(Y(:,k),TT(:,h))ˆ2;
end%fin de la boucle FOR 2
end%fin de la boucle FOR 1
%%Calcul de la redondance (Y;t1,...,th) que l'on note RD2%%
RD2=zeros(a,2); %initialisation
%debut de la boucle FOR 1
for h=1:a
RD2(h,1)=h;
rd=zeros(h,1);
%debut de la boucle FOR 2
for l=1:h
%debut de la boucle FOR 3
for k=1:P
rd(l)=rd(l)+(1/P)*corr(Y(:,k),TT(:,l))ˆ2;
end%fin de la boucle FOR 3
end%fin de la boucle FOR 2
RD2(h,2)=sum(rd);
end%fin de la boucle FOR 1
%%Calcul des VIP%%
VIP=zeros(a,P+1);%initalisation
%debut de la boucle FOR 1
for h=1:a
S=0;
%debut de la boucle FOR 2
for j=1:M
R=zeros(h,1);
%debut de la boucle FOR 3
for l=1:h
R(l)=RD1(l,2)*WW(j,l)ˆ2;
end%fin de boucle FOR 3
den=sum(R);
VIP(h,j)=sqrt(M*den/RD2(h,2));
S=S+VIP(h,j)ˆ2;
end%fin de la boucle FOR 2
VIP(h,P+1)=S;
end%fin de la boucle FOR 1
%fin du programme
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%explication est une fonction qui permet d'obtenir les taux de description
95
%de E0 et d'explication de F0 pour chaque composante.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[explication]=calcul taux explication(a,TT,PP,CC)
%%%%Parametres d'entree%%%%
% a : rang de la matrice X
% TT : composantes PLS
% PP : coefficient de regression de E0 sur tl
% CC : coefficient de regression de F0 sur tl
%%%%Parametres de sortie%%%%
% On obtient un tableau a 4 colonnes :
% − la premiere colonne est le pouvoir de chaque t h pour resumer E0
% − la deuxieme colonne est le pouvoir des h premiers t h pour resumer E0
% − la troisieme colonne est le pouvoir de chaque t h pour resumer F0
% − la quatrieme colonne est le pouvoir des h premiers t h pour resumer F0
%Debut du programme
%%Calcul des normes au carre de E0 et de F0%%
%initialisation
Norme carre E0=0;
Norme carre F0=0;
%debut de la boucle FOR 1
for h=1:a
Norme carre E0=Norme carre E0+norm(TT(:,h))ˆ2*norm(PP(:,h))ˆ2;
Norme carre F0=Norme carre F0+norm(TT(:,h))ˆ2*norm(CC(h))ˆ2;
end;%fin de la boucle FOR 1
%%Calcul des pouvoirs d'explication de E0 et F0%%
%initialisation du tableau
explication=zeros(a,4);
%debut de la boucle FOR 2
for h=1:a
%Calcul du taux d'explication de E0
explication(h,1)=(norm(TT(:,h))ˆ2*norm(PP(:,h))ˆ2)/Norme carre E0;
%Debut de la boucle FOR 3
for l=1:h
explication(h,2)=explication(h,2)+
(norm(TT(:,l))ˆ2*norm(PP(:,l))ˆ2)/Norme carre E0;
end%Fin de la boucle FOR 3
%Calcul du taux d'explication de F0
explication(h,3)=(norm(TT(:,h))ˆ2*norm(CC(h))ˆ2)/Norme carre F0;
%Debut de la boucle FOR 4
for l=1:h
explication(h,4)=explication(h,4)+
(norm(TT(:,l))ˆ2*norm(CC(l))ˆ2)/Norme carre F0;
end%Fin de la boucle FOR 4
end%fin de la boucle FOR 2
96
Annexe L
Programmes permettant le calcul
d’intervalles de confiance selon
differentes techniques
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ce programme calcule les intervalles de confiance sur les coefficients de
%regression par la methode jacknife sans donnees manquantes dans le
%cadre de la regression PLS1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[intervalle]=JACK(n,p,q,Don,composantes,vmiss,snip,conf)
%%Parametres d'entree%%
%n : nombre d'observations
%p : nombre de variables explicatives
%q : nombre de variables reponses
%Don : tableau des donnees de depart brutes
%vmiss : donnees manquantes
%snip : utilise dans la boucle WHILE
%%Parametres de sortie%%
%intervalle : intervalles de confiance
%initialisation
uini1=zeros(n−1,1);Don1=zeros(n−1,p+q);n1=size(Don1,1);
BETA1=zeros(n,p+q);
Sh=zeros(p,1);
J=zeros(n−1,n);
%constitution des echantillons avec une ligne en moins
for i=1:1:n
J(:,i)=find([1:1:n]'6=i);
end;for j=1:n
for i=1:n−1
98
Don1(i,:)=Don(J(i,j),:);
end;
Y1=Don1(:,end);X1=Don1(:,1:(end−1));p1=size(X1,2);
q1=size(Y1,2);
moyX1=mean(X1);
moyY1=mean(Y1);
stdX1=std(X1);
stdY1=std(Y1);
[Xc1]=centrage(n1,p1,vmiss,X1,moyX1);
[E01]=reduction(n1,p1,Xc1,stdX1,vmiss);
[Yc1]=centrage(n1,q1,vmiss,Y1,moyY1);
[F01]=reduction(n1,q1,Yc1,stdY1,vmiss);
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV,taux]=
PLS1 sans DM(composantes,E01,F01,snip,uini1);
%coefficients de regression pour chaque echantillon
BETA1=BETA(:,composantes);
BETA2(:,j)=BETA1;
end;
%moyenne de chaque coefficient de regression
moyenne BETA=mean(BETA2');
for i=1:p
for j=1:n
S(i,j)=(BETA2(i,j)−moyenne BETA(i)')ˆ2;
end;Sh(i,1)=sum(S(i,:));
end;
%erreur−standardSD=sqrt(((n−1)/n)*Sh);borne inf=moyenne BETA'−tq((conf/100),n−1)*SD;borne sup=moyenne BETA'+tq((conf/100),n−1)*SD;%intervalle de confiance
intervalle=[borne inf borne sup];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ce programme calcule les intervalles de confiance sur les coefficients de
%regression par la methode jacknife sans donnees manquantes dans le
%cadre de la regression PLS2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[intervalles]=JACK PLS2(n,p,q,Don,composantes,vmiss,snip,tailleY,conf)
%%Parametres d'entree%%
%n : nombre d'observations
%p : nombre de variables explicatives
%q : nombre de variables reponses
%Don : tableau des donnees de depart brutes
%vmiss : donnees manquantes
%snip : utilise dans la boucle WHILE
%%Parametres de sortie%%
%intervalle : intervalles de confiance
99
%initialisation
uini1=zeros(n−1,1);Don1=zeros(n−1,p+q);n1=size(Don1,1);
Sh=zeros(q,1);
J=zeros(n−1,n);S=zeros(q,n1);
num=0;
%constitution des echantillons avec une ligne en moins
for i=1:1:n
J(:,i)=find([1:1:n]'6=i);
end;for j=1:n
for i=1:n−1Don1(i,:)=Don(J(i,j),:);
end;
Y1=Don1(:,end−(tailleY−1):end);%variables explicatives
X1=Don1(:,1:(end−tailleY)); %variables reponses
p1=size(X1,2);
q1=size(Y1,2);
moyX1=mean(X1);
moyY1=mean(Y1);
stdX1=std(X1);
stdY1=std(Y1);
[Xc1]=centrage(n1,p1,vmiss,X1,moyX1);
[E01]=reduction(n1,p1,Xc1,stdX1,vmiss);
[Yc1]=centrage(n1,q1,vmiss,Y1,moyY1);
[F01]=reduction(n1,q1,Yc1,stdY1,vmiss);
[TT,PP,UU,WW,WWS,CC,BETA,ychap,LEV,taux]=
PLS2 sans DM(composantes,E01,F01,snip,uini1);
%coefficients de regression pour chaque echantillon
BETA1=BETA(:,composantes);
BETA4(:,j)=BETA1;
end;
%moyenne de chaque coefficient de regression
for k=1:q
beta=BETA4(((k−1)*q+1):(q*k),:);moyenne BETA=mean(beta');
for i=1:(q)
for j=1:n
S(i,j)=(beta(i,j)−moyenne BETA(i)')ˆ2;
end;Sh(i,1)=sum(S(i,:));
end;%erreur−standard
SD=sqrt(((n−1)/n)*Sh);borne inf=moyenne BETA'−tq((conf/100),n−1)*SD;borne sup=moyenne BETA'+tq((conf/100),n−1)*SD;
%intervalle de confiance
num=k;
100
disp('pour la variable reponse : ')
disp(num)
intervalles=[borne inf borne sup];
disp(intervalles)
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ce programme calcule les intervalles de confiance sur les coefficients de
%regression par la methode bootstrap sans donnees manquantes dans le
%cadre de la regression PLS1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[intervalle]=bootstrap(L,Don,composantes,vmiss,snip,uini,conf)
%%Parametres d'entree%%
%L : nombre de boucles bootstrap
%n : nombre d'observations
%p : nombre de variables explicatives
%q : nombre de variables reponses
%Don : tableau des donnees de depart brutes
%vmiss : donnees manquantes
%snip : utilise dans la boucle WHILE
%uini : valeur de u au debut de la boucle
%%Parametres de sortie%%
%intervalle : intervalles de confiance
%initialisation
s1=size(Don);
s=size(Don(1,:));
N=size(Don,1);
P=size(Don,2);
Sh=zeros(P−1,1);BETA2=zeros(P−1,L);B=zeros(s1(1),1);
%tirage aleatoire L fois avec remise des lignes des donnees brutes
K=randi(s1(1), s1(1),L);
for j=1:L
for i=1:N
%creation de L echantillons
Don2(i,:)=Don(K(i,j),:);
end;%exclusion des cas ne permettant pas d'obtenir un intervalle de
%confiance. Les echantillons ecartes sont remplaces par la matrice de
%depart
%seulement dans le cas des donnees Cornell
if (Don2(:,1)==B(:,1)) | (Don2(:,3)==B(:,1)) | (Don2(:,2)==B(:,1)) |(Don2(:,4)==B(:,1)) | (Don2(:,5)==B(:,1)) | (Don2(:,6)==B(:,1))
Don2=Don;
end;Y1=Don2(:,end);X1=Don2(:,1:(end−1));n=size(Don2,1);
uini1=zeros(n,1);
p1=size(X1,2);
101
q1=size(Y1,2);
moyX1=mean(X1);
moyY1=mean(Y1);
stdX1=std(X1);
stdY1=std(Y1);
[Xc1]=centrage(n,p1,vmiss,X1,moyX1);
[E01]=reduction(n,p1,Xc1,stdX1,vmiss);
[Yc1]=centrage(n,q1,vmiss,Y1,moyY1);
[F01]=reduction(n,q1,Yc1,stdY1,vmiss);
[TT,PP,UU,WW,WWS,CC,BETA,ychap,matrice chapeau,taux]=
PLS1 sans DM(composantes,E01,F01,snip,uini1);
%coefficients de regression pour chaque echantillon
BETA1=BETA(:,composantes);
BETA2(:,j)=BETA1;
end;
%moyenne de chaque coefficient de regression
moyenne BETA=mean(BETA2');
for i=1:(P−1)for j=1:L
S(i,j)=(BETA2(i,j)−moyenne BETA(i)')ˆ2;
end;Sh(i,1)=sum(S(i,:));
end;
%erreur standard
SD=sqrt((1/(L−1))*Sh);borne inf=moyenne BETA'−tq((conf/100),n−1)*SD;borne sup=moyenne BETA'+tq((conf/100),n−1)*SD;
%intervalle de confiance
intervalle=[borne inf borne sup];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ce programme calcule les intervalles de confiance sur les coefficients de
%regression par la methode bootstrap sans donnees manquantes dans le
%cadre de la regression PLS2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[intervalles]=bootstrap PLS2(p,q,L,Don,composantes,vmiss,snip,uini,tailleY,conf)
%%Parametres d'entree%%
%L : nombre de boucles bootstrap
%n : nombre d'observations
%p : nombre de variables explicatives
%q : nombre de variables reponses
%Don : tableau des donnees de depart brutes
%vmiss : donnees manquantes
%snip : utilise dans la boucle WHILE
%uini : valeur de u au debut de la boucle
%tailleY : nombre de variables reponses
%%Parametres de sortie%%
%intervalle : intervalles de confiance
102
%initialisation
s1=size(Don);
s=size(Don(1,:));
N=size(Don,1);
P=size(Don,2);
Sh=zeros(q,1);
Don2=zeros(N,P);
num=0;
%tirage aleatoire L fois avec remise des lignes des donnees brutes
K=randi(s1(1), s1(1),L);
for j=1:L
for i=1:N
%creation de L echantillons
Don2(i,:)=Don(K(i,j),:);
end;
Y1=Don2(:,end−(tailleY−1):end);%variables explicatives
X1=Don2(:,1:(end−tailleY)); %variables reponses
n=size(Don2,1);
p1=size(X1,2);
q1=size(Y1,2);
moyX1=mean(X1);
moyY1=mean(Y1);
stdX1=std(X1);
stdY1=std(Y1);
[Xc1]=centrage(n,p1,vmiss,X1,moyX1);
[E01]=reduction(n,p1,Xc1,stdX1,vmiss);
[Yc1]=centrage(n,q1,vmiss,Y1,moyY1);
[F01]=reduction(n,q1,Yc1,stdY1,vmiss);
[TT,PP,UU,WW,WWS,CC,BETA,ychap,matrice chapeau,taux]=
PLS2 sans DM(composantes,E01,F01,snip,uini);
%coefficients de regression pour chaque echantillon
BETA1=BETA(:,composantes);
BETA2(:,j)=BETA1;
end;
%moyenne de chaque coefficient de regression
for k=1:q
beta2=BETA2(((k−1)*q+1):(q*k),:);moyenne BETA=mean(beta2');
for i=1:(q)
for j=1:L
S(i,j)=(beta2(i,j)−moyenne BETA(i)')ˆ2;
end;Sh(i,1)=sum(S(i,:));
end;
%erreur standard
SD=sqrt((1/(L−1))*Sh);borne inf=moyenne BETA'−tq((conf/100),N−1)*SD;borne sup=moyenne BETA'+tq((conf/100),N−1)*SD;
103
%intervalle de confiance
num=k;
disp('pour la variable reponse : ')
disp(num)
intervalles=[borne inf borne sup];
disp(intervalles)
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ce programme calcule les intervalles de confiance sur les coefficients de
%regression par la methode approximation sans donnees manquantes dans le
%cadre de la regression PLS1 (voir page 116 livre de M. Tenenhaus)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[intervalle]=approximation PLS1(n,p,X,Y,composantes,ylc,BETA)
%%Parametres d'entree%%
%n : nombre d'observations
%p : nombre de variables explicatives
%X : variables explicatives
%Y : variables reponses
%composantes : nombre de composantes
%ylc: prediction des Y
%BETA : coefficients de regression
%%Parametres de sortie%%
%intervalle : intervalles de confiance sur la derniere composante
%initialisation
Sh=zeros(p,composantes);
for j=1:composantes
Sh(:,j)=((X'*X)ˆ(j−1))*(X'*Y);e(:,j)=ylc(:,j)−Y;
end;
for j=1:composantes
for i=1:n
s(i,j)=(e(i,j)ˆ2);
end;end;s=((sum(s))')/(n−composantes);v=s(3)*Sh*inv(Sh'*X'*X*Sh)*Sh';
var BETA=diag(v);
inf=BETA(:,3)−1.96*sqrt(var BETA);
sup=BETA(:,3)+1.96*sqrt(var BETA);
intervalle=[inf sup];
104
Annexe M
Programmes permettant de choisir
le nombre de composantes
significatives
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Validation croisee PLS1=sous−programme qui permet de voir quelles sont les
%composantes PLS qui sont significatives(regle du Q2).
% N : Nombre d'individus
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[Q2cum,H,nb]=validation croisee PLS1(Y,ychap,matrice chapeau,a)
%%parametres d'entree%%
% Y : matrice des donnees (N*P) pour les variables dependantes
% ychap : prediction des y avec j composantes PLS
% matrice chapeau : pour le calcul PRESS, correspond a la matrice inverse(TT TT'
% TT)*TT'
%a : nombre maximal de composantes
%%parametres de sortie%%
% Q2cum : mesure de l'apport global des h premieres composantes PLS
% H : tableau recapitulatif
%Debut du programme
%initialisation:
N=size(Y,1);
H=[]; %initialisation du tableau des resultats
RSS=zeros(a−1,1);%initialisation calcul RSS
PRESS=zeros(a,1);%initialisation calcul PRESS
e=zeros(N,1); %initialisation de la variables pour le calcul intermediaire
%du PRESS
Q2=zeros(a,1); %initialisation Q2
Q2cum=zeros(a,1);
Q2ch=1;
%%Calcul des RSS : somme des carres residuelle calculee avec le modele a
%h−1 composantes%%
105
%pour le calculer se reporter A l'article A.Lazraq, R.Cleroux,
%J.P.Gauchi
%debut de la boucle FOR 1
for h=1:a−1 %on fait varier le nombre de composantes
%debut de la boucle FOR 2
for i=1:N
RSS(h)=RSS(h)+(Y(i)−ychap(i,h))ˆ2; %somme des residus
end%Fin de la boucle FOR 2
end%Fin de la boucle FOR 1
RSS=[N−1;RSS]; %on calcule RRS jusqu'a a−1
%%Calcul des PRESS:Prediction Error Sum of Squares%%
% pour le calculer se reporter A l'article A.Lazraq, R.Cleroux, J.P.Gauchi
%debut de la boucle FOR 3
for h=1:a
%Debut de la boucle FOR 4
for i=1:N
e(i)=(Y(i)−ychap(i,h))/(1−matrice chapeau(i,h));
PRESS(h)=PRESS(h)+e(i)*e(i); %somme des residus PLS
end%Fin de la boucle FOR 4
%calcul du Q2
Q2(h)=1−(PRESS(h)/RSS(h)) ;%calcul du Q2
Q2ch=Q2ch*(1−Q2(h)); %calcul du Q2cumule
Q2cum(h)=1−Q2ch;%condition pour que la composante PLS soit significative
if (sqrt(PRESS(h)) ≤ 0.95*sqrt(RSS(h))) %la composante t h est
%significative si sqrt(PRESS(h)) ≤ 0.95*sqrt(RSS(h)
test(h)=1;
elsetest(h)=0;
endnb=sum(test);
G=[Q2cum(h) test(h)];
H=[H;G]; % Tableau recapitulatif
end%fin de la boucle FOR 3
%Fin du programme
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ce programme effectue la validation croisee dans le cas d'une regression
%PLS2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Q2KH,Q2H,test]=validation PLS2(a,Y,CC,TT,vmiss)
106
%%%%Parametres d'entree%%%%
% a : nombre de composantes
% Y : matrice des donnees (N*P) pour les variables dependantes
% CC : coefficient de regression de F0 sur t l
% TT : composantes PLS
%%%%Parametres de sortie%%%%
% Ychapeau : ychap concatenes
% Q2KH : indice Q2KH=1−PRESSkh/RSSk(h−1)% Q2H : indice Q2
% Q2CH : indice Q2 cumule
% Q2CH : indice Q2kh cumule
%Debut du programme
%initialisation
N=size(Y,1); % N : Nombre d'individus
P=size(Y,2); % P : Nombre de variables dependantes Y k
ychap=zeros(N,a);
gp=zeros(P,a);
gs=zeros(P,a);
H=[];
%%Calcul des ychapeau et de Ychapeau%%
%%Debut du programme pour le calcul des ychapeau et de Ychapeau%%
for k=1:P %debut de la boucle FOR 1
for h=1:a %debut de la boucle FOR 2
for i=1:N %debut de la boucle FOR 3
if h==1 %debut condition
ychap(i,h)=CC(k,h)*TT(i,h);
else %alternative
ychap(i,h)=ychap(i,h−1)+CC(k,h)*TT(i,h);end;%fin condition
end; %fin boucle FOR 3
end; %fin de la boucle FOR 2
if k==1 %debut condition
Ychapeau=ychap;
else %alternative
Ychapeau=[Ychapeau;ychap];
end;%fin condition
end; %fin de la boucle FOR 1
%%Fin du programme pour le calcul des ychapeau et de Ychapeau%%
%%Calcul des Q2%%
%%debut du programme pour calculer Q2HK%%
%debut de la boucle FOR 1
for kk=1:P
prod=1;
ychap=Ychapeau(N*(kk−1)+1:kk*N,:);%debut de la boucle FOR 2
for h=1:a
rss=0;
rpress2=0;
107
%debut de la boucle FOR 3
for i=1:N
if Y(i,kk)6=vmiss
rusuel=ychap(i,h)−Y(i,kk);hat=(TT(:,1:h))*inv(TT(:,1:h)'*TT(:,1:h))*TT(:,1:h)';
delai=1−hat(i,i);rpress=rusuel/delai;
rpress2=rpress2+rpressˆ2;
if (h>1) %debut IF 1
rss=rss+(ychap(i,h−1)−Y(i,kk))ˆ2;end; %fin IF 1
end;end;%fin de la boucle FOR 3
if (h==1) %debut IF 2
rss=N−1;end; %fin du IF2
Q2KH(kk,h)=1−(rpress2/rss);gp(k,h)=rpress2;
gs(k,h)=rss;
end;%fin de la boucle FOR 2
end;%fin de la boucle FOR 1
%%%fin du programme pour calculer Q2HK%%%%
%%Calcul des Q2CKH cumules%%
%%debut du programme pour calculer les Q2CKH%%
flag=0; %securite
for kk=1:P %debut de la boucle FOR 1
flag=0;%initialisation de la securite
for u=1:a %debut de la boucle FOR 2
if Q2KH(kk,u)≤0 %debut IF 1
flag=flag+1;
end;%fin IF 1
end; %fin de la boucle FOR 2
if flag<a %debut IF 1
prod=1;
ll=0;
lk=0;
dumy1=Q2KH(kk,:);
dumy2=zeros(1,a);
for u=1:a %debut du FOR 3
if dumy1(u)>0 %debut IF 3
ll=ll+1;
dumy2(ll)=1−dumy1(u);end; %fin du IF 3
end; %fin FOR 3
dumy2=dumy2(1,1:ll);
for u=1:a %debut FOR 4
if dumy1(u)>0 %debut IF 4
lk=lk+1;
prod=prod*dumy2(lk);
108
Q2CKH(kk,u)=1−prod;end; %fin IF 4
end; %fin FOR 4
end; %fin IF 1
end; %fin FOR 1
%%Fin du programme pour calculer les Q2CKH%%
%%Calcul des Q2H%%
for u=1:a
num(u)=sum(gp(:,u));
denom(u)=sum(gs(:,u));
Q2H(u)=1−num(u)/denom(u);end;dumy=Q2H;
for u=1:a
if Q2H(u)≤0
Q2H(u)=0;
end;end;
for u=1:a
dumy(u)=1−Q2H(u);end;
%%Calcul des Q2CH%%
prod=1;
for u=1:a
prod=prod*dumy(u);
Q2CH(u)=1−prod;end;%%tableau des resultats%%
for u=1:a
if (Q2H(u)≥0.00975)
test(u)=1;
elsetest(u)=0;
end;end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ce programme correspond au test inferentiel de Lazraq et Cleroux dans le
%cas de PLS 1 uniquement
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [thsig]=Lazraq cleroux(X,Y,h,TT,alpha)
%%%%parametres d'entree%%%%
% X : matrice des donnees (N*M) pour les variables independantes
% Y : matrice des donnees (N*P) pour les variables dependantes. Ici, on est
% en PLS1 donc Y n'a qu'une seule colonne notee y
% h : nombre maximal de composantes
% TT : composantes PLS
% alpha : seuil limite
109
%%%%parametres de sortie%%%%
%thsig : resultat du test
%Debut du programme
%initialisation
N=size(X,1); %Nombre d'individus
thsig=zeros(h,1);
proba=1−alpha;stu=tq(proba,N); %quantiles de Student
for j=1:h
mat=[Y,TT(:,j)];
res=corr(mat); %matrice de correlations
CR=res(1,2);
tlaz=((sqrt(N))*CR)/(sqrt(1−CR*CR));if tlaz>stu
thsig(1)=1;
end;end;thsig=1;
%fin du programme
110