table des mati eres - inra

112
Table des mati` eres 1 Introduction ...................................... 1 2 La r´ egression PLS avec ou sans s´ election de variables ............... 1 2.1 Le principe de la r´ egression PLS sans s´ election de variables ....... 1 2.2 Le choix du nombre de composantes .................... 2 2.3 Le principe de la s´ election de variables en r´ egression PLS ........ 2 2.4 Techniques d’obtention d’intervalles de confiance sur les coefficients de egression PLS ................................ 2 3 Utilisation de l’interface de lancement ....................... 3 4 Illustration de la r´ egression PLS ` a l’aide d’exemples ............... 6 4.1 Illustration de la r´ egression PLS1 sans s´ election de variables ....... 6 4.2 Illustration de la r´ egression PLS1 avec s´ election de variables ....... 14 4.3 Illustration de la r´ egression PLS2 sans s´ election de variables ....... 16 4.4 Illustration de la r´ egression PLS2 avec s´ election de variables ....... 22 5 Conclusion ...................................... 23 Bibliographie 24 A Programmes pr´ eliminaires 25 B Programmation de l’interface 29 C Programme PLS1 sans s´ election de variables sans donn´ ees manquantes 57 D Programme PLS1 sans s´ election de variables avec donn´ ees manquantes 61 E Programme PLS1 avec s´ election de variables 66 F Programme PLS2 sans s´ election de variables sans donn´ ees manquantes 69 G Programme PLS2 sans s´ election de variables avec donn´ ees manquantes 73 H Programme PLS2 avec s´ election de variables 78 I Programmes calculant les ´ equations de r´ egression 81 J Programmes permettant la restitution des donn´ ees et la pr´ ediction sur un jeu-test ´ eventuel selon les diff´ erentes r´ egressions 86

Upload: others

Post on 04-Jan-2022

7 views

Category:

Documents


0 download

TRANSCRIPT

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

end

28

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

end

%Fin de la boucle FOR 1

%fin du programme

60

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

%Fin du programme

97

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