Au cours théorique vous avez appris ce qu’était un Plan Factoriel Complet. Faites tourner l’exemple ci-dessous et répondez aux questions qui suivent.
=FrF2(nruns = 16,nfactors = 4,replications =2,randomize=FALSE,repeat.only=TRUE) Design
creating full factorial with 16 runs ...
design.info(Design)
$type
[1] "full factorial"
$nruns
[1] 16
$nfactors
[1] 4
$nlevels
[1] 2 2 2 2
$factor.names
$factor.names$A
[1] "-1" "1"
$factor.names$B
[1] "-1" "1"
$factor.names$C
[1] "-1" "1"
$factor.names$D
[1] "-1" "1"
$replications
[1] 2
$repeat.only
[1] TRUE
$randomize
[1] FALSE
$seed
NULL
$creator
FrF2(nruns = 16, nfactors = 4, replications = 2, randomize = FALSE,
repeat.only = TRUE)
$quantitative
A B C D
FALSE FALSE FALSE FALSE
$FrF2.version
[1] "2.2-3"
=as.data.frame(desnum(Design))
DM# DM = Design matrix DM
A1 B1 C1 D1
1 -1 -1 -1 -1
2 -1 -1 -1 -1
3 1 -1 -1 -1
4 1 -1 -1 -1
5 -1 1 -1 -1
6 -1 1 -1 -1
7 1 1 -1 -1
8 1 1 -1 -1
9 -1 -1 1 -1
10 -1 -1 1 -1
11 1 -1 1 -1
12 1 -1 1 -1
13 -1 1 1 -1
14 -1 1 1 -1
15 1 1 1 -1
16 1 1 1 -1
17 -1 -1 -1 1
18 -1 -1 -1 1
19 1 -1 -1 1
20 1 -1 -1 1
21 -1 1 -1 1
22 -1 1 -1 1
23 1 1 -1 1
24 1 1 -1 1
25 -1 -1 1 1
26 -1 -1 1 1
27 1 -1 1 1
28 1 -1 1 1
29 -1 1 1 1
30 -1 1 1 1
31 1 1 1 1
32 1 1 1 1
Sur base du Design nous observons qu’il y a 4 colonnes et donc 4 facteurs ayant chacun 2 niveaux (-1 et 1). Pour un plan factoriel complet à 4 facteurs, il faut \(2^4 = 16\) essais pour avoir toutes les combinaisons de chacun des niveaux des facteurs or nous en avons 32. Cependant, notre Design est répliqué puique chacune des lignes est répétée une deuxième fois. Nous avons donc bien un Plan Factoriel Complet \(2^4\), avec 2 réplications.
Les valeurs -1 et 1 représentent les valeurs minimales et maximales du domaine de chacun des facteurs testés. Le domaine de tous les facteurs est donc compris entre -1 et 1, on parle de données standardisées (NB: Nous réfléchirons plus tard dans le TP à l’avantage de standardisé le domaine de chaque facteur).
La définition de l’orthogonalité n’est pas toujours claire dans la litterature. Nous allons dans ce cours toujours lier un plan à un modèle d’intérêt qu’on désire estimer. On dira alors qu’un plan est orthogonal pour ce modèle s’il permet d’estimer les paramètres de façon non corrélée.
Répondez sur cette base aux questions suivantes.
=model.matrix(~A+B+C+D+A:B+A:C+A:D+B:C+B:D+C:D,Design)
X# Matrice du modèle
X
(Intercept) A1 B1 C1 D1 A1:B1 A1:C1 A1:D1 B1:C1 B1:D1 C1:D1
1 1 -1 -1 -1 -1 1 1 1 1 1 1
2 1 -1 -1 -1 -1 1 1 1 1 1 1
3 1 1 -1 -1 -1 -1 -1 -1 1 1 1
4 1 1 -1 -1 -1 -1 -1 -1 1 1 1
5 1 -1 1 -1 -1 -1 1 1 -1 -1 1
6 1 -1 1 -1 -1 -1 1 1 -1 -1 1
7 1 1 1 -1 -1 1 -1 -1 -1 -1 1
8 1 1 1 -1 -1 1 -1 -1 -1 -1 1
9 1 -1 -1 1 -1 1 -1 1 -1 1 -1
10 1 -1 -1 1 -1 1 -1 1 -1 1 -1
11 1 1 -1 1 -1 -1 1 -1 -1 1 -1
12 1 1 -1 1 -1 -1 1 -1 -1 1 -1
13 1 -1 1 1 -1 -1 -1 1 1 -1 -1
14 1 -1 1 1 -1 -1 -1 1 1 -1 -1
15 1 1 1 1 -1 1 1 -1 1 -1 -1
16 1 1 1 1 -1 1 1 -1 1 -1 -1
17 1 -1 -1 -1 1 1 1 -1 1 -1 -1
18 1 -1 -1 -1 1 1 1 -1 1 -1 -1
19 1 1 -1 -1 1 -1 -1 1 1 -1 -1
20 1 1 -1 -1 1 -1 -1 1 1 -1 -1
21 1 -1 1 -1 1 -1 1 -1 -1 1 -1
22 1 -1 1 -1 1 -1 1 -1 -1 1 -1
23 1 1 1 -1 1 1 -1 1 -1 1 -1
24 1 1 1 -1 1 1 -1 1 -1 1 -1
25 1 -1 -1 1 1 1 -1 -1 -1 -1 1
26 1 -1 -1 1 1 1 -1 -1 -1 -1 1
27 1 1 -1 1 1 -1 1 1 -1 -1 1
28 1 1 -1 1 1 -1 1 1 -1 -1 1
29 1 -1 1 1 1 -1 -1 -1 1 1 1
30 1 -1 1 1 1 -1 -1 -1 1 1 1
31 1 1 1 1 1 1 1 1 1 1 1
32 1 1 1 1 1 1 1 1 1 1 1
attr(,"assign")
[1] 0 1 2 3 4 5 6 7 8 9 10
attr(,"contrasts")
attr(,"contrasts")$A
[,1]
-1 -1
1 1
attr(,"contrasts")$B
[,1]
-1 -1
1 1
attr(,"contrasts")$C
[,1]
-1 -1
1 1
attr(,"contrasts")$D
[,1]
-1 -1
1 1
# Matrice de X'X
t(X)%*%X
(Intercept) A1 B1 C1 D1 A1:B1 A1:C1 A1:D1 B1:C1 B1:D1 C1:D1
(Intercept) 32 0 0 0 0 0 0 0 0 0 0
A1 0 32 0 0 0 0 0 0 0 0 0
B1 0 0 32 0 0 0 0 0 0 0 0
C1 0 0 0 32 0 0 0 0 0 0 0
D1 0 0 0 0 32 0 0 0 0 0 0
A1:B1 0 0 0 0 0 32 0 0 0 0 0
A1:C1 0 0 0 0 0 0 32 0 0 0 0
A1:D1 0 0 0 0 0 0 0 32 0 0 0
B1:C1 0 0 0 0 0 0 0 0 32 0 0
B1:D1 0 0 0 0 0 0 0 0 0 32 0
C1:D1 0 0 0 0 0 0 0 0 0 0 32
Le plus grand modèle estimable avec ce plan est un modèle à 16 termes : 1 (intercept) + 4 (effets principaux) + 6 (interactions des effets 2 à 2) + 4 (interactions des effets 3 à 3) + 1 (interaction avec tous les effets) = 16 termes.
Oui, car notre matrice X’X est diagonale. Cela implique que chaque facteur est estimé de manière non-corrélée (et indépendante en cas de normalité) des autres. Cela est mieux pour l’efficacité de nos estimations et une qualité appréciée pour les plans.
Les vaccins comprenant un conjugué antigène de polysaccharide (PS)
lié à une protéine ont de multiples applications. Dans le cadre de cette
étude, on s’intéresse au Rendement en terme de PS couplé (%). Celui-ci
dépend de :
C : Concentration initiale de PS [2, 4] mg/l
P : PH d’activation [7, 9]
R : Ratio PS/PR [0.8, 1.2]
T : Type de protéine (identiques mais 2 origines différents) (T1,T2)
Le jeux de données avec lequel vous allez travailler est en valeurs standardisées. Travailler avec des données standardisées est intéressant lorsque nous travaillons avec des plans expérimentaux pour différentes raisons.
Cela permet de remettre le domaine des valeurs de tous les facteurs sur une même échelle entre -1 et 1 et donc d’interpréter les effets des facteurs directement par rapport au domaine d’intérêt sans trop s’occuper des unités de chacun.
Quand un facteur standardisé augmente d’une unité, cela veut dire que le facteur passe du milieu de son domaine à son maximum et la valeur des coefficients s’interprête alors en conséquence.
Nous pouvons alors directement comparer les coefficients des différents facteurs pour voir lequel à le plus d’impact sur la réponse.
D’autre part, cela modifie également l’interprétation du terme constant qui représente la valeur moyenne de Y quand tous les facteurs sont au milieu de leur domaine (en 0).
D’un point de vue statistique, en particulier dans les plans factoriels, la standardisation (et surtout le centrage) permet d’obtenir l’orthogonalité de la matrice du modèle et estimer les effets des facteurs indépendamment.
Téléchargez les données du fichier excel TP7_PFC.xlsx
puis : * Visualiser le fichier de données et vérifier que le plan choisi
est bien un plan factoriel complet. Est-il répété ?
<- read_excel("TP7_PFC.xlsx")
vaccinPFC pander(vaccinPFC)
Cs | Ps | Rs | Ts | Rendement |
---|---|---|---|---|
-1 | -1 | -1 | -1 | 59.6 |
-1 | -1 | -1 | -1 | 58.6 |
1 | -1 | -1 | -1 | 84.7 |
1 | -1 | -1 | -1 | 88.2 |
-1 | 1 | -1 | -1 | 85.2 |
-1 | 1 | -1 | -1 | 84.6 |
1 | 1 | -1 | -1 | 92.7 |
1 | 1 | -1 | -1 | 93.3 |
-1 | -1 | 1 | -1 | 45.6 |
-1 | -1 | 1 | -1 | 43.4 |
1 | -1 | 1 | -1 | 74.1 |
1 | -1 | 1 | -1 | 71.7 |
-1 | 1 | 1 | -1 | 70.8 |
-1 | 1 | 1 | -1 | 70.1 |
1 | 1 | 1 | -1 | 79.6 |
1 | 1 | 1 | -1 | 80.4 |
-1 | -1 | -1 | 1 | 51.4 |
-1 | -1 | -1 | 1 | 51.3 |
1 | -1 | -1 | 1 | 78.1 |
1 | -1 | -1 | 1 | 77.9 |
-1 | 1 | -1 | 1 | 77.7 |
-1 | 1 | -1 | 1 | 76.6 |
1 | 1 | -1 | 1 | 86.8 |
1 | 1 | -1 | 1 | 84.8 |
-1 | -1 | 1 | 1 | 37.5 |
-1 | -1 | 1 | 1 | 35.2 |
1 | -1 | 1 | 1 | 67.4 |
1 | -1 | 1 | 1 | 66.3 |
-1 | 1 | 1 | 1 | 60.8 |
-1 | 1 | 1 | 1 | 61.5 |
1 | 1 | 1 | 1 | 72.8 |
1 | 1 | 1 | 1 | 72.4 |
lm
d’ordre 2
(comprenant tous les effets principaux et toutes les interactions à 2)
pour expliquer le Rendement en fonction des 4 facteurs.aliases
? Comment
auriez-vous pu trouver cette réponse sans utiliser la fonction ?<- lm(Rendement ~ Cs+Ps+Rs+Ts+Cs:Ps+Cs:Rs+Cs:Ts+Ps:Rs+Ps:Ts+Rs:Ts, data = vaccinPFC)
modPFC summary(modPFC)
Call:
lm.default(formula = Rendement ~ Cs + Ps + Rs + Ts + Cs:Ps +
Cs:Rs + Cs:Ts + Ps:Rs + Ps:Ts + Rs:Ts, data = vaccinPFC)
Residuals:
Min 1Q Median 3Q Max
-1.67813 -0.65000 -0.03437 0.45000 2.35938
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 70.03437 0.18668 375.155 < 2e-16 ***
Cs 9.41563 0.18668 50.437 < 2e-16 ***
Ps 8.09688 0.18668 43.373 < 2e-16 ***
Rs -6.93437 0.18668 -37.146 < 2e-16 ***
Ts -3.87812 0.18668 -20.774 1.75e-15 ***
Cs:Ps -4.69688 0.18668 -25.160 < 2e-16 ***
Cs:Rs 0.57187 0.18668 3.063 0.0059 **
Cs:Ts 0.24062 0.18668 1.289 0.2114
Ps:Rs -0.14688 0.18668 -0.787 0.4402
Ps:Ts -0.07813 0.18668 -0.418 0.6798
Rs:Ts 0.01562 0.18668 0.084 0.9341
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.056 on 21 degrees of freedom
Multiple R-squared: 0.997, Adjusted R-squared: 0.9955
F-statistic: 688.1 on 10 and 21 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(modPFC)
les valeurs estimées ("leverages") sont tous = 0.34375
et il n'y a aucune variable dépendante facteur ; aucun graphe no. 5
par(mfrow=c(1,1))
anova(modPFC)
Analysis of Variance Table
Response: Rendement
Df Sum Sq Mean Sq F value Pr(>F)
Cs 1 2836.93 2836.93 2543.8885 < 2.2e-16 ***
Ps 1 2097.90 2097.90 1881.1986 < 2.2e-16 ***
Rs 1 1538.74 1538.74 1379.7945 < 2.2e-16 ***
Ts 1 481.28 481.28 431.5622 1.753e-15 ***
Cs:Ps 1 705.94 705.94 633.0205 < 2.2e-16 ***
Cs:Rs 1 10.47 10.47 9.3843 0.0059 **
Cs:Ts 1 1.85 1.85 1.6614 0.2114
Ps:Rs 1 0.69 0.69 0.6190 0.4402
Ps:Ts 1 0.20 0.20 0.1751 0.6798
Rs:Ts 1 0.01 0.01 0.0070 0.9341
Residuals 21 23.42 1.12
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
aliases(modPFC)
[1] no aliasing in the model
## Calcul des écarts types du modèle :
=FrF2(nruns = 16,nfactors = 4,replications =2,randomize=FALSE,repeat.only=TRUE) Design
creating full factorial with 16 runs ...
=model.matrix(modPFC,Design)
X
<- solve(t(X)%*%X) #(X'X)^-1
T1 <- T1*1.1151 #(X'X)^-1 * S^2
T2 <- sqrt(T2) # sqrt((X'X)^-1 * S^2))
T3 T3
(Intercept) Cs Ps Rs Ts Cs:Ps
(Intercept) 0.1866732 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Cs 0.0000000 0.1866732 0.0000000 0.0000000 0.0000000 0.0000000
Ps 0.0000000 0.0000000 0.1866732 0.0000000 0.0000000 0.0000000
Rs 0.0000000 0.0000000 0.0000000 0.1866732 0.0000000 0.0000000
Ts 0.0000000 0.0000000 0.0000000 0.0000000 0.1866732 0.0000000
Cs:Ps 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.1866732
Cs:Rs 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Cs:Ts 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Ps:Rs 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Ps:Ts 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Rs:Ts 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Cs:Rs Cs:Ts Ps:Rs Ps:Ts Rs:Ts
(Intercept) 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Cs 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Ps 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Rs 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Ts 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Cs:Ps 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Cs:Rs 0.1866732 0.0000000 0.0000000 0.0000000 0.0000000
Cs:Ts 0.0000000 0.1866732 0.0000000 0.0000000 0.0000000
Ps:Rs 0.0000000 0.0000000 0.1866732 0.0000000 0.0000000
Ps:Ts 0.0000000 0.0000000 0.0000000 0.1866732 0.0000000
Rs:Ts 0.0000000 0.0000000 0.0000000 0.0000000 0.1866732
Le package FrF2
propose deux manières, autres que
l’anova, d’analyser l’effet des différents facteurs de votre modèle.
Daniel plot
qui est un qq plot des coefficients du
modèle. Si tous les paramètres théoriques valent 0, le graphique devrait
ressembler à qqplot de données normales. Si pas, les coefficients plus
importants ressortent comme des outliers. C’est une manière de
visualiser les termes importants dans le modèle.IAPlot
permet de visualiser les
interactions 2 à 2 entre facteurs.MEPlot
permet finalement de représenter les
effets principaux des facteurs.Questions :
Daniel Plot
?# DanielPlot
::DanielPlot(modPFC, half=TRUE, code = TRUE) FrF2
# InteractionPlot
::IAPlot(modPFC) FrF2
# MEPlot
::MEPlot(modPFC) FrF2
A l’aide de l’IAPlot, nous pouvons observer l’interaction Cs:Ps (significative à l’anova) car les droites ne sont pas parallèles. L’interaction Cs:Rs est plus difficile à distinguer (elle est également moins significative que l’autre dans l’anova). Le DanielPlot permet d’observer l’effet absolu des différents termes du modèle. On y retrouve les termes significatifs dans l’anova par ordre de significacité : Cs, Ps, Rs, Cs:Ps, Ts et Cs:Rs.
Estimez un modèle comprenant uniquement les termes significatifs du modèle et comparez les tableaux résumés des deux modèles.
<- lm(Rendement ~ Cs+Ps+Rs+Ts+Cs:Ps+Cs:Rs, data = vaccinPFC)
modPFC2 summary(modPFC)
Call:
lm.default(formula = Rendement ~ Cs + Ps + Rs + Ts + Cs:Ps +
Cs:Rs + Cs:Ts + Ps:Rs + Ps:Ts + Rs:Ts, data = vaccinPFC)
Residuals:
Min 1Q Median 3Q Max
-1.67813 -0.65000 -0.03437 0.45000 2.35938
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 70.03437 0.18668 375.155 < 2e-16 ***
Cs 9.41563 0.18668 50.437 < 2e-16 ***
Ps 8.09688 0.18668 43.373 < 2e-16 ***
Rs -6.93437 0.18668 -37.146 < 2e-16 ***
Ts -3.87812 0.18668 -20.774 1.75e-15 ***
Cs:Ps -4.69688 0.18668 -25.160 < 2e-16 ***
Cs:Rs 0.57187 0.18668 3.063 0.0059 **
Cs:Ts 0.24062 0.18668 1.289 0.2114
Ps:Rs -0.14688 0.18668 -0.787 0.4402
Ps:Ts -0.07813 0.18668 -0.418 0.6798
Rs:Ts 0.01562 0.18668 0.084 0.9341
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.056 on 21 degrees of freedom
Multiple R-squared: 0.997, Adjusted R-squared: 0.9955
F-statistic: 688.1 on 10 and 21 DF, p-value: < 2.2e-16
summary(modPFC2)
Call:
lm.default(formula = Rendement ~ Cs + Ps + Rs + Ts + Cs:Ps +
Cs:Rs, data = vaccinPFC)
Residuals:
Min 1Q Median 3Q Max
-1.8656 -0.5531 -0.1031 0.5016 1.9094
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 70.0344 0.1808 387.252 < 2e-16 ***
Cs 9.4156 0.1808 52.063 < 2e-16 ***
Ps 8.0969 0.1808 44.771 < 2e-16 ***
Rs -6.9344 0.1808 -38.343 < 2e-16 ***
Ts -3.8781 0.1808 -21.444 < 2e-16 ***
Cs:Ps -4.6969 0.1808 -25.971 < 2e-16 ***
Cs:Rs 0.5719 0.1808 3.162 0.00408 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.023 on 25 degrees of freedom
Multiple R-squared: 0.9966, Adjusted R-squared: 0.9958
F-statistic: 1222 on 6 and 25 DF, p-value: < 2.2e-16
Les coefficients n’ont pas changés puisque les termes que nous avions enlevés n’étaient pas significatifs.
Le \(R^2\) a légèrement diminué du à la suppression des facteurs non significatifs, mais qui expliquaient quand même une partie de la variabilité. Par contre le \(R^2_{ajusté}\) a légèrement augmenté, ce qui montre bien que supprimer les termes du modèle était pertinent puisque ceux-ci n’expliquaient pas beaucoup de la variabilité du modèle.
#Check orthogonality
<- model.matrix(modPFC)
X t(X)%*%X
(Intercept) Cs Ps Rs Ts Cs:Ps Cs:Rs Cs:Ts Ps:Rs Ps:Ts Rs:Ts
(Intercept) 32 0 0 0 0 0 0 0 0 0 0
Cs 0 32 0 0 0 0 0 0 0 0 0
Ps 0 0 32 0 0 0 0 0 0 0 0
Rs 0 0 0 32 0 0 0 0 0 0 0
Ts 0 0 0 0 32 0 0 0 0 0 0
Cs:Ps 0 0 0 0 0 32 0 0 0 0 0
Cs:Rs 0 0 0 0 0 0 32 0 0 0 0
Cs:Ts 0 0 0 0 0 0 0 32 0 0 0
Ps:Rs 0 0 0 0 0 0 0 0 32 0 0
Ps:Ts 0 0 0 0 0 0 0 0 0 32 0
Rs:Ts 0 0 0 0 0 0 0 0 0 0 32
Le plan est bien orthogonal.
Un Plan Factoriel Fractionnaire (\(2^{k-r}\)) est un plan résultant de r fractionnements successifs d’un plan factoriel complet \(2^k\) à partir de r générateurs. Ce type de plan permet de réduire le nombre d’essais de manière importante tout en gardant un plan de qualité. Ce plan ne permettra par contre pas d’estimer des modèles d’ordre aussi élevé que les plans factoriels complets. Certains termes du modèle complet seront confondus entre eux. Le choix des générateurs est donc directement lié à la complexité du modèle qui sera estimable.
Le code ci-dessous permet de générer un plan factoriel frationnaire. Testez le puis répondez aux questions qui suivent.
=FrF2(8,4,randomize=FALSE)
Designdesign.info(Design)
$type
[1] "FrF2"
$nruns
[1] 8
$nfactors
[1] 4
$factor.names
$factor.names$A
[1] -1 1
$factor.names$B
[1] -1 1
$factor.names$C
[1] -1 1
$factor.names$D
[1] -1 1
$catlg.name
[1] "catlg"
$catlg.entry
Design: 4-1.1
8 runs, 4 factors,
Resolution IV
Generating columns: 7
WLP (3plus): 0 1 0 0 0 , 0 clear 2fis
$aliased
$aliased$legend
[1] "A=A" "B=B" "C=C" "D=D"
$aliased$main
character(0)
$aliased$fi2
[1] "AB=CD" "AC=BD" "AD=BC"
$FrF2.version
[1] "2.2-3"
$replications
[1] 1
$repeat.only
[1] FALSE
$randomize
[1] FALSE
$seed
NULL
$creator
FrF2(8, 4, randomize = FALSE)
generators(Design)
$generators
[1] "D=ABC"
aliasprint(Design)
$legend
[1] A=A B=B C=C D=D
$main
character(0)
$fi2
[1] AB=CD AC=BD AD=BC
=as.data.frame(desnum(Design))
DM DM
A B C D
1 -1 -1 -1 -1
2 1 -1 -1 1
3 -1 1 -1 1
4 1 1 -1 -1
5 -1 -1 1 1
6 1 -1 1 -1
7 -1 1 1 -1
8 1 1 1 1
Il s’agit d’un Plan Factoriel Fractionaire avec 1 générateur et sans réplications :\(2^{4-1} = 8\). Le générateur utilisé est D=ABC. Ce plan permet d’estimer tous les effets d’ordre 1 sans qu’ils soient confondus avec d’autres effets d’ordre 1 ou 2. Par contre, les effets d’ordre 2 sont tous confondus entre eux. Les effets d’ordre 1 sont eux confondus avec des effets d’ordre 3 : D=ABC, A=BCD, B=ACD, D=ABC.
Exemple : Si nous souhaitons estimer A:B, l’estimation sera confondue avec celle de C:D. Cela n’est pas grave si l’effet de A:B est non nul et celui de C:D ne l’est pas. Par contre si les deux effets sont non nuls, l’estimation d’A:B sera faussée car elle comprendra également l’effet de C:D.
voici un code utile qui permet de trouver tous les alias :
=data.frame(y=1,desnum(Design))
alldataaliases(lm(y~(.)^3,data=alldata))
A = B:C:D
B = A:C:D
C = A:B:D
D = A:B:C
A:B = C:D
A:C = B:D
A:D = B:C
#Representation des confusions entre les termes d'ordre 2 et ceux d'ordre 1
corrPlot(Design, scale = "corr")
kmax was reduced to number of factors
Le chargement a nécessité le package : RColorBrewer
Sur base de votre réponse à la question précédante, quelle est la résolution du plan ?
Il s’agit d’un plan de résolution IV car il permet d’estimer les effets d’ordre 1 et uniquement certains effets d’ordre 2 car ils sont confondus entre eux. La longueur du générateur indique aussi la résolution. On peut en effet réécrire le générateur comme suite ABCD=1.
# Check des matrices X'X
# Modèle d'ordre 1
=model.matrix(~A+B+C+D,DM)
X1t(X1)%*%X1
(Intercept) A B C D
(Intercept) 8 0 0 0 0
A 0 8 0 0 0
B 0 0 8 0 0
C 0 0 0 8 0
D 0 0 0 0 8
# Modèle d'ordre 2
=model.matrix(~A+B+C+D+A:B+A:C+A:D+B:C+B:D+C:D,DM)
X2 X2
(Intercept) A B C D A:B A:C A:D B:C B:D C:D
1 1 -1 -1 -1 -1 1 1 1 1 1 1
2 1 1 -1 -1 1 -1 -1 1 1 -1 -1
3 1 -1 1 -1 1 -1 1 -1 -1 1 -1
4 1 1 1 -1 -1 1 -1 -1 -1 -1 1
5 1 -1 -1 1 1 1 -1 -1 -1 -1 1
6 1 1 -1 1 -1 -1 1 -1 -1 1 -1
7 1 -1 1 1 -1 -1 -1 1 1 -1 -1
8 1 1 1 1 1 1 1 1 1 1 1
attr(,"assign")
[1] 0 1 2 3 4 5 6 7 8 9 10
t(X2)%*%X2
(Intercept) A B C D A:B A:C A:D B:C B:D C:D
(Intercept) 8 0 0 0 0 0 0 0 0 0 0
A 0 8 0 0 0 0 0 0 0 0 0
B 0 0 8 0 0 0 0 0 0 0 0
C 0 0 0 8 0 0 0 0 0 0 0
D 0 0 0 0 8 0 0 0 0 0 0
A:B 0 0 0 0 0 8 0 0 0 0 8
A:C 0 0 0 0 0 0 8 0 0 8 0
A:D 0 0 0 0 0 0 0 8 8 0 0
B:C 0 0 0 0 0 0 0 8 8 0 0
B:D 0 0 0 0 0 0 8 0 0 8 0
C:D 0 0 0 0 0 8 0 0 0 0 8
Ce plan est bien orthogonal pour l’estimation d’un modèle d’ordre 1 car la matrice X1’X1 est diagonale. Ce n’est par contre pas le cas pour un modèle d’ordre 2. On voit que des effets sont confondus entre eux (les colonnes correspondantes sont identiques dans la matrice du modèle) et la matrice X2’X2 ne sera pas inversible et donc les paramètres pas estimables.
Etudiez et exécutez le code ci-dessous, puis répondez aux questions qui suivent.
=FrF2(8,4,generators = c("AB")) #specification du generateur a utiliser
Design=as.data.frame(desnum(Design))
DM DM
A B C D
1 1 1 1 1
2 1 1 -1 1
3 -1 -1 1 1
4 -1 1 -1 -1
5 -1 1 1 -1
6 -1 -1 -1 1
7 1 -1 -1 -1
8 1 -1 1 -1
#reponse:
design.info(Design)
$type
[1] "FrF2.generators"
$nruns
[1] 8
$nfactors
[1] 4
$factor.names
$factor.names$A
[1] -1 1
$factor.names$B
[1] -1 1
$factor.names$C
[1] -1 1
$factor.names$D
[1] -1 1
$generators
[1] "D=AB"
$aliased
$aliased$legend
[1] "A=A" "B=B" "C=C" "D=D"
$aliased$main
[1] "A=BD" "B=AD" "D=AB"
$aliased$fi2
character(0)
$FrF2.version
[1] "2.2-3"
$replications
[1] 1
$repeat.only
[1] FALSE
$randomize
[1] TRUE
$seed
NULL
$creator
FrF2(8, 4, generators = c("AB"))
aliasprint(Design)
$legend
[1] A=A B=B C=C D=D
$main
[1] A=BD B=AD D=AB
$fi2
character(0)
generators(Design)
$generators
[1] "D=AB"
=model.matrix(~A+B+C+D+A:B+A:C+A:D+B:C+B:D+C:D,Design)
Xt(X)%*%X
(Intercept) A1 B1 C1 D1 A1:B1 A1:C1 A1:D1 B1:C1 B1:D1 C1:D1
(Intercept) 8 0 0 0 0 0 0 0 0 0 0
A1 0 8 0 0 0 0 0 0 0 8 0
B1 0 0 8 0 0 0 0 8 0 0 0
C1 0 0 0 8 0 0 0 0 0 0 0
D1 0 0 0 0 8 8 0 0 0 0 0
A1:B1 0 0 0 0 8 8 0 0 0 0 0
A1:C1 0 0 0 0 0 0 8 0 0 0 0
A1:D1 0 0 8 0 0 0 0 8 0 0 0
B1:C1 0 0 0 0 0 0 0 0 8 0 0
B1:D1 0 8 0 0 0 0 0 0 0 8 0
C1:D1 0 0 0 0 0 0 0 0 0 0 8
#Representation des confusions entre les termes d'ordre 2 et ceux d'ordre 1
corrPlot(Design, scale = "corr")
kmax was reduced to number of factors
Ce Plan Factoriel Fractionaire n’utilise pas le même générateur. Le générateur utilisé (D=AB) est moins performant puisqu’avec celui-ci des effets d’ordre 1 sont confondus avec des effets d’ordre 2. Sa résolution est donc de III puiqu’il permet d’estimer uniquement un modèle d’ordre 1 et aucune interaction.
Voici un code pour générer encore un plan factoriel frationnaire. Il y a ici 5 facteurs et on fractionne deux fois le plan \(2^5\). L’objectif que l’on poursuit est de trouver un plan qui permette d’estimer le modèle suivant : \[ Y = \beta_0 + \beta_1 A + \beta_2 B + \beta_3 C + \beta_4 D + \beta_5 E + \beta_6 A:B + \beta_7 A:C + \epsilon \] Etudiez le plan généré :
=FrF2(8, nfactors=5)
Design=as.data.frame(desnum(Design))
MD MD
A B C D E
1 -1 -1 1 1 -1
2 1 1 -1 1 -1
3 -1 1 1 -1 -1
4 1 -1 1 -1 1
5 -1 -1 -1 1 1
6 1 1 1 1 1
7 1 -1 -1 -1 -1
8 -1 1 -1 -1 1
# Reponse
generators(Design)
$generators
[1] "D=AB" "E=AC"
=design.info(Design)
di$catlg.entry di
Design: 5-2.1
8 runs, 5 factors,
Resolution III
Generating columns: 3 5
WLP (3plus): 2 1 0 0 0 , 0 clear 2fis
=data.frame(y=1,desnum(Design))
alldataaliases(lm(y~(.)^3,data=alldata))
A = C:E = B:D
B = C:D:E = A:D
C = B:D:E = A:E
D = B:C:E = A:B
E = B:C:D = A:C
B:C = D:E = A:B:E = A:C:D
B:E = C:D = A:B:C = A:D:E
#Representation des confusions entre les termes d'ordre 2 et ceux d'ordre 1
corrPlot(Design, scale = "corr")
Non, ce modèle utilise les générateurs : D=AB et E=AC. L’effet de l’interaction A:B sera donc confondu avec l’effet de D.
Voici un code qui permet d’imposer à R de pouvoir estimer un modèle partiel donné.
=FrF2(8, nfactors=5, estimable = formula("~A+B+C+D+E+A:B+A:C"),clear=FALSE, res3=TRUE)
Design=as.data.frame(desnum(Design))
XM XM
A B C D E
1 -1 1 -1 -1 1
2 1 -1 -1 1 1
3 -1 -1 1 -1 1
4 -1 1 1 1 -1
5 -1 -1 -1 1 -1
6 1 -1 1 -1 -1
7 1 1 -1 -1 -1
8 1 1 1 1 1
# Reponse
generators(Design)
$generators
[1] "C=DB" "E=DA"
=data.frame(y=1,desnum(Design))
alldataaliases(lm(y~(.)^3,data=alldata))
A = D:E = B:C:E
B = C:D = A:C:E
C = B:D = A:B:E
D = A:E = B:C
E = A:D = A:B:C
A:B = C:E = A:C:D = B:D:E
A:C = B:E = A:B:D = C:D:E
=model.matrix(~A+B+C+D+A:B+A:C,Design)
Xt(X)%*%X
(Intercept) A1 B1 C1 D1 A1:B1 A1:C1
(Intercept) 8 0 0 0 0 0 0
A1 0 8 0 0 0 0 0
B1 0 0 8 0 0 0 0
C1 0 0 0 8 0 0 0
D1 0 0 0 0 8 0 0
A1:B1 0 0 0 0 0 8 0
A1:C1 0 0 0 0 0 0 8
#Representation des confusions entre les termes d'ordre 2 et ceux d'ordre 1
corrPlot(Design, scale = "corr")
Celui-ci le permet car il utilise deux autres générateurs : C=BD et E=DA. Les effets des interactions A:B et C:D ne sont donc pas confondus avec des effets d’ordre 1.
Ces analyses seront sur le même exemple que celui du PFC.
Pour le même problème que pour le PFC, on a réalisé un plan beaucoup moins coûteux :
L’objectif ici est de vérifier si on parvient à obtenir autant d’information qu’avec le plan à 32 essais.
Téléchargez à présent les données du fichier Excel
TP7_PFF.xlsx
.
<- read_excel("TP7_PFF.xlsx")
vaccinPFF pander(vaccinPFF)
Cs | Ps | Rs | Ts | Rendement |
---|---|---|---|---|
-1 | -1 | -1 | -1 | 58.5 |
-1 | -1 | 1 | 1 | 36.65 |
-1 | 1 | -1 | 1 | 75.25 |
-1 | 1 | 1 | -1 | 71 |
1 | -1 | -1 | 1 | 78.75 |
1 | -1 | 1 | -1 | 73 |
1 | 1 | -1 | -1 | 93.5 |
1 | 1 | 1 | 1 | 73.5 |
Estimez un modèle lm
d’ordre 2 (toutes les interactions
2 à 2) et visualisez le résumé du modèle.
<- lm(Rendement ~ Cs+Ps+Rs+Ts+Cs:Ps+Cs:Rs+Cs:Ts+Ps:Rs+Ps:Ts+Rs:Ts, data = vaccinPFF)
modPFF summary(modPFF)
Call:
lm.default(formula = Rendement ~ Cs + Ps + Rs + Ts + Cs:Ps +
Cs:Rs + Cs:Ts + Ps:Rs + Ps:Ts + Rs:Ts, data = vaccinPFF)
Residuals:
ALL 8 residuals are 0: no residual degrees of freedom!
Coefficients: (3 not defined because of singularities)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 70.01875 NaN NaN NaN
Cs 9.66875 NaN NaN NaN
Ps 8.29375 NaN NaN NaN
Rs -6.48125 NaN NaN NaN
Ts -3.98125 NaN NaN NaN
Cs:Ps -4.48125 NaN NaN NaN
Cs:Rs 0.04375 NaN NaN NaN
Cs:Ts 0.41875 NaN NaN NaN
Ps:Rs NA NA NA NA
Ps:Ts NA NA NA NA
Rs:Ts NA NA NA NA
Residual standard error: NaN on 0 degrees of freedom
Multiple R-squared: 1, Adjusted R-squared: NaN
F-statistic: NaN on 7 and 0 DF, p-value: NA
aliases(modPFF)
Cs:Ps = Rs:Ts
Cs:Rs = Ps:Ts
Cs:Ts = Ps:Rs
=model.matrix(modPFF)
Xt(X)%*%X
(Intercept) Cs Ps Rs Ts Cs:Ps Cs:Rs Cs:Ts Ps:Rs Ps:Ts Rs:Ts
(Intercept) 8 0 0 0 0 0 0 0 0 0 0
Cs 0 8 0 0 0 0 0 0 0 0 0
Ps 0 0 8 0 0 0 0 0 0 0 0
Rs 0 0 0 8 0 0 0 0 0 0 0
Ts 0 0 0 0 8 0 0 0 0 0 0
Cs:Ps 0 0 0 0 0 8 0 0 0 0 8
Cs:Rs 0 0 0 0 0 0 8 0 0 8 0
Cs:Ts 0 0 0 0 0 0 0 8 8 0 0
Ps:Rs 0 0 0 0 0 0 0 8 8 0 0
Ps:Ts 0 0 0 0 0 0 8 0 0 8 0
Rs:Ts 0 0 0 0 0 8 0 0 0 0 8
#Representation des confusions entre les termes d'ordre 2 et ceux d'ordre 1
<- data2design(X[,2:5])
Design corrPlot(Design, scale = "corr")
kmax was reduced to number of factors
Car il n’est pas possible d’estimer tous les termes du modèle demandé. Effectivement, il s’agit d’un plan factoriel fractionaire avec seulement 8 essais. Cela ne permet pas d’estimer les termes d’interactions demandés.
Essayez maintenant d’estimer le modèle simplifié, en gardant uniquement les termes principaux et l’interaction la plus significative identifiée pour le plan complet.
<- lm(Rendement ~ Cs+Ps+Rs+Ts+Cs:Ps+Cs:Rs, data = vaccinPFF)
modPFF summary(modPFF)
Call:
lm.default(formula = Rendement ~ Cs + Ps + Rs + Ts + Cs:Ps +
Cs:Rs, data = vaccinPFF)
Residuals:
1 2 3 4 5 6 7 8
0.4187 -0.4187 -0.4187 0.4187 0.4187 -0.4187 -0.4187 0.4187
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 70.01875 0.41875 167.209 0.00381 **
Cs 9.66875 0.41875 23.090 0.02755 *
Ps 8.29375 0.41875 19.806 0.03212 *
Rs -6.48125 0.41875 -15.478 0.04107 *
Ts -3.98125 0.41875 -9.507 0.06671 .
Cs:Ps -4.48125 0.41875 -10.701 0.05932 .
Cs:Rs 0.04375 0.41875 0.104 0.93373
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.184 on 1 degrees of freedom
Multiple R-squared: 0.9993, Adjusted R-squared: 0.9949
F-statistic: 228.3 on 6 and 1 DF, p-value: 0.05062
summary(modPFC2)
Call:
lm.default(formula = Rendement ~ Cs + Ps + Rs + Ts + Cs:Ps +
Cs:Rs, data = vaccinPFC)
Residuals:
Min 1Q Median 3Q Max
-1.8656 -0.5531 -0.1031 0.5016 1.9094
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 70.0344 0.1808 387.252 < 2e-16 ***
Cs 9.4156 0.1808 52.063 < 2e-16 ***
Ps 8.0969 0.1808 44.771 < 2e-16 ***
Rs -6.9344 0.1808 -38.343 < 2e-16 ***
Ts -3.8781 0.1808 -21.444 < 2e-16 ***
Cs:Ps -4.6969 0.1808 -25.971 < 2e-16 ***
Cs:Rs 0.5719 0.1808 3.162 0.00408 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.023 on 25 degrees of freedom
Multiple R-squared: 0.9966, Adjusted R-squared: 0.9958
F-statistic: 1222 on 6 and 25 DF, p-value: < 2.2e-16
MEPlot(modPFF)
MEPlot(modPFC2)
<- summary(modPFF)$coefficients[2,1] term2