Planejamento de Experimentos - Anova One Way

Author

Paulo Manoel da Silva Junior

Planejamento de Experimentos

Conforme o aprendido em sala de aula, o objetivo é utilizar uma problemática e colocá-la em prática. Utilizaremos um hipótetico problema retirado do Livro sobre planejamento de Experimentos do Montgomery. Segue a descrição da problemática abaixo.

Problemática definida

  • Um desenvolvedor de produto está investigando a resistência à tração de uma nova fibra sintética que será usada para fazer tecidos para camisas masculinas. A força é geralmente afetada pela porcentagem de algodão utilizado na mistura de materiais para a fibra. O engenheiro conduz um experimento completamente aleatório com cinco níveis de conteúdo de algodão e replica o experimento cinco vezes. Os dados são mostrados na tabela a seguir.

Vemos que se encaixa em um modelo de fixo

Cotton Weight Percent Observations
15 7 7 15 11 9
20 12 17 12 18 18
25 14 19 19 18 18
30 19 25 22 19 23
35 7 10 11 15 11
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 561493 30.0    1282138 68.5   644254 34.5
Vcells 992773  7.6    8388608 64.0  1635074 12.5
setwd("C:/Users/Pessoal/Desktop/ESTATÍSTICA/UFPB/8º PERÍODO/PLANEJAMENTO DE EXPERIMENTOS I/AULA - ANOVA ONEWAY/EXERCÍCIO")

Carregando o banco de dados, que foi salvo em csv.

dados <- read.csv2("dados.csv", header = T, col.names = c("Percentual", "Observação"))

Vamos observar os dados, para o conhecimento de todos

knitr::kable(dados)
Percentual Observação
15 7
15 7
15 15
15 11
15 9
20 12
20 17
20 12
20 18
20 19
25 14
25 19
25 19
25 18
25 18
30 19
30 25
30 22
30 19
30 23
35 7
35 10
35 11
35 15
35 11
skimr::skim(dados)
Data summary
Name dados
Number of rows 25
Number of columns 2
_______________________
Column type frequency:
numeric 2
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Percentual 0 1 25.00 7.22 15 20 25 30 35 ▇▇▇▇▇
Observação 0 1 15.08 5.18 7 11 15 19 25 ▅▆▃▇▃

Verificando se há diferença entre os grupos e ajustando um modelo de regressão

Vamos verificar se existe diferença entre os grupos e logo em seguida ajustar um modelo de regressão e verificar qual ajuste se é o melhor na problemática, se de fato houver diferença devido ao percentual de algodão.

attach(dados)
ExpDes::crd(Percentual, Observação, quali = F, 
            mcomp = "tukey", nl = FALSE, hvar = "levene", 
            sigT = 0.05, sigF = 0.05)
------------------------------------------------------------------------
Analysis of Variance Table
------------------------------------------------------------------------
           DF     SS     MS     Fc      Pr>Fc
Treatament  4 476.64 119.16 14.254 1.1722e-05
Residuals  20 167.20   8.36                  
Total      24 643.84                         
------------------------------------------------------------------------
CV = 19.17 %

------------------------------------------------------------------------
Shapiro-Wilk normality test
p-value:  0.1444829 
According to Shapiro-Wilk normality test at 5% of significance, residuals can be considered normal.
------------------------------------------------------------------------

------------------------------------------------------------------------
Homogeneity of variances test
p-value:  0.5749962 
According to the test of levene at 5% of significance, residuals can be considered homocedastic.
------------------------------------------------------------------------

Adjustment of polynomial models of regression
------------------------------------------------------------------------

Linear Model
=========================================
   Estimate Standard.Error   tc   p.value
-----------------------------------------
b0 11.0800      2.1247     5.2148 0.00004
b1  0.1600      0.0818     1.9565 0.0645 
-----------------------------------------

R2 of linear model
--------
0.067137
--------

Analysis of Variance of linear model
================================================
              DF    SS       MS     Fc   p.value
------------------------------------------------
Linear Effect 1     32       32    3.83  0.06452
Lack of fit   3  444.6400 148.2133 17.73  1e-05 
Residuals     20 167.2000  8.3600               
------------------------------------------------
------------------------------------------------------------------------

Quadratic Model
==========================================
   Estimate Standard.Error   tc    p.value
------------------------------------------
b0 -40.1771     8.2275     -4.8833 0.0001 
b1  4.6171      0.6960     6.6339     0   
b2 -0.0891      0.0138     -6.4487    0   
------------------------------------------

R2 of quadratic model
--------
0.796528
--------

Analysis of Variance of quadratic model
===================================================
                 DF    SS       MS     Fc   p.value
---------------------------------------------------
Linear Effect    1     32       32    3.83  0.06452
Quadratic Effect 1  347.6571 347.6571 41.59    0   
Lack of fit      2  96.9829  48.4914   5.8  0.01031
Residuals        20 167.2000  8.3600               
---------------------------------------------------
------------------------------------------------------------------------

Cubic Model
==========================================
   Estimate Standard.Error   tc    p.value
------------------------------------------
b0 58.8229     37.7096     1.5599  0.1345 
b1 -8.5095      4.9289     -1.7264 0.0997 
b2  0.4609      0.2049     2.2490  0.0359 
b3 -0.0073      0.0027     -2.6901 0.0141 
------------------------------------------

R2 of cubic model
--------
0.923458
--------

Analysis of Variance of cubic model
===================================================
                 DF    SS       MS     Fc   p.value
---------------------------------------------------
Linear Effect    1     32       32    3.83  0.06452
Quadratic Effect 1  347.6571 347.6571 41.59    0   
Cubic Effect     1  60.5000  60.5000  7.24  0.01408
Lack of fit      1  36.4829  36.4829  4.36  0.0497 
Residuals        20 167.2000  8.3600               
---------------------------------------------------
------------------------------------------------------------------------

De acordo com os resultados, tomamos as seguintes conclusões: sim, existe efeito devido ao percentual de algodão na camisa, pois conforme é emitido do teste, no qual o p-valor foi de \(1.1722 \times 10^{-5}\), implicando assim na rejeição da hipótese nula que diz que não existe diferença devido ao percentual de algodão. Obtivemos também que o melhor ajuste para um modelo de regressão seria o ajuste cúbico, mesmo assim não é significante a ponto de ser utilizado, tendo também um coeficiente de determinação alto no modelo cúbico.

Continuemos na análise da problemática, sabendo que existe diferença significativa entre os percentuais de algodão.

Estimação do intervalo de confiança dos grupos

knitr::kable(rcompanion::groupwiseMean(Observação~Percentual, 
                          data = dados, conf = 0.95, traditional = T, 
                          digits = 4))
Percentual n Mean Conf.level Trad.lower Trad.upper
15 5 9.8 0.95 5.645 13.96
20 5 15.6 0.95 11.430 19.77
25 5 17.6 0.95 15.030 20.17
30 5 21.6 0.95 18.360 24.84
35 5 10.8 0.95 7.244 14.36

Vemos com base nesses resultados que alguns grupos são iguais entre si, mas não todos os grupos.

Verificando as suposições do modelo

Vamos verificar algumas suposições do modelo que foi ajustado, verificando que existe efeito devido ao tratamento.

anova <- aov(Observação~factor(Percentual), data = dados)
summary(anova)
                   Df Sum Sq Mean Sq F value   Pr(>F)    
factor(Percentual)  4  476.6  119.16   14.25 1.17e-05 ***
Residuals          20  167.2    8.36                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Mais uma vez, como já foi observado mais acima, o resultado é que tem diferença significativa devido ao percentual de algodão, o resultado do p-valor foi de \(1.17 \times 10^{-5}\). Rejeitamos \(H_0\), ou seja, existe evidências estatísticas de que o percentual de algodão na camisa faz a diferença na força.

Percentual <- as.factor(Percentual)
ggplot2::ggplot(dados, ggplot2::aes(y = Observação, x = factor(Percentual), fill = factor(Percentual)), legend.tile = "Percentual") + ggplot2::scale_fill_brewer(palette="Dark2") +
  ggplot2::geom_boxplot(outlier.colour = "red", notch = F)+
  ggplot2::ggtitle("Boxplot da força de acordo com o percentual de algodão")+
  ggplot2::xlab("Percentual") + ggplot2::ylab("Observação")+
  ggplot2::theme_minimal() + ggplot2::labs(fill = "Percentual")

Faremos a padronização dos resíduos para continuar com a verificação das suposições do modelo.

res <- anova$residuals
SSE <- sum(res^2)
MSE <- SSE/anova$df.residual
resid.padronizado <- res/sqrt(MSE)
resid.padronizado
          1           2           3           4           5           6 
-0.96840025 -0.96840025  1.79845761  0.41502868 -0.27668579 -1.24508603 
          7           8           9          10          11          12 
 0.48420012 -1.24508603  0.83005736  1.17591459 -1.24508603  0.48420012 
         13          14          15          16          17          18 
 0.48420012  0.13834289  0.13834289 -0.89922880  1.17591459  0.13834289 
         19          20          21          22          23          24 
-0.89922880  0.48420012 -1.31425748 -0.27668579  0.06917145  1.45260037 
         25 
 0.06917145 

Esses são os resíduos padronizados.

Através do teste de dixon, testa-se a hipótese de outliers com base nos resíduos padronizados.

outliers::dixon.test(res)

    Dixon test for outliers

data:  res
Q.3 = 0.20455, p-value = 0.9427
alternative hypothesis: highest value 5.2 is an outlier

Conforme o resultado do teste, no qual o p-valor foi de 0.9427, maior do que o meu nível de significância fixado, sendo assim, é conclui-se que não temos outliers.

Teste de Normalidade

Utilizaremos o teste de Shapiro - Wilk para verificar se os resíduos são distribuidos normalmente.

shapiro.test(res)

    Shapiro-Wilk normality test

data:  res
W = 0.93954, p-value = 0.1445

De acordo com o resultado do teste, obtivemos um p-valor de 0.144, e como é maior do que é o nível de significância adotado, concluimos que os resíduos estão distribuidos normalmente.

Teste de Homogeneidade de Variâncias

  • Teste de Levene, um teste que é bastante utilizado quando não se tem normalidade.
lawstat::levene.test(Observação, Percentual)

    Modified robust Brown-Forsythe Levene-type test based on the absolute
    deviations from the median

data:  Observação
Test Statistic = 0.39474, p-value = 0.81
  • Teste de Fligner
fligner.test(Observação~Percentual, data = dados)

    Fligner-Killeen test of homogeneity of variances

data:  Observação by Percentual
Fligner-Killeen:med chi-squared = 1.963, df = 4, p-value = 0.7426
bartlett.test(Observação,Percentual)

    Bartlett test of homogeneity of variances

data:  Observação and Percentual
Bartlett's K-squared = 1.0797, df = 4, p-value = 0.8975

Como observamos através do resultado do p-valor, que foi respectivamente: 0.81,0.74 e 0.897. Então, concluímos que a homogeneidade das variâncias é aceita.

Teste Robusto para a anova oneway

Utlizado supondo a heterocedasticidade dos dados

Teste de Welch

Esperamos que se o p-valor for menor do que \(\alpha\), significa que há efeito devido ao percentual.

onewaytests::welch.test(Observação~Percentual, data = dados)

  Welch's Heteroscedastic F Test (alpha = 0.05) 
------------------------------------------------------------- 
  data : Observação and Percentual 

  statistic  : 12.42802 
  num df     : 4 
  denom df   : 9.905549 
  p.value    : 0.0007070279 

  Result     : Difference is statistically significant. 
------------------------------------------------------------- 

De acordo com o p-valor, que foi de 7.1^{-4}. Sendo assim, concluimos então que existe efeito significativo devido ao percentual.

Teste de Bryan Forsythe

Esperamos que se o p-valor for menor do que \(\alpha\), significa que há efeito devido ao percentual.

onewaytests::bf.test(Observação~factor(Percentual), data = dados)

  Brown-Forsythe Test (alpha = 0.05) 
------------------------------------------------------------- 
  data : Observação and factor(Percentual) 

  statistic  : 14.25359 
  num df     : 4 
  denom df   : 18.14843 
  p.value    : 1.978908e-05 

  Result     : Difference is statistically significant. 
------------------------------------------------------------- 

Estes testes são utilizados quando se tem a violação da homocedasticidade, ou seja, quando as variâncias dos grupos não são iguais.

De acordo com o p-valor, que foi de 1.979^{-5}. Sendo assim, concluimos então que existe efeito significativo devido ao percentual.

Depois, de observarmos que tem diferença significativa devido ao percentual de algodão na força da camisa, vamos observar agora quais são os grupos diferentes e os iguais através de comparações múltiplas.

Comparações Múltiplas

Supondo heterocedasticidade utilizaremos comparações múltiplas através do teste de Welch.

knitr::kable(onewaytests::paircomp(onewaytests::welch.test(Observação~Percentual, data = dados)))

  Welch's Heteroscedastic F Test (alpha = 0.05) 
------------------------------------------------------------- 
  data : Observação and Percentual 

  statistic  : 12.42802 
  num df     : 4 
  denom df   : 9.905549 
  p.value    : 0.0007070279 

  Result     : Difference is statistically significant. 
------------------------------------------------------------- 

  Bonferroni Correction (alpha = 0.05) 
----------------------------------------------------- 
   Level (a) Level (b)     p.value   No difference
1         15        20 0.256810809      Not reject
2         15        25 0.034148385          Reject
3         15        30 0.003223292          Reject
4         15        35 1.000000000      Not reject
5         20        25 1.000000000      Not reject
6         20        30 0.146065454      Not reject
7         20        35 0.419052058      Not reject
8         25        30 0.289912826      Not reject
9         25        35 0.032427474          Reject
10        30        35 0.002587586          Reject
----------------------------------------------------- 
Level (a) Level (b) p.value No difference
15 20 0.2568108 Not reject
15 25 0.0341484 Reject
15 30 0.0032233 Reject
15 35 1.0000000 Not reject
20 25 1.0000000 Not reject
20 30 0.1460655 Not reject
20 35 0.4190521 Not reject
25 30 0.2899128 Not reject
25 35 0.0324275 Reject
30 35 0.0025876 Reject

O teste de Welch é utilizado quando existe heterocedasticidade, o teste de Welch, para comparações múltiplas permitem que façamos comparações entre os grupos para saber se existe diferença ou não.

Teste de Tukey

TukeyHSD(aov(Observação~factor(Percentual), data = dados))
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Observação ~ factor(Percentual), data = dados)

$`factor(Percentual)`
       diff         lwr        upr     p adj
20-15   5.8   0.3279622 11.2720378 0.0344652
25-15   7.8   2.3279622 13.2720378 0.0030995
30-15  11.8   6.3279622 17.2720378 0.0000244
35-15   1.0  -4.4720378  6.4720378 0.9810840
25-20   2.0  -3.4720378  7.4720378 0.8076796
30-20   6.0   0.5279622 11.4720378 0.0273435
35-20  -4.8 -10.2720378  0.6720378 0.1033135
30-25   4.0  -1.4720378  9.4720378 0.2246058
35-25  -6.8 -12.2720378 -1.3279622 0.0105536
35-30 -10.8 -16.2720378 -5.3279622 0.0000791

Obtivemos que, o grupo do percentual 15 é igual ao grupo 35. O grupo 20 é igual ao 25 e 35. O grupo 25 é igual ao 30. São estes que são iguais entre sim, os outros pares e combinações são diferentes.

out <- agricolae::HSD.test(anova, "factor(Percentual)")
out
$statistics
  MSerror Df  Mean       CV      MSD
     8.36 20 15.08 19.17352 5.472038

$parameters
   test             name.t ntr StudentizedRange alpha
  Tukey factor(Percentual)   5         4.231857  0.05

$means
   Observação      std r Min Max Q25 Q50 Q75
15        9.8 3.346640 5   7  15   7   9  11
20       15.6 3.361547 5  12  19  12  17  18
25       17.6 2.073644 5  14  19  18  18  19
30       21.6 2.607681 5  19  25  19  22  23
35       10.8 2.863564 5   7  15  10  11  11

$comparison
NULL

$groups
   Observação groups
30       21.6      a
25       17.6     ab
20       15.6     bc
35       10.8     cd
15        9.8      d

attr(,"class")
[1] "group"

De acordo com essa saída podemos ver grupos se formando, por exemplo temos o grupo 25 e 30, o grupo 20 e 25, e o 35 e 15. Conforme os teste já utilizados acima também.

plot(out)

Teste de Fisher

out1 <- agricolae::LSD.test(anova, "factor(Percentual)", p.adj = "bonferroni")
out1
$statistics
  MSerror Df  Mean       CV  t.value    MSD
     8.36 20 15.08 19.17352 3.153401 5.7665

$parameters
        test  p.ajusted             name.t ntr alpha
  Fisher-LSD bonferroni factor(Percentual)   5  0.05

$means
   Observação      std r       LCL      UCL Min Max Q25 Q50 Q75
15        9.8 3.346640 5  7.102727 12.49727   7  15   7   9  11
20       15.6 3.361547 5 12.902727 18.29727  12  19  12  17  18
25       17.6 2.073644 5 14.902727 20.29727  14  19  18  18  19
30       21.6 2.607681 5 18.902727 24.29727  19  25  19  22  23
35       10.8 2.863564 5  8.102727 13.49727   7  15  10  11  11

$comparison
NULL

$groups
   Observação groups
30       21.6      a
25       17.6     ab
20       15.6     bc
35       10.8     cd
15        9.8      d

attr(,"class")
[1] "group"

Teste de Scheffé

out2 <- agricolae::scheffe.test(anova, "factor(Percentual)")
out2
$statistics
  MSerror Df        F  Mean       CV  Scheffe CriticalDifference
     8.36 20 2.866081 15.08 19.17352 3.385901           6.191664

$parameters
     test             name.t ntr alpha
  Scheffe factor(Percentual)   5  0.05

$means
   Observação      std r Min Max Q25 Q50 Q75
15        9.8 3.346640 5   7  15   7   9  11
20       15.6 3.361547 5  12  19  12  17  18
25       17.6 2.073644 5  14  19  18  18  19
30       21.6 2.607681 5  19  25  19  22  23
35       10.8 2.863564 5   7  15  10  11  11

$comparison
NULL

$groups
   Observação groups
30       21.6      a
25       17.6      a
20       15.6     ab
35       10.8      b
15        9.8      b

attr(,"class")
[1] "group"
plot(out2, main = "Comparações entre grupos - Teste de Scheffé")

De acordo com o teste de Scheffer, obtivemos que o percentual 25 é igual a dois grupos que se formaram, o grupo do percentual 25 e 30, e igual ao grupo do percentual 15 e 35.

Para os intervalos de confiança da diferença, temos o seguinte:

DescTools::ScheffeTest(anova)

  Posthoc multiple comparisons of means: Scheffe Test 
    95% family-wise confidence level

$`factor(Percentual)`
       diff      lwr.ci     upr.ci   pval    
20-15   5.8  -0.3916641 11.9916641 0.0739 .  
25-15   7.8   1.6083359 13.9916641 0.0089 ** 
30-15  11.8   5.6083359 17.9916641 0.0001 ***
35-15   1.0  -5.1916641  7.1916641 0.9891    
25-20   2.0  -4.1916641  8.1916641 0.8751    
30-20   6.0  -0.1916641 12.1916641 0.0606 .  
35-20  -4.8 -10.9916641  1.3916641 0.1846    
30-25   4.0  -2.1916641 10.1916641 0.3431    
35-25  -6.8 -12.9916641 -0.6083359 0.0266 *  
35-30 -10.8 -16.9916641 -4.6083359 0.0003 ***

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

O que já foi visto no teste realizado acima e no plot.

Teste de Duncan

out3 <- agricolae::duncan.test(anova, "factor(Percentual)")
out3
$statistics
  MSerror Df  Mean       CV
     8.36 20 15.08 19.17352

$parameters
    test             name.t ntr alpha
  Duncan factor(Percentual)   5  0.05

$duncan
     Table CriticalRange
2 2.949998      3.814519
3 3.096506      4.003964
4 3.189616      4.124360
5 3.254648      4.208450

$means
   Observação      std r Min Max Q25 Q50 Q75
15        9.8 3.346640 5   7  15   7   9  11
20       15.6 3.361547 5  12  19  12  17  18
25       17.6 2.073644 5  14  19  18  18  19
30       21.6 2.607681 5  19  25  19  22  23
35       10.8 2.863564 5   7  15  10  11  11

$comparison
NULL

$groups
   Observação groups
30       21.6      a
25       17.6      b
20       15.6      b
35       10.8      c
15        9.8      c

attr(,"class")
[1] "group"
out4 <- agricolae::SNK.test(anova, "factor(Percentual)")
out4
$statistics
  MSerror Df  Mean       CV
     8.36 20 15.08 19.17352

$parameters
  test             name.t ntr alpha
   SNK factor(Percentual)   5  0.05

$snk
     Table CriticalRange
2 2.949998      3.814519
3 3.577935      4.626478
4 3.958293      5.118305
5 4.231857      5.472038

$means
   Observação      std r Min Max Q25 Q50 Q75
15        9.8 3.346640 5   7  15   7   9  11
20       15.6 3.361547 5  12  19  12  17  18
25       17.6 2.073644 5  14  19  18  18  19
30       21.6 2.607681 5  19  25  19  22  23
35       10.8 2.863564 5   7  15  10  11  11

$comparison
NULL

$groups
   Observação groups
30       21.6      a
25       17.6      b
20       15.6      b
35       10.8      c
15        9.8      c

attr(,"class")
[1] "group"

Teste de Waller

out5 <- agricolae::waller.test(anova, "factor(Percentual)")
out5
$statistics
   Mean Df       CV MSerror  F.Value Waller CriticalDifference
  15.08 20 19.17352    8.36 14.25359  1.949            3.56406

$parameters
           test             name.t ntr   K
  Waller-Duncan factor(Percentual)   5 100

$means
   Observação      std r Min Max Q25 Q50 Q75
15        9.8 3.346640 5   7  15   7   9  11
20       15.6 3.361547 5  12  19  12  17  18
25       17.6 2.073644 5  14  19  18  18  19
30       21.6 2.607681 5  19  25  19  22  23
35       10.8 2.863564 5   7  15  10  11  11

$comparison
NULL

$groups
   Observação groups
30       21.6      a
25       17.6      b
20       15.6      b
35       10.8      c
15        9.8      c

attr(,"class")
[1] "group"

Todos os testes que foram realizados acima, podem ser feitos por causa da aceitação da homocedasticidade.

Teste de Dunnet

Esse teste geralmente se é utilizado quando temos um grupo de controle, e como estamos analisando a resistência a tração da fibra em que será utilizada para ser feita a camisa masculina, obtemos que quanto maior o valor de interesse melhor, já foi observado que o grupo que tem a maior média é o grupo do percentual 30, logo, este valor será o valor de referência utilizado como controle.

DescTools::DunnettTest(Observação, Percentual, control = "30", 
                       conf.level = 0.95)

  Dunnett's test for comparing several treatments with a control :  
    95% family-wise confidence level

$`30`
       diff     lwr.ci    upr.ci    pval    
15-30 -11.8 -16.650493 -6.949507 6.7e-06 ***
20-30  -6.0 -10.850493 -1.149507  0.0130 *  
25-30  -4.0  -8.850493  0.850493  0.1247    
35-30 -10.8 -15.650493 -5.949507 2.3e-05 ***

---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

É observado que como o objetivo é ter uma alta tração a resistência, não existe evidências estatísticas a um nível de significância de 5% para se dizer que os percentuais 30 e 25 são diferentes entre si, sendo preferível o uso destes, para que seja obtido um material de alta qualidade.

Contrastes ortogonais

Como no exemplo que está sendo considerado temos 5 grupos, temos 4 contrastes ortogonais, que serão verificados, que são eles.

\[\begin{cases} & C_1: \mu_{15} = \mu_{20} \\ & C_2: \mu_{25} = \mu_{30} \\ & C_3: \mu_{15} + \mu_{20} = \mu_{25} + \mu_{30} \\ & C_4: \mu_{15} + \mu_{20} + \mu_{25} + \mu_{30} = \mu_{35} \end{cases}\]

Criando os contrastes, depois prosseguindo para saber se são ortogonais.

C1 <- c(1,-1,0,0,0)
C2 <- c(0,0,1,-1,0)
C3 <- c(1,1,-1,-1,0)
C4 <- c(-1,-1,-1,-1,4)
ibd::check.orthogonality(rbind(C1,C2,C3,C4))
[1] 1

Como o resultado do teste, foi observado que os contrastes são ortogonais.

Prosseguindo com a análise dos contrastes ortogonais

Percentual <-factor(Percentual)
c2 = rbind("C1: 15 = 20" = C1,
           "C2: 25 = 30" = C2,
           "C3: 15 + 20 = 25 + 30" = C3,
           "C4: 15 + 20 + 25 + 30 = 35 " = C4)
contraste2  = gmodels::make.contrasts(c2)
Registered S3 method overwritten by 'gdata':
  method         from     
  reorder.factor DescTools
Anovac2 = aov(Observação ~ Percentual,
              contrasts = list(Percentual = contraste2))
summary(Anovac2, split = list(Percentual=list("C1: 15 = 20"=1, "C2: 25 = 30"=2, "C3: 15 + 20 = 25 + 30" =3, "C4: 15 + 20 + 25 + 30 = 35" = 4)))
                                         Df Sum Sq Mean Sq F value   Pr(>F)    
Percentual                                4  476.6  119.16  14.254 1.17e-05 ***
  Percentual: C1: 15 = 20                 1   84.1   84.10  10.060  0.00480 ** 
  Percentual: C2: 25 = 30                 1   40.0   40.00   4.785  0.04076 *  
  Percentual: C3: 15 + 20 = 25 + 30       1  238.1  238.05  28.475 3.19e-05 ***
  Percentual: C4: 15 + 20 + 25 + 30 = 35  1  114.5  114.49  13.695  0.00142 ** 
Residuals                                20  167.2    8.36                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

A um nível de significância de 5 % rejeitamos todos os contrastes, ou seja, nenhum dos teste de contrastes foi aceito.

Conclusão

Com base em tudo o que foi analisado, em todas as suposições que foram checadas e nos ajustes que foram necessários serem realizados, concluimos que existe efeito significativo na força de determinada camisa, devido ao percentual de algodão utilizado. Concluimos também que existe grupos que são iguais entre si e outros que são diferentes, foi observado também que percentuais mais baixos e mais altos tendem a ter um efeito negativo na força, sendo assim preferível os que estão entre esses valores.