Commit 4b8a90d8 by Eric Coissac

Some cleaning... ;-)

parent 026d9e01
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/procmod.frame.R
\name{as.procmod.frame}
\alias{as.procmod.frame}
\title{Coerce to a ProcMod Frame.}
\usage{
as.procmod.frame(data, ...)
}
\description{
Coerce to a ProcMod Frame.
}
\author{
Eric Coissac
Christelle Gonindard-Melodelima
}
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/procmod.frame.R
\name{is.procmod.frame}
\alias{is.procmod.frame}
\title{Check if an object is a Matrix Frame.}
\usage{
is.procmod.frame(x)
}
\description{
Check if an object is a Matrix Frame.
}
\author{
Eric Coissac
Christelle Gonindard-Melodelima
}
ProcMod.R
ProcMod_files
Principes-english.R
## ----setup, include = FALSE----------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
## ------------------------------------------------------------------------
library(ProcMod)
## ------------------------------------------------------------------------
data("eukaryotes")
data("bacteria")
## ------------------------------------------------------------------------
data("soil")
data("climat")
data("geography")
## ------------------------------------------------------------------------
library(vegan)
bac.hellinger = decostand(bacteria,method ="hellinger")
euk.hellinger = decostand(eukaryotes,method ="hellinger")
## ------------------------------------------------------------------------
bac.bray = vegdist(bac.hellinger,method = "bray")
euk.bray = vegdist(euk.hellinger,method = "bray")
## ------------------------------------------------------------------------
soil.rescaled = scale(soil, center = TRUE, scale = TRUE)
climat.rescaled = scale(climat, center = TRUE, scale = TRUE)
## ------------------------------------------------------------------------
data = procmod.frame(euk = euk.bray,
bac = bac.bray,
climat = climat,
soil = soil,
geography = geography)
## ------------------------------------------------------------------------
euk.pm = pm(formula = euk ~ soil + climat + geography, data = data)
euk.pm
## ------------------------------------------------------------------------
plot(euk.pm)
## ------------------------------------------------------------------------
anova(euk.pm)
---
title: "ProcMod"
author: "Christelle Melodelima & Eric Coissac"
date: "`r Sys.Date()`"
output:
rmarkdown::html_vignette: default
pdf_document: default
vignette: >
%\VignetteIndexEntry{ProcMod}
%\VignetteEncoding{UTF-8}
%\VignetteEngine{knitr::rmarkdown}
---
```{r setup, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
## Aims of the module
Expliquer un tableau multavariées decrivant des individus ou des sites (ci dessous dénommés individus) par un ensemble de tableaux eux-même multivariés décrivant les mêmes individus. Par exemple, expliquer les changement de communauté d'espèces entre différents sites géographiques à partir de tableaux de données climatiques, chimique, d'espèces d'autres groupes taxinomiques... Chaque tableau est considéré comme une variable explicative sans chercher à donner un rôle à chacune des variables qui le composent.
## Model principes
L'idée est de s'appuyer sur les analyses procustéennes en les généralisant à plusieurs ($k$) tableaux. Pour mémoire, l'analyse procustéenne consiste à superposer deux nuages de points dans un espace de dimensions quelconque en réalisant trois operations:
1. une translation (centrage des données)
1. une rotation
1. une mise à l'échelle.
Dans notre cas, nous considérerons que les deux premières opérations ont pour seul but de projeter l'ensemble des tableaux réponse et explicatifs, dans un espace commun. La troisième operation d'homothétie servira de base à l'analyse de partition de la variance du tableau réponse. Cette approche a de forts liens avec les analyses de co-inerties développées par Chessel et al
## Données en entrée
Les tableaux utilisés dans cette analyse doivent se projeter dans un espace orthogonal, ce qui implique aucune corrélation entre les colonnes des tableaux. Ils doivent tous décrire les mêmes individus et doivent donc tous avoir le même nombre de lignes $n$.
### Tableaux de variables quelconques
Comme posé en préambule, l'analyse vise à mesurer l'effet global de $k$ tableaux de variables sur un tableau réponse sans s'interresser à l'effet individuel de chacune des variables des différents tableaux explicatifs. Les tableaux utilisés peuvent donc sans perte d'information être projetés dans un espace orthogonal par une simple PCA.
### Tableaux de distances
Il est possible de caractériser la dissimilarité entre les individus par une autre mesure que la corrélation (*cf* PCA ci-dessus) en estimant un tableau de distances par une méthode appropriée au type de données étudiées. Par exemple une distance de Bray-Curtis ou de Jaccard, lorsqu'il s'agit de comparer les communautés d'espèces présentes dans plusieurs sites.
Si la distance utilisée est une métrique, le tableau de distance pourra être projeter dans un espace orthogonal à $n-1$ dimensions par une PCoA.
Si la distance utilisée n'est pas une métrique, il faudra recourrir à une méthode non paramétrique telque la NMDS ou alterer le tableau de distance pour le rendre diagonalisable.
## Méthode de calculs du modèle procustéen
L'analyse procustéenne peut être assimilée à un modèle linéaire entre deux tableaux:
- Le tableau réponse : $Y$
- Le tableau explicatif : $X$
Si l'ensemble des variables de chaque tableau appartiennent à $\mathbb{R}$:
- L'opération de translation est réalisée via le centrage des variables des tableaux $X$ et $Y$. Dorénavant, la notation $X$ et $Y$ représentera les tableau après centrage.
- La rotation pour projeter le tableau $X$ sur $Y$ est calculer à partir de la décomposition en valeurs singulières de la matrice $Y'X$ soit $Y'X = U\Lambda V'$. On définit la rotation de $X$ sur $Y$ de la manière suivante:
$$ Rot(X|Y) = XVU' $$
- Le facteur d'homothétie $a$ se calcule selon :
$$ a = \frac{\sum diag(\Lambda)}{\sum diag(X'X)}$$
$\sum diag(\Lambda)$ est la co-inertie entre les matrices $X$ et $Y$ et $\sum diag(X'X)$ est l'inertie du tableau $X$. Co-inertie et inertie pouvant être assimilées à la covariance et à la variance de vecteurs. Le facteur $a$ est donc l'équivalent en dimention 1 de la pente de la droite de régression linéaire de $Y$ par $X$:
$$
a=\frac{Cov_{XY}}{Var_X}
$$
Nous proposons ici de généraliser l'analyse procustéen à $k$ tableaux en résolvant la régression multiple du tableau de réponse $Y$ par $k$ matrices explicatives $X_1,\,X_2,\,...\,X_k$.
Le calcul des coefficients d'échelles $a_i$ est réalisé par la même approche que pour ceux d'une régression linéaire multiple, mais ici à partir de la matrice d'inertie et de co-inertie des tableaux $Y$ et $X_i$:
### Calcul de l'inertie d'une matrice et de co-inertie entre deux matrices
Soit $CoI_{XY}$ la cointertie entre les tableaux $X$ et $Y$ et $I_X$ l'inertie du tableau $X$. $CoI_{XY}$ se calcule à partir de la décomposition en valeur singulière de la matrice $Y'X = U\Lambda V'$.
$$
CoI_{XY} = \frac{\sum{diag(\Lambda)}}{n-1}
$$
Comme pour la Covariance, $CoI_{XY}=CoI{YX}$ et $CoI_{XX}=I_X$
### Calcul du coefficient de corrélation entre deux matrices
Par analogie on définit $R_{XY}$ comme le coefficient de corrélation entre deux matrices $X$ et $Y$ de la manière suivante :
$$
R_{XY} = \frac{CoI_{XY}}{\sqrt{I_{X}I_{Y}}}
$$
### Calcul des facteurs d'échelle en procuste multiple à $k$ tableaux
On note à partir de maintenant :
- $X = \{X_1,\,X_2,\,...\,X_k\}$ l'ensemble des $k$ tableaux explicatifs centrés
- $Y$ le tableau réponse centré
- $M \in \{Y\} \cup X$ tel que $M$ est la matrice de plus grande dimension.
- $CoI_{YX}$ la matrice colonne des co-inerties entre $Y$ et chacun des éléments de $X$
- $CoI_{XX}$ la matrice d'inertie, co-inerties entre tous les éléments de $X$
- $a = \{a_1\,a_2,\,...\,a_k\}$ l'ensemble des coefficients d'échelle associés à chacun des éléments de $X$ dans le modèle procustéen multiple.
$a$ se calcule par :
$$
a = (CoI_{XX})^{-1} CoI_{YX}
$$
Les prédictions du modèle peuvent donc s'écrirent:
$$
\widehat{Rot(Y|M)} = a_1 Rot(X_1|M) + a_2 Rot(X_2|M)+\,...\,+ a_k Rot(X_k|M)
$$
### Interaction entre deux tableaux explicatifs
L'interaction entre deux tableaux explicatifs $X_i$ et $X_j$ est estimée de manière analogue à l'interaction dans un modèle linéaire multiple. Le principe est de poser que $a_i$ le facteur d'échelle associé à $X_i$ est une fonction affine de $X_j$ et symétriquement $a_j$ est une fonction affine de $X_i$. Pour réaliser ce calcul il est nécessaire de projeter les deux matrices explicatives sur $M$.
$$
a_i = (b_i Rot(X_j|M) + c_i) \\
a_j = (b_j Rot(X_i|M) + c_j)
$$
Dans le cas de deux tableaux, le modèle procustéen expliquant $Y$ par $X_1$, $X_2$ et l'interaction de $X_1$ et $X_2$
peut donc s'écrire :
$$
\begin{aligned}
\widehat{Rot(Y|M)} = & a_1 \cdot Rot(X_1|M) + a_2 \cdot Rot(X_2|M) \\
\\
= & (b_1 Rot(X_2|M) + c_1) \cdot Rot(X_1|M) + \\
& (b_2 Rot(X_1|M) + c_2) \cdot Rot(X_2|M) \\
\\
= & c_1 Rot(X_1|M) + c_2 Rot(X_2|M) + (b_1+b_2) Rot(X_1|M) \cdot Rot(X_2|M)
\end{aligned}
$$
En renommant les facteurs d'échelle les prédictions s'écrivent:
$$
\widehat{Rot(Y|M)} = a_1 Rot(X_1|M) + a_2 Rot(X_2|M) + a_{1,2} Rot(X_1|M) \cdot Rot(X_2|M)
$$
Ce qui revient à construire un nouveau modèle sans interaction incluant un tableau explicatif supplémentaire
$$
X_{1,2}=Rot(X_1|M) \cdot Rot(X_2|M)
$$
Ce principe peut être généralisé à l'interaction entre plus de deux tableaux.
## Partition de l'inertie de $Y$ selon le modèle procustéen
La variation total $SCT$ est définie comme suit:
$$
SCT = I_Y * (n-1)
$$
La variation résiduelle non expliquée par le modèle est :
$$
SCR = \sum{(Rot(Y|M)-\widehat{Rot(Y|M)})^2}
$$
Selon l'approche de Scherrer on propose de définir $SCE_i$ la contribution de $X_i$ à la variation de $Y$ peut s'écrire :
$$
SCE_i = a_i \; R_{X_iY} \; SCT
$$
On propose de tester la signignificativité de l'effet de chacun des tableaux explicatifs par une méthode de permutation des lignes de chacune des matrices explicatives.
## How to build a procrustean model
```{r}
library(ProcMod)
```
### Loading of the demo data
They consist in two MOTUs tables describing bacterial and eukaryiote communities at 21 sites accros the eastern coast of Australia.
```{r}
data("eukaryotes")
data("bacteria")
```
At each site environmental data are also available to describe soil chemistry, climat and site location.
```{r}
data("soil")
data("climat")
data("geography")
```
### Processing of the MOTUs data
Using the *vegan* package MOTUs frequencies are transformed according to Hellinger by take the square root of the MOTUs relative frequencies at each site
```{r}
library(vegan)
bac.hellinger = decostand(bacteria,method ="hellinger")
euk.hellinger = decostand(eukaryotes,method ="hellinger")
```
Bray Curtis distances among sites are computed according to both the communities
```{r}
bac.bray = vegdist(bac.hellinger,method = "bray")
euk.bray = vegdist(euk.hellinger,method = "bray")
```
### Processing the environmental data
Soil and climatic data are centered and rescaled for having the same influence
```{r}
soil.rescaled = scale(soil, center = TRUE, scale = TRUE)
climat.rescaled = scale(climat, center = TRUE, scale = TRUE)
```
### Assembling the data for the model
```{r}
data = procmod.frame(euk = euk.bray,
bac = bac.bray,
climat = climat,
soil = soil,
geography = geography)
```
```{r}
euk.pm = pm(formula = euk ~ soil + climat + geography, data = data)
euk.pm
```
```{r}
plot(euk.pm)
```
```{r}
anova(euk.pm)
```
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="Christelle Melodelima &amp; Eric Coissac" />
<meta name="date" content="2018-07-06" />
<title>ProcMod</title>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
a.sourceLine { display: inline-block; line-height: 1.25; }
a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
a.sourceLine:empty { height: 1.2em; position: absolute; }
.sourceCode { overflow: visible; }
code.sourceCode { white-space: pre; position: relative; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
code.sourceCode { white-space: pre-wrap; }
a.sourceLine { text-indent: -1em; padding-left: 1em; }
}
pre.numberSource a.sourceLine
{ position: relative; }
pre.numberSource a.sourceLine:empty
{ position: absolute; }
pre.numberSource a.sourceLine::before
{ content: attr(data-line-number);
position: absolute; left: -5em; text-align: right; vertical-align: baseline;
border: none; pointer-events: all;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
a.sourceLine::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style type="text/css">body {
background-color: #fff;
margin: 1em auto;
max-width: 700px;
overflow: visible;
padding-left: 2em;
padding-right: 2em;
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.35;
}
#header {
text-align: center;
}
#TOC {
clear: both;
margin: 0 0 10px 10px;
padding: 4px;
width: 400px;
border: 1px solid #CCCCCC;
border-radius: 5px;
background-color: #f6f6f6;
font-size: 13px;
line-height: 1.3;
}
#TOC .toctitle {
font-weight: bold;
font-size: 15px;
margin-left: 5px;
}
#TOC ul {
padding-left: 40px;
margin-left: -1.5em;
margin-top: 5px;
margin-bottom: 5px;
}
#TOC ul ul {
margin-left: -2em;
}
#TOC li {
line-height: 16px;
}
table {
margin: 1em auto;
border-width: 1px;
border-color: #DDDDDD;
border-style: outset;
border-collapse: collapse;
}
table th {
border-width: 2px;
padding: 5px;
border-style: inset;
}
table td {
border-width: 1px;
border-style: inset;
line-height: 18px;
padding: 5px 5px;
}
table, table th, table td {
border-left-style: none;
border-right-style: none;
}
table thead, table tr.even {
background-color: #f7f7f7;
}
p {
margin: 0.5em 0;
}
blockquote {
background-color: #f6f6f6;
padding: 0.25em 0.75em;
}
hr {
border-style: solid;
border: none;
border-top: 1px solid #777;
margin: 28px 0;
}
dl {
margin-left: 0;
}
dl dd {
margin-bottom: 13px;
margin-left: 13px;
}
dl dt {
font-weight: bold;
}
ul {
margin-top: 0;
}
ul li {
list-style: circle outside;
}
ul ul {
margin-bottom: 0;
}
pre, code {
background-color: #f7f7f7;
border-radius: 3px;
color: #333;
white-space: pre-wrap;
}
pre {
border-radius: 3px;
margin: 5px 0px 10px 0px;
padding: 10px;
}
pre:not([class]) {
background-color: #f7f7f7;
}
code {
font-family: Consolas, Monaco, 'Courier New', monospace;
font-size: 85%;
}
p > code, li > code {
padding: 2px 0px;
}
div.figure {
text-align: center;
}
img {
background-color: #FFFFFF;
padding: 2px;
border: 1px solid #DDDDDD;
border-radius: 3px;
border: 1px solid #CCCCCC;
margin: 0 5px;
}
h1 {
margin-top: 0;
font-size: 35px;
line-height: 40px;
}
h2 {
border-bottom: 4px solid #f7f7f7;
padding-top: 10px;
padding-bottom: 2px;
font-size: 145%;
}
h3 {
border-bottom: 2px solid #f7f7f7;
padding-top: 10px;
font-size: 120%;
}
h4 {
border-bottom: 1px solid #f7f7f7;
margin-left: 8px;
font-size: 105%;
}
h5, h6 {
border-bottom: 1px solid #ccc;
font-size: 105%;
}
a {
color: #0033dd;
text-decoration: none;
}
a:hover {
color: #6666ff; }
a:visited {
color: #800080; }
a:visited:hover {
color: #BB00BB; }
a[href^="http:"] {
text-decoration: underline; }
a[href^="https:"] {
text-decoration: underline; }
code > span.kw { color: #555; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #d14; }
code > span.fl { color: #d14; }
code > span.ch { color: #d14; }
code > span.st { color: #d14; }
code > span.co { color: #888888; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #900; font-weight: bold; } code > span.er { color: #a61717; background-color: #e3d2d2; }
</style>
</head>
<body>
<h1 class="title toc-ignore">ProcMod</h1>
<h4 class="author"><em>Christelle Melodelima &amp; Eric Coissac</em></h4>
<h4 class="date"><em>2018-07-06</em></h4>
<div id="aims-of-the-module" class="section level2">
<h2>Aims of the module</h2>
<p>Expliquer un tableau multavariées decrivant des individus ou des sites (ci dessous dénommés individus) par un ensemble de tableaux eux-même multivariés décrivant les mêmes individus. Par exemple, expliquer les changement de communauté d’espèces entre différents sites géographiques à partir de tableaux de données climatiques, chimique, d’espèces d’autres groupes taxinomiques… Chaque tableau est considéré comme une variable explicative sans chercher à donner un rôle à chacune des variables qui le composent.</p>
</div>
<div id="model-principes" class="section level2">
<h2>Model principes</h2>
<p>L’idée est de s’appuyer sur les analyses procustéennes en les généralisant à plusieurs (<span class="math inline">\(k\)</span>) tableaux. Pour mémoire, l’analyse procustéenne consiste à superposer deux nuages de points dans un espace de dimensions quelconque en réalisant trois operations:</p>
<ol style="list-style-type: decimal">
<li>une translation (centrage des données)</li>
<li>une rotation</li>
<li>une mise à l’échelle.</li>
</ol>
<p>Dans notre cas, nous considérerons que les deux premières opérations ont pour seul but de projeter l’ensemble des tableaux réponse et explicatifs, dans un espace commun. La troisième operation d’homothétie servira de base à l’analyse de partition de la variance du tableau réponse. Cette approche a de forts liens avec les analyses de co-inerties développées par Chessel et al</p>
</div>
<div id="donnees-en-entree" class="section level2">
<h2>Données en entrée</h2>
<p>Les tableaux utilisés dans cette analyse doivent se projeter dans un espace orthogonal, ce qui implique aucune corrélation entre les colonnes des tableaux. Ils doivent tous décrire les mêmes individus et doivent donc tous avoir le même nombre de lignes <span class="math inline">\(n\)</span>.</p>
<div id="tableaux-de-variables-quelconques" class="section level3">
<h3>Tableaux de variables quelconques</h3>
<p>Comme posé en préambule, l’analyse vise à mesurer l’effet global de <span class="math inline">\(k\)</span> tableaux de variables sur un tableau réponse sans s’interresser à l’effet individuel de chacune des variables des différents tableaux explicatifs. Les tableaux utilisés peuvent donc sans perte d’information être projetés dans un espace orthogonal par une simple PCA.</p>
</div>
<div id="tableaux-de-distances" class="section level3">
<h3>Tableaux de distances</h3>
<p>Il est possible de caractériser la dissimilarité entre les individus par une autre mesure que la corrélation (<em>cf</em> PCA ci-dessus) en estimant un tableau de distances par une méthode appropriée au type de données étudiées. Par exemple une distance de Bray-Curtis ou de Jaccard, lorsqu’il s’agit de comparer les communautés d’espèces présentes dans plusieurs sites.</p>
<p>Si la distance utilisée est une métrique, le tableau de distance pourra être projeter dans un espace orthogonal à <span class="math inline">\(n-1\)</span> dimensions par une PCoA.</p>
<p>Si la distance utilisée n’est pas une métrique, il faudra recourrir à une méthode non paramétrique telque la NMDS ou alterer le tableau de distance pour le rendre diagonalisable.</p>
</div>
</div>
<div id="methode-de-calculs-du-modele-procusteen" class="section level2">
<h2>Méthode de calculs du modèle procustéen</h2>
<p>L’analyse procustéenne peut être assimilée à un modèle linéaire entre deux tableaux:</p>
<ul>
<li>Le tableau réponse : <span class="math inline">\(Y\)</span></li>
<li>Le tableau explicatif : <span class="math inline">\(X\)</span></li>
</ul>
<p>Si l’ensemble des variables de chaque tableau appartiennent à <span class="math inline">\(\mathbb{R}\)</span>:</p>
<ul>
<li>L’opération de translation est réalisée via le centrage des variables des tableaux <span class="math inline">\(X\)</span> et <span class="math inline">\(Y\)</span>. Dorénavant, la notation <span class="math inline">\(X\)</span> et <span class="math inline">\(Y\)</span> représentera les tableau après centrage.</li>
<li>La rotation pour projeter le tableau <span class="math inline">\(X\)</span> sur <span class="math inline">\(Y\)</span> est calculer à partir de la décomposition en valeurs singulières de la matrice <span class="math inline">\(Y'X\)</span> soit <span class="math inline">\(Y'X = U\Lambda V'\)</span>. On définit la rotation de <span class="math inline">\(X\)</span> sur <span class="math inline">\(Y\)</span> de la manière suivante:</li>
</ul>
<p><span class="math display">\[ Rot(X|Y) = XVU' \]</span></p>
<ul>
<li>Le facteur d’homothétie <span class="math inline">\(a\)</span> se calcule selon :</li>
</ul>
<p><span class="math display">\[ a = \frac{\sum diag(\Lambda)}{\sum diag(X'X)}\]</span></p>
<p><span class="math inline">\(\sum diag(\Lambda)\)</span> est la co-inertie entre les matrices <span class="math inline">\(X\)</span> et <span class="math inline">\(Y\)</span> et <span class="math inline">\(\sum diag(X'X)\)</span> est l’inertie du tableau <span class="math inline">\(X\)</span>. Co-inertie et inertie pouvant être assimilées à la covariance et à la variance de vecteurs. Le facteur <span class="math inline">\(a\)</span> est donc l’équivalent en dimention 1 de la pente de la droite de régression linéaire de <span class="math inline">\(Y\)</span> par <span class="math inline">\(X\)</span>:</p>
<p><span class="math display">\[
a=\frac{Cov_{XY}}{Var_X}
\]</span></p>
<p>Nous proposons ici de généraliser l’analyse procustéen à <span class="math inline">\(k\)</span> tableaux en résolvant la régression multiple du tableau de réponse <span class="math inline">\(Y\)</span> par <span class="math inline">\(k\)</span> matrices explicatives <span class="math inline">\(X_1,\,X_2,\,...\,X_k\)</span>.</p>
<p>Le calcul des coefficients d’échelles <span class="math inline">\(a_i\)</span> est réalisé par la même approche que pour ceux d’une régression linéaire multiple, mais ici à partir de la matrice d’inertie et de co-inertie des tableaux <span class="math inline">\(Y\)</span> et <span class="math inline">\(X_i\)</span>:</p>
<div id="calcul-de-linertie-dune-matrice-et-de-co-inertie-entre-deux-matrices" class="section level3">
<h3>Calcul de l’inertie d’une matrice et de co-inertie entre deux matrices</h3>
<p>Soit <span class="math inline">\(CoI_{XY}\)</span> la cointertie entre les tableaux <span class="math inline">\(X\)</span> et <span class="math inline">\(Y\)</span> et <span class="math inline">\(I_X\)</span> l’inertie du tableau <span class="math inline">\(X\)</span>. <span class="math inline">\(CoI_{XY}\)</span> se calcule à partir de la décomposition en valeur singulière de la matrice <span class="math inline">\(Y'X = U\Lambda V'\)</span>.</p>
<p><span class="math display">\[
CoI_{XY} = \frac{\sum{diag(\Lambda)}}{n-1}
\]</span></p>
<p>Comme pour la Covariance, <span class="math inline">\(CoI_{XY}=CoI{YX}\)</span> et <span class="math inline">\(CoI_{XX}=I_X\)</span></p>
</div>
<div id="calcul-du-coefficient-de-correlation-entre-deux-matrices" class="section level3">
<h3>Calcul du coefficient de corrélation entre deux matrices</h3>
<p>Par analogie on définit <span class="math inline">\(R_{XY}\)</span> comme le coefficient de corrélation entre deux matrices <span class="math inline">\(X\)</span> et <span class="math inline">\(Y\)</span> de la manière suivante :</p>
<p><span class="math display">\[
R_{XY} = \frac{CoI_{XY}}{\sqrt{I_{X}I_{Y}}}
\]</span></p>
</div>
<div id="calcul-des-facteurs-dechelle-en-procuste-multiple-a-k-tableaux" class="section level3">
<h3>Calcul des facteurs d’échelle en procuste multiple à <span class="math inline">\(k\)</span> tableaux</h3>
<p>On note à partir de maintenant :</p>
<ul>
<li><span class="math inline">\(X = \{X_1,\,X_2,\,...\,X_k\}\)</span> l’ensemble des <span class="math inline">\(k\)</span> tableaux explicatifs centrés</li>
<li><span class="math inline">\(Y\)</span> le tableau réponse centré</li>
<li><span class="math inline">\(M \in \{Y\} \cup X\)</span> tel que <span class="math inline">\(M\)</span> est la matrice de plus grande dimension.</li>
<li><span class="math inline">\(CoI_{YX}\)</span> la matrice colonne des co-inerties entre <span class="math inline">\(Y\)</span> et chacun des éléments de <span class="math inline">\(X\)</span></li>
<li><span class="math inline">\(CoI_{XX}\)</span> la matrice d’inertie, co-inerties entre tous les éléments de <span class="math inline">\(X\)</span></li>
<li><span class="math inline">\(a = \{a_1\,a_2,\,...\,a_k\}\)</span> l’ensemble des coefficients d’échelle associés à chacun des éléments de <span class="math inline">\(X\)</span> dans le modèle procustéen multiple.</li>
</ul>
<p><span class="math inline">\(a\)</span> se calcule par :</p>
<p><span class="math display">\[
a = (CoI_{XX})^{-1} CoI_{YX}
\]</span></p>
<p>Les prédictions du modèle peuvent donc s’écrirent:</p>
<p><span class="math display">\[
\widehat{Rot(Y|M)} = a_1 Rot(X_1|M) + a_2 Rot(X_2|M)+\,...\,+ a_k Rot(X_k|M)
\]</span></p>
</div>
<div id="interaction-entre-deux-tableaux-explicatifs" class="section level3">
<h3>Interaction entre deux tableaux explicatifs</h3>
<p>L’interaction entre deux tableaux explicatifs <span class="math inline">\(X_i\)</span> et <span class="math inline">\(X_j\)</span> est estimée de manière analogue à l’interaction dans un modèle linéaire multiple. Le principe est de poser que <span class="math inline">\(a_i\)</span> le facteur d’échelle associé à <span class="math inline">\(X_i\)</span> est une fonction affine de <span class="math inline">\(X_j\)</span> et symétriquement <span class="math inline">\(a_j\)</span> est une fonction affine de <span class="math inline">\(X_i\)</span>. Pour réaliser ce calcul il est nécessaire de projeter les deux matrices explicatives sur <span class="math inline">\(M\)</span>.</p>
<p><span class="math display">\[
a_i = (b_i Rot(X_j|M) + c_i) \\
a_j = (b_j Rot(X_i|M) + c_j)
\]</span></p>
<p>Dans le cas de deux tableaux, le modèle procustéen expliquant <span class="math inline">\(Y\)</span> par <span class="math inline">\(X_1\)</span>, <span class="math inline">\(X_2\)</span> et l’interaction de <span class="math inline">\(X_1\)</span> et <span class="math inline">\(X_2\)</span> peut donc s’écrire :</p>
<p><span class="math display">\[
\begin{aligned}
\widehat{Rot(Y|M)} = &amp; a_1 \cdot Rot(X_1|M) + a_2 \cdot Rot(X_2|M) \\
\\
= &amp; (b_1 Rot(X_2|M) + c_1) \cdot Rot(X_1|M) + \\
&amp; (b_2 Rot(X_1|M) + c_2) \cdot Rot(X_2|M) \\
\\
= &amp; c_1 Rot(X_1|M) + c_2 Rot(X_2|M) + (b_1+b_2) Rot(X_1|M) \cdot Rot(X_2|M)
\end{aligned}
\]</span></p>
<p>En renommant les facteurs d’échelle les prédictions s’écrivent:</p>
<p><span class="math display">\[
\widehat{Rot(Y|M)} = a_1 Rot(X_1|M) + a_2 Rot(X_2|M) + a_{1,2} Rot(X_1|M) \cdot Rot(X_2|M)