7 Manipulação de objeto

7.1 Como remover um ponto no R?

Conjunto de dados: Neste tutorial iremos trabalhar com dados simulados, considerando um experimento inteiramente casualizado com cinco repetições e cinco tratamentos. Abaixo segue os valores da resposta e os tratamentos.

resposta=c(3.1,3.2,3.4,3.8,4,5.0,5.1,5.6,6.2,7,10,10.2,10.7,11,12,6,6.5,6.2,7,6.9,20,5.2,5.6,5.8,6)
Trat=rep(c(paste("T",1:5)),e=5)

Este conjunto de dados apresenta um ponto discrepante das demais repetições de um dos tratamentos. Uma das formas de descobrir este ponto é através de um gráfico de caixas, conforme segue abaixo.


## Utilizando o pacote car
car::Boxplot(resposta~Trat)
## [1] "21"

Inicialmente vamos construir um modelo de análise de variância em DIC sem remover o ponto discrepante e analisar quanto aos pressupostos de normalidade dos erros e homogeneidade das variâncias.

modelo=aov(resposta~Trat)
shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.60825, p-value = 5.291e-07
bartlett.test(modelo$residuals~Trat)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  modelo$residuals by Trat
## Bartlett's K-squared = 41.623, df = 4, p-value = 1.997e-08

Pode-se concluir que os pressupostos foram corrompidos e análise de variância não é válida. Dessa forma, poderiamos transformar os dados pela metodologia de Box-Cox (1964), conforme segue abaixo:

bc=MASS::boxcox(modelo)
lambda=bc$x[which.max(bc$y)]
modelo=aov((resposta^lambda-1)/lambda~Trat)
shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.9009, p-value = 0.01919
bartlett.test(modelo$residuals~Trat)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  modelo$residuals by Trat
## Bartlett's K-squared = 17.295, df = 4, p-value = 0.001693

Nesse exemplo em questão a transformação de dados não resolve os problemas de normalidade dos erros e homogeneidade das variâncias. Neste sentido, as vezes a simples remoção de um ponto discrepante poderia resolver esses problemas. Dessa forma, vamos remover o ponto 21, conforme acusado pela gráfico de caixas.

Para remover o ponto, podemos efetuar de várias formas. Manualmente em cada um dos vetores, criando uma nova variável, usando o comando with, entre outros.

Removendo manualmente em cada vetor

modelo=aov(resposta[-21]~Trat[-21])
shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.94239, p-value = 0.1844
bartlett.test(modelo$residuals~Trat[-21])
## 
##  Bartlett test of homogeneity of variances
## 
## data:  modelo$residuals by Trat[-21]
## Bartlett's K-squared = 4.5314, df = 4, p-value = 0.3388
car::Boxplot(resposta[-21]~Trat[-21])

Criando novos vetores de dados

Trat1=Trat[-21]
resposta1=resposta[-21]
modelo=aov(resposta1~Trat1)
shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.94239, p-value = 0.1844
bartlett.test(modelo$residuals~Trat1)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  modelo$residuals by Trat1
## Bartlett's K-squared = 4.5314, df = 4, p-value = 0.3388
car::Boxplot(resposta1~Trat1)

Removendo utilizando o with

dados=data.frame(Trat,resposta)
modelo=with(dados[-21,],aov(resposta~Trat))
shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.94239, p-value = 0.1844
with(dados[-21,],bartlett.test(modelo$residuals~Trat))
## 
##  Bartlett test of homogeneity of variances
## 
## data:  modelo$residuals by Trat
## Bartlett's K-squared = 4.5314, df = 4, p-value = 0.3388
with(dados[-21,],car::Boxplot(resposta~Trat))

7.2 Como remover um Tratamento?


dados=data.frame(Trat,resposta)
modelo=with(dados[!Trat=="T 5",],aov(resposta~Trat))
shapiro.test(modelo$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo$residuals
## W = 0.93316, p-value = 0.1776
with(dados[!Trat=="T 5",],bartlett.test(modelo$residuals~Trat))
## 
##  Bartlett test of homogeneity of variances
## 
## data:  modelo$residuals by Trat
## Bartlett's K-squared = 3.1774, df = 3, p-value = 0.3651
with(dados[!Trat=="T 5",],car::Boxplot(resposta~Trat))