Sunteți pe pagina 1din 80

Universidade Federal de Viçosa

Campus-Viçosa
Grupo de estudos em Fertilizantes
UFV

ANOVA e testes de médias com o Software R

Ministrante
Odirley Rodrigues Campos
Viçosa-MG
Setembro/2016

1
Sumário
Introdução ......................................................................................................................................................................... 4
ANOVA no Excel e preparo dos dados ............................................................................................................................... 5
Teclas de atalho no Excel .............................................................................................................................................. 5
Exemplo 1: fatorial duplo em DBC ................................................................................................................................ 5
Instalando o Programa R .................................................................................................................................................. 9
Configurando a janela do Rstudio. ................................................................................................................................ 9
Teclas de atalho no R .................................................................................................................................................. 10
Busca por ajuda........................................................................................................................................................... 10
Operadores no R.......................................................................................................................................................... 11
Tipos de objetos .......................................................................................................................................................... 11
Introdução ao R ........................................................................................................................................................... 11
Fatorial duplo sem desdobramento ............................................................................................................................ 17
Usando o pacote ExpDes ......................................................................................................................................... 17

Fatorial duplo sem desdobramento ............................................................................................................................ 21


Passo a passo .......................................................................................................................................................... 21

Fatorial duplo: progenes de eucalipto ........................................................................................................................ 26


Usando o ExpDes ..................................................................................................................................................... 26

Fatorial duplo: progenes de eucalípto ........................................................................................................................ 28


Passo a passo .......................................................................................................................................................... 28

Fatorial triplo: dados simulados para experimento com milho .................................................................................. 33


Obtenção rápida do QMr e teste de médias ........................................................................................................... 33

Fatorial triplo: dados simulados de um experimento com milho................................................................................ 38


Passo a passo .......................................................................................................................................................... 38

Parcelas subdividas: produtividade de milho .............................................................................................................. 44


Usando o ExpDes ..................................................................................................................................................... 44

Parcelas subdivididas: produtividade de milho ........................................................................................................... 48


Obetenção rápida do QMr e teste de médias ......................................................................................................... 48

Parcelas subdivididas: produtividade de milho ........................................................................................................... 54


Passo a passo .......................................................................................................................................................... 54

Parcelas subdivididas: dados simulados de um experimento com amendoim forrageiro .......................................... 61


Passo a passo .......................................................................................................................................................... 61

Fatorial duplo com um tratamento adicional ............................................................................................................. 68


Odirley Campos ....................................................................................................................................................... 68

2
Fatorial triplo com um tratamento adicional.............................................................................................................. 74
Passo a passo .......................................................................................................................................................... 74

Bibliografia .................................................................................................................................................................. 80

3
Introdução
A utilização de planilhas eletrônicas é uma ótima alternativa para se trabalhar com grandes bancos de dados. O
Excel é uma ferramenta acessível a todos, porém na maioria das vezes subutilizada, dada a ampla variedade de
recursos que apresenta. O R é um software livre, disponível na internet para download. Apesar de não ser um
programa específico de estatística, esse tem sido muito utilizado com essa finalidade. Uma busca rápida no Google
lhe mostrará a riqueza de materiais disponibilizados na NET sobre o uso do R nas mais diversas áreas. Além de o
programa ser de acesso livre, muitos pacotes específicos do R estão sendo desenvolvidos para facilitar a vida do
usuário, grande parte desses pacotes seguem a mesma filosofia do programa, sendo acessíveis a todos. Tutoriais e
rotinas também podem ser encontradas na internet, uma vez copiados os comandos de uma rotina, esses podem ser
reeditados e adaptados as necessidades do usuário.
No R os mesmos resultados podem ser obtidos com rotinas muito diferentes. A tendência é que os comandos
fiquem cada vez menores e mais “automatizados” a medida que o usuário ganha experiência com o software. Os
procedimentos utilizados neste material certamente não são o meio mais rápido para se obter os quadros de ANOVA.
No entanto, optamos por mostrá-los passo a passo com o objetivo de facilitar a compreensão e a familiarização com
a linguagem do programa. Recomendamos que, ao ler as linhas de comandos maiores, o usuário faça a identificação
dos “núcleos dos comandos” e, a partir deles, ao editá-los no workspace, incremente-os do “centro para as laterais”.
Comumente a análise de variância é o procedimento utilizado para a decomposição dos efeitos em:
1- Desejáveis e controlados: efeitos de tratamentos
2- Indesejáveis, mas controlados: blocos
3- Indesejáveis e não controlados: que compõem o erro ou resíduo
Para esta decomposição faremos os cálculos para obtenção das somas de quadrados as quais serão colocadas no
quadro da ANOVA. Todos os cálculos serão feitos segundo a fórmula abaixo:

Eq. 1

Em que:

O primeiro termo “yi“ é valor total da variável resposta para o fator em estudo (seja ele: tratamento, bloco, fator 1,
fator 2) no nível “i”.

“n” é o número de somados para se chegar ao valor dado por “yi“

“t” o número de somados para se chegar ao valor

Vale ressaltar que, quando se trabalha com fatoriais, os tratamentos são obtidos pela combinação dos níveis dos
fatores de interesse. Em um primeiro exemplo consideraremos o experimento fatorial, em DBC, retirado de Pimentel
Gomes (2008), listado abaixo. O arquivo é mantido em formato .txt, pois é o formato de entrada do R program. Mas
inicialmente demonstraremos algumas ferramentas para manipulação dos dados e obtenção do quadro de ANOVA no
Excel.

Tabela 1:
bloc adu tor resp
1 0 0 18.0
2 0 0 8.6
3 0 0 9.4
4 0 0 11.4
1 1 0 20.6
2 1 0 21.0
3 1 0 18.6
4 1 0 20.6
1 0 1 19.6
2 0 1 15.0
3 0 1 14.6
4
4 0 1 15.8
1 1 1 19.2
2 1 1 19.6
3 1 1 18.4
4 1 1 20.2

Observe que temos os fatores bloco(fb), adubação (f1) e aplicação de torta de filtro (f2). Da combinação dos
fatores f1 com f2 teremos 2  2= 4 tratamentos. Mas para obtenção da SQ do resíduo (SQr) bastaria ter os
tratamentos.

Tabela 2:
FV N GL SQ QM F p-valor
Blocos 4
Trat 4
Resíduo
Total 16

ANOVA no Excel e preparo dos dados


Então:

Copie os dados da tab1 e cole no Excel. Se já não colar no formato de colunas, utilize o recurso na barra superior do
Excel (Fig. 1)

dados>texto para colunas

Figura 1: Opção de colagem

No Excel as casas decimais serão definidas por pontos “.”. Do contrário, ir em: arquivos>opções>avançado>usar
separador de sistema e definir “.” para decimal e “,“ para milhar (não recomendo usar espaço ao invés de vírgula,
pois poderá causar confusão ao manipular o arquivo de .txt para o Excel novamente).

Teclas de atalho no Excel

Ao trabalhar com um grande banco de dados no Excel utilize as teclas de atalho:


“CTRL + SHIFT + →” para selecionar da célula ativa até a última da direita
“CTRL + SHIFT + ←” para selecionar da célula ativa até a última da esquerda
“CTRL + SHIFT + ↓ ” para selecionar da célula ativa até a última linha ativa
“CTRL + SHIFT + ↑ ” para selecionar da célula ativa até a primeira linha ativa

O banco de dados agora é:


Exemplo 1: fatorial duplo em DBC
trat fb f1 f2 resp
1 1 0 0 18.0
2 1 1 0 20.6
5
3 1 0 1 19.6
4 1 1 1 19.2
1 2 0 0 8.6
2 2 1 0 21.0
3 2 0 1 15.0
4 2 1 1 19.6
1 3 0 0 9.4
2 3 1 0 18.6
3 3 0 1 14.6
4 3 1 1 18.4
1 4 0 0 11.4
2 4 1 0 20.6
3 4 0 1 15.8
4 4 1 1 20.2

No Excel selecionar o banco de dados e ir em:

INSERIR>GRAFICO DINAMICO E TABELA DINAMINCA

Obs :no Excel<2010, pode ser um pouco diferente

Obs: Escolher a opção inserir em nova planilha.

Na parte superior direita, clicar em Bloco e arrastar para o campo de eixos


categóricos. Clicar na resp e arrastar para o campo de valores (Fig 2).
Figura 2: Selecionador de campos
Na parte superior direita, clicar em trat e arrastar para o campo de eixos
do Excel
categóricos (Fig. 2). Clicar na resp e arrastar para o campo de valores. Na
seta indicadora no campo de valores ir em:
configurações de campo>desvio padrão

Se tiver algum valor muito discrepante verifique seu banco de dados no Excel
e identifique-o. Poderá ser apenas um erro de digitação ao passar os dados
do caderno de anotações do experimento para a planilha de dados.

Se estiver tudo OK. Apague o gráfico.

Calcularemos a SQ primeiramente para bloc segundo a Tabela 2.


Procedimento: Figura 3: Campos selecionados
para compor os eixos do gráfico ou
EIXO (categórico): bloc da tabela dinâmica
VALORES: soma de resp e contagem de resp

Veja que temos na tabela dinâmica:

nível “i” dos bloc: primeira coluna


totais do bloci “yi” : segunda coluna
número de somados “n” por bloc i: terceira coluna
o somatório “ ”: 2ª col, última linha
número total de somados “t”: 3ª col, última coluna Figura 4: Tabela dinâmica

6
Monte a seguinte tabela no Excel.

Ʃyi)2

Figura 5: estrutura da tabela dinâmica(esquerda) e da tabela inicial da anova(direita)

Utilize:

= SOMAQUAD(B2:B5) para calcular Ʃ(yi2)


= (B6)^2 para calcular (Ʃyi)2

Depois calcule:
SQ conforme a Eq. 1
GL=N-1
QM= SQ/GL
F= QM/QMr (para fixar a célula com QMr use o “$”)

Segundo Ribeiro Junior (2004):


Se F>1, usar no Excel 2007
p-valor= DISTF(F; GL fator em estudo; GL resíduo)

Se F<1, usar
p-valor= 1 - DISTF(F; GL fator em estudo; GL resíduo)

OBS: no Excel 2010 usar

p-valor= DIST.F.CD(F; GL fator em estudo; GL resíduo)

Se F<1, usar
p-valor= 1 – DIST.F.CD(F; GL fator em estudo; GL resíduo)

OBS: antes de mudar o fator de entrada na tab dinâmica certifique-se de copiar e colar como valores a linha de
cálculos feitos anteriormente. Do contrário os valores de SQ já calculados serão alterados.

Após os cálculos teremos:


Tabela 4
Ʃ(yi2) n (Ʃyi)2 t SQ N GL QM F P-valor
Bloco 18457.4 4 73224.36 16 37.8275 4 3 12.609 3.01 0.087
Trat 18991.16 4 73224.36 16 171.2675 4 3 57.089 13.63 0.001
Resíduo 37.7025 9 4.189
Total 4823.32 1 73224.36 16 246.7975 16 15 16.453 3.93 0.022
Dado que a SQbruta de f1f2= SQf1 + SQf2 + SQ(f1  f2), onde (f1  f2) remete a interação entre os dois fatores.
Então SQ(f1  f2)= SQf1f2b - SQf1 - SQf2.

7
Portanto, depois de
achar os efeitos simples,
devemos procurar pelo
efeito bruto f1f2,
conforme ilustrado ao
lado:

Figura 6: estrutura da tab dinâmica e da anova

Para o desdobramento de f1 dentro dos níveis de f2 (f1 d/ f2=...) usaremos os filtros da tabela dinâmica, conforme
abaixo.

Adubo (f1) na
ausência de Torta (f2)

Figura 7: utilização de filtros da tabela dinâmica

Incrementando a tabela, teremos:


Ʃ(yi2) n (Ʃyi)2 t SQ N GL QM F P-valor
Bloco 18457.4 4 73224.36 16 37.8275 4 3 12.609 3.01 0.087
Trat 18991.16 4 73224.36 16 171.2675 4 3 57.089 13.63 0.001
Resíduo 37.7025 9 4.189 1
Total 4823.32 1 73224.36 16 246.7975 16 15 16.453

f1 37661 8 73224.36 16 131.1025 2 1 131.103 31.30 0.00034


f2 36713 8 73224.36 16 12.6025 2 1 12.603 3.01 0.11686
f1f2B 18991.16 4 73224.36 16 171.2675
f1×f2 27.5625 2 1 27.562 6.58 0.03043
f1 d/f2=0 8775.4 4 16435.24 8 139.445 2 1 139.445 33.29 0.000
f1 d/f2=1 10215.76 4 20277.76 8 19.22 2 1 19.220 4.59 0.061
“f1”=para o efeito dos níveis de adubo, “f2”=efeito dos níveis de torta de filtro, “f1f2B”= para efeito bruto, “f1×f2”=
para efeito da interação, “f1 d/f2=0” = f1 dentro do nível zero de torta de filtro, “f1 d/f2=1” = f1 dentro do nível um de
torta de filtro.

8
Instalando o Programa R
http://cran.r-project.org
Clique em download, depois escolha o espelho da UFPR
http://cran-r.c3sl.ufpr.br/
Se seu sistema operacional é o Windows escolha : Download R for Windows

Uma das ferramentas que utilizaremos é o R studio, para instalá-lo vá em


http://www.rstudio.com/ > DOWNLOAD > escolha a versão desktop em DOWNLOAD RSTUDIO DESKTOP

OBS: Após instalação verifique se há um atalho na barra de tarefas do seu PC, caso não o encontre, procure pelo
ícone do Rstudio (símbolo circular com R dentro) e clique com o botão direito do mouse nele. Aparecerá uma opção:
inserir atalho na barra de tarefas.

Configurando a janela do Rstudio.

Clicar no atalho Rstudio


tools > global options > pane layout > ... > apply>OK

Deixe da forma mostrada abaixo:

Figura 8: definindo o layout do Rstudio

9
Verifique as mudanças nas configurações da janela do Rstudio

No console serão
mostrados os resultados Mudando diretório
das operações e
Janela de edição comandos Session > set working
directory > choose
diretory

Escolha a pasta onde


estão os arquivos de
dados e onde serão salvos
os arquivos de saída.
Gráficos e recursos de
ajuda são mostrados
aqui.

Figura 9: apresentação da janela do R studio

Teclas de atalho no R
“CTRL + enter” = run, roda o comando da linha onde está o cursor do mouse no workspace
“CTRL + 2” = cursor vai para a tela da direita
“CTRL + 1” = cursor vai para a tela da esquerda
“CTRL + L” = limpa a janela do console quando o cursor está nela
“End” = cursor vai para o final da linha de comandos
“Home” = cursor vai para o início da linha de comandos
“CTRL + C” = copia
“CTRL + V” = cola
“ESC”= finalizar o último comando incompleto, quando no console
“↑” = retorna o último comando usado ou acessa o histórico de comandos, quando o cursor está na janela do
console

Busca por ajuda


 OBS: como se trata de um programa livre, a internet está repleta de sites, tutoriais, fóruns de discussão
relacionados ao R.
 No google digite “r program” e a palavra de interesse ou vá direto aos sites listados abaixo
 http://www.statmethods.net/management/userfunctions.html
 http://www.r-bloggers.com/
 http://www.leg.ufpr.br/doku.php
 http://r-br.2285057.n4.nabble.com/
 http://r-project.markmail.org/search/

No próprio R, digite no console

 ? nome do comando
 ??nome do comando
 help.search(“comando”)
 args(comando)

10
Operadores no R
Operadores são utilizados de diversas formas.

#alguns operadores
=================================================================
OPERADOR DESCRIÇÃO PRIORIDADE
=================================================================
$ seleção de componentes Alta
[ [[ indexação |
^ potência |
- menos unitário |
: operador de seqüência |
%nome% operadores especiais |
* / multiplicação, divisão |
< > menor, maior |
<= >= menor ou igual,maior ou igual |
== != exatamente, diferente |
! não |
& && e |
| || ou |
~ fórmula estatística |
<<- <- -> = atribuição Baixa
%% modulo
%/% integer division
!= diferent
x && y id
x & y logical AND
x|y logical OR
x||y id.
xor(x, y) exclusive OR
=================================================================

Tipos de objetos
O R trabalha com objetos os quais armazenam ou recebem dados e operações.
vetores (numérico ou de caracteres)
matrizes (armazenam apenas números ou apenas caracteres, não aceita “células vazias”)
array (armazena apenas números, porém aceita “células vazias”)
data frames (armazena números e ou caracteres, não aceita “células vazias”)
listas (armazena conjuntos objetos diversos, incluindo textos)

is(nome do objeto) # para saber o tipo de objeto execute o comando

Introdução ao R
No R studio é possível trabalhar com arquivos do tipo Rscript (.R) ou do tipo R Markdown(.Rmd). No file (canto
esquerdo superior) escolha o tipo de arquivo que você quer trabalhar. Indico o formato .R para quem tem mais
experiência e não pretende fazer muitos comentários durante a rotina ou não tem interesse em salvar os resultados no
próprio arquivo. Indico o formato .Rmd para aqueles que querem descrever mais detalhes sobre a rotina ou querem
salvá-la como um tutorial nos formatos do word, pdf ou HTML (clique em Knit Word). Além disso, esta última opção
permite mostrar os resultados das operações no arquivo de saída. Após salvar no formato Word, pdf ou HTML, veja
que o ## indica resultado das operações.
Observações:
Trabalhando com o .R, use #...----- para colocar títulos em blocos de operações:

11
# título qualquer ---------
...
Se abaixo do título existem muitas linhas de comando, clique na seta para baixo, entre o número da linha e o título.
Veja que os comandos ficam ocultos dentro do título permitidto uma visão mais geral da rotina
Trabalhando com o .Rmd, use ```{r}...``` para delimitar um bloco de operações. Neste caso podemos descrever
maiores detalhes fora do bloco de operações, ou seja, antes ou depois de ```{r}...```.

```{r}
# título qualquer
...
```

Algumas operações básicas


2+2 # execute a operação e veja o resultado
## [1] 4
a<-2+2 # o objeto "a" recebe o resultado da operação 2+2.
# Para ver o resultado digite "a" e execute-o
b<- 3 # objeto b recebe valor 3
a+b # retornará 7
## [1] 7

Vetores
c(1,2,3)
## [1] 1 2 3
v<-c(1,2,3) # cria um vetor concatenando os 3 elementos dentro dos parênteses

Operações com vetores


3*v # multiplica cada elemento de v por 3
## [1] 3 6 9
b*v # multiplica b cada elemento de v
## [1] 3 6 9
v/2 # divide
## [1] 0.5 1.0 1.5
v^2 # potenciação
## [1] 1 4 9
sqrt(v) # raiz quadrada
## [1] 1.000000 1.414214 1.732051
v^(1/3) # raiz cúbica
## [1] 1.000000 1.259921 1.442250
sum(v) # soma

12
## [1] 6
mean(v) # media
## [1] 2
length(v) # quantos elementos temos em v? comprimento de v
## [1] 3

Matriz
matrix(1:12, ncol = 3) # gera uma matriz com 3 colunas
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
m1<- matrix(1:12, ncol = 3) # cria a matriz e armazena no objeto m1
m1
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
m1[, 2] # acessa qualquer linha da coluna 2 da m1
## [1] 5 6 7 8

Lista
list("fulano", m2<- matrix(1:6, ncol=3), "beltrano")
## [[1]]
## [1] "fulano"
##
## [[2]]
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
##
## [[3]]
## [1] "beltrano"
a0<- list("fulano", m2<- matrix(1:6, ncol=3), "beltrano")#cria uma lista e armazena no
obj a0
a0[[3]]
## [1] "beltrano"
a0[[2]] #no 2º obj de a0
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
a0[[2]][,2]#no 2º obj de a0 retornar a 2ª coluna
## [1] 3 4
13
Data frame
rbind(c("f1","f2","resp"),m1) # é uma matriz de caracteres
## [,1] [,2] [,3]
## [1,] "f1" "f2" "resp"
## [2,] "1" "5" "9"
## [3,] "2" "6" "10"
## [4,] "3" "7" "11"
## [5,] "4" "8" "12"
as.data.frame(rbind(c("f1","f2","resp"),m1))
## V1 V2 V3
## 1 f1 f2 resp
## 2 1 5 9
## 3 2 6 10
## 4 3 7 11
## 5 4 8 12
tes<-as.data.frame(rbind(c("f1","f2","resp"),m1))
tes
## V1 V2 V3
## 1 f1 f2 resp
## 2 1 5 9
## 3 2 6 10
## 4 3 7 11
## 5 4 8 12

Identificando os "núcleos" dos comandos


(2+2)*3 # qual foi a 1ª operação realizada?
## [1] 12
a<-c(4,9,16)
b<-2
b*(sqrt(a)) # qual foi a 1ª operação realizada?
## [1] 4 6 8
sqrt(sum(a[1:3])) # qual foi a 1ª,2ª e a 3ª operação realizada?
## [1] 5.385165

Trabalhando com banco de dados


# importando dados------
read.table("fat2.txt",h=T) #h=T indica head=TRUE, ou seja, tem cabeçalho
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0
## 7 2 3 sa 1 14.6
## 8 2 4 sa 1 15.8
## 9 3 1 ca 0 20.6
## 10 3 2 ca 0 21.0
14
## 11 3 3 ca 0 18.6
## 12 3 4 ca 0 20.6
## 13 4 1 ca 1 19.2
## 14 4 2 ca 1 19.6
## 15 4 3 ca 1 18.4
## 16 4 4 ca 1 20.2
a<-read.table("fat2.txt",h=T)# importa e armazena no objeto a
head(a) # lendo o cabeçalho
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0
str(a) # tipo dos obj que compoem o obj a
## 'data.frame': 16 obs. of 5 variables:
## $ trat: int 1 1 1 1 2 2 2 2 3 3 ...
## $ bloc: int 1 2 3 4 1 2 3 4 1 2 ...
## $ f1 : Factor w/ 2 levels "ca","sa": 2 2 2 2 2 2 2 2 1 1 ...
## $ f2 : int 0 0 0 0 1 1 1 1 0 0 ...
## $ resp: num 18 8.6 9.4 11.4 19.6 15 14.6 15.8 20.6 21 ...
is(a) # qual tipo de obj é a?
## [1] "data.frame" "list" "oldClass" "vector"
a$bloc # extrai o vetor bloc
## [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
a$resp # extrai o vetor resp
## [1] 18.0 8.6 9.4 11.4 19.6 15.0 14.6 15.8 20.6 21.0 18.6 20.6 19.2 19.6
## [15] 18.4 20.2
tapply(a$resp,a$f1,mean)# tabela de médias
## ca sa
## 19.775 14.050
tapply(a$resp,a$f2,mean)
## 0 1
## 16.025 17.800
tapply(a$resp,a$f2,length)# tabela com número de obs
## 0 1
## 8 8

Identifique no comando abaixo: 1ª operação? ( )soma; ( )tabela de médias; ( ) comprimento do vetor 2ª operação? (
)soma; ( )divisão; ( ) armazena resultado no obj test 3ª operação? ( )soma; ( )divisão; ( ) potência 4ª operação? (
)soma; ( ) tabela de médias; ( ) potência 5ª operação? ( )soma; ( )tabela de médias; ( ) comprimento do vetor 6ª
operação? ( )soma; ( )tabela de médias; ( ) divisão 7ª operação? ( )armazena resultado no obj test; ( )tabela de
médias;() divisão
teste<-((sum(tapply(a$resp,a$f1,mean)
)
15
)^2
)/length(tapply(a$resp,a$f1,mean))

Dica: observe o alinhamento dos parênteses, indentifique onde eles iniciam e fecham
teste<-((sum(tapply(a$resp,a$f1,mean)
)
)^2
)/(length(tapply(a$resp,a$f1,mean)
)
)

Fazendo recortes no banco de dados


# Recortando o banco de dados ---------
a # mostra o objeto a
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0
## 7 2 3 sa 1 14.6
## 8 2 4 sa 1 15.8
## 9 3 1 ca 0 20.6
## 10 3 2 ca 0 21.0
## 11 3 3 ca 0 18.6
## 12 3 4 ca 0 20.6
## 13 4 1 ca 1 19.2
## 14 4 2 ca 1 19.6
## 15 4 3 ca 1 18.4
## 16 4 4 ca 1 20.2
levels(a$f1) # extrai o vetor f1 dentro do objeto a
## [1] "ca" "sa"
subset(a,f1=="sa") # recorta o vetor f1 igual a sa dentro do objeto a
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0
## 7 2 3 sa 1 14.6
## 8 2 4 sa 1 15.8
subset(a,f1=="ca")
## trat bloc f1 f2 resp
## 9 3 1 ca 0 20.6
## 10 3 2 ca 0 21.0
## 11 3 3 ca 0 18.6
## 12 3 4 ca 0 20.6
## 13 4 1 ca 1 19.2
## 14 4 2 ca 1 19.6
16
## 15 4 3 ca 1 18.4
## 16 4 4 ca 1 20.2
subset(a,f2=="0")
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 9 3 1 ca 0 20.6
## 10 3 2 ca 0 21.0
## 11 3 3 ca 0 18.6
## 12 3 4 ca 0 20.6
f2_0<-subset(a,f2=="0") # recorta e armazena no objeto f2_0
f2_0 # mostra o objeto f2_0
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 9 3 1 ca 0 20.6
## 10 3 2 ca 0 21.0
## 11 3 3 ca 0 18.6
## 12 3 4 ca 0 20.6
tapply(f2_0$resp,f2_0$f1,mean)# retorna uma tabela com medias do recorte
## ca sa
## 20.20 11.85
tapply(f2_0$resp,f2_0$f1,sum) # retorna uma tabela com a soma do recorte
## ca sa
## 80.8 47.4
tapply(f2_0$resp,f2_0$f1,length)# retorna uma tabela com o numero de obs
# de cada nível de f1 dentro do recorte f2_0
## ca sa
## 4 4

Fatorial duplo sem desdobramento

Usando o pacote ExpDes

Utilizaremos um conjundo de dados retirados de Pimentel Gomes(2008), sendo um fatorial duplo com dois níves
dentro de cada fator.
a<-read.table("fat2.txt",h=T)# importando os dados
head(a) # conferindo do cabeçalho
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4

17
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0
str(a)
## 'data.frame': 16 obs. of 5 variables:
## $ trat: int 1 1 1 1 2 2 2 2 3 3 ...
## $ bloc: int 1 2 3 4 1 2 3 4 1 2 ...
## $ f1 : Factor w/ 2 levels "ca","sa": 2 2 2 2 2 2 2 2 1 1 ...
## $ f2 : int 0 0 0 0 1 1 1 1 0 0 ...
## $ resp: num 18 8.6 9.4 11.4 19.6 15 14.6 15.8 20.6 21 ...
a
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0
## 7 2 3 sa 1 14.6
## 8 2 4 sa 1 15.8
## 9 3 1 ca 0 20.6
## 10 3 2 ca 0 21.0
## 11 3 3 ca 0 18.6
## 12 3 4 ca 0 20.6
## 13 4 1 ca 1 19.2
## 14 4 2 ca 1 19.6
## 15 4 3 ca 1 18.4
## 16 4 4 ca 1 20.2

Para rodar os dados transformaremos os vetores dos fatores em estudo em fator e a variável resposta em um vetor
numérico. Estes vetores erão armazenados nos objetos ft, fb, f1, f2. Ao nomear os objetos, prefira nomes pequenos,
pois evita erros e facilita a manipulação dos objetos no software. Além disso, outros objetos poderão ser criados a
partir dos primeiros, acrescentando-se apenas alguns caracteres a mais.
ft<-as.factor(a$trat)
fb<-as.factor(a$bloc)
f1<-as.factor(a$f1)# fator adubo
f2<-as.factor(a$f2) #fator torta de filtro
resp<-as.numeric(a$resp)

Reunindo em um data frame.


a1<-data.frame(ft,fb,f1,f2,resp)
head(a) # observe o cabeçalho
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0

Existem pacotes que já executam algumas rotinas de análises. O pacote ExpDes pode ser encontrado no endereço
https://cran.r-project.org/web/packages/ExpDes.pt/index.html. Após instalar o pacote em seu PC é possível executar
as rotinas de análise de variância e testes de médi, apenas informando o nome dos vetores dos fatores e da variável
resposta em estudo. Além deste, existem opções para a escolha do teste de médias e dos valores de alpha a serem
18
utilizados. Uma vez instalado o pacote, atívi-o no seu R studio (require....) e use o comando ?fat...(em português) ou
?fat2.rbd (se em inglês) para procurar pela subrotina que mais se encaixa no seu conjunto de dados.
require(ExpDes)#ativando o pacote
## Loading required package: ExpDes
## Warning: package 'ExpDes' was built under R version 3.2.5
fat2.rbd(f1, f2, fb, resp,
quali = c(TRUE, TRUE), mcomp = "tukey",
fac.names = c("Adubo", "Torta"), sigT = 0.05, sigF = 0.05)
## ------------------------------------------------------------------------
## Legend:
## FACTOR 1: Adubo
## FACTOR 2: Torta
## ------------------------------------------------------------------------
##
##
## Analysis of Variance Table
## ------------------------------------------------------------------------
## DF SS MS Fc Pr>Fc
## Block 3 37.828 12.609 3.0099 0.087112
## Adubo 1 131.102 131.102 31.2956 0.000337
## Torta 1 12.603 12.602 3.0084 0.116864
## Adubo*Torta 1 27.563 27.562 6.5795 0.030434
## Residuals 9 37.702 4.189
## Total 15 246.797
## ------------------------------------------------------------------------
## CV = 12.1 %
##
## ------------------------------------------------------------------------
## Shapiro-Wilk normality test
## p-value: 0.5582699
## According to Shapiro-Wilk normality test at 5% of significance, residuals can be
considered normal.
## ------------------------------------------------------------------------
##
##
##
## Significant interaction: analyzing the interaction
## ------------------------------------------------------------------------
##
## Analyzing Adubo inside of each level of Torta
## ------------------------------------------------------------------------
## ------------------------------------------------------------------------
## Analysis of Variance Table
## ------------------------------------------------------------------------
## DF SS MS Fc Pr.Fc
## Block 3 37.8275 12.60917 3.0099 0.0871
## Torta 1 12.6025 12.60250 3.0084 0.1169
## Torta:Adubo 0 1 139.4450 139.44500 33.287 3e-04
## Torta:Adubo 1 1 19.2200 19.22000 4.588 0.0608
## Residuals 9 37.7025 4.18917
## Total 15 246.7975 16.45317
## ------------------------------------------------------------------------
##
##
19
##
## Adubo inside of the level 0 of Torta
## ------------------------------------------------------------------------
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 1 20.2
## b 2 11.85
## ------------------------------------------------------------------------
##
##
## Adubo inside of the level 1 of Torta
##
## According to the F test, the means of this factor are statistical equal.
## Levels Means
## 1 1 19.35
## 2 2 16.25
## ------------------------------------------------------------------------
##
##
##
## Analyzing Torta inside of each level of Adubo
## ------------------------------------------------------------------------
## ------------------------------------------------------------------------
## Analysis of Variance Table
## ------------------------------------------------------------------------
## DF SS MS Fc Pr.Fc
## Block 3 37.8275 12.60917 3.0099 0.0871
## Adubo 1 131.1025 131.10250 31.2956 3e-04
## Adubo:Torta ca 1 1.4450 1.44500 0.3449 0.5714
## Adubo:Torta sa 1 38.7200 38.72000 9.2429 0.014
## Residuals 9 37.7025 4.18917
## Total 15 246.7975 16.45317
## ------------------------------------------------------------------------
##
##
##
## Torta inside of the level ca of Adubo
##
## According to the F test, the means of this factor are statistical equal.
## Levels Means
## 1 1 20.20
## 2 2 19.35
## ------------------------------------------------------------------------
##
##
## Torta inside of the level sa of Adubo
## ------------------------------------------------------------------------
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 2 16.25
## b 1 11.85
## ------------------------------------------------------------------------

20
Fatorial duplo sem desdobramento

Passo a passo

Outra opção seria fazer a análise de variância montando-a passo a passo como demostrado abaixo. Apesar de não
ser um procedimento rápido, este é mais flexível, permitindo adaptá-lo para outros conjuntos de dados com diferentes
"desenhos do experimento". Usaremos os dados retirados de Pimentel Gomes (2008). Ao importar os dados não se
esqueça de colocar o nome do arquivo "fat2" e se é um arquivo de texto, coloque ".txt". O "h=T" indica head=TRUE,
ou seja, existe cabeçalho no arquivo de dados.

a<-read.table("fat2.txt",h=T)# importando os dados


str(a)
## 'data.frame': 16 obs. of 5 variables:
## $ trat: int 1 1 1 1 2 2 2 2 3 3 ...
## $ bloc: int 1 2 3 4 1 2 3 4 1 2 ...
## $ f1 : Factor w/ 2 levels "ca","sa": 2 2 2 2 2 2 2 2 1 1 ...
## $ f2 : int 0 0 0 0 1 1 1 1 0 0 ...
## $ resp: num 18 8.6 9.4 11.4 19.6 15 14.6 15.8 20.6 21 ...
head(a)
## trat bloc f1 f2 resp
## 1 1 1 sa 0 18.0
## 2 1 2 sa 0 8.6
## 3 1 3 sa 0 9.4
## 4 1 4 sa 0 11.4
## 5 2 1 sa 1 19.6
## 6 2 2 sa 1 15.0

Transformaremos os vetores em fator ou em vetores numéricos

# transformando os dados em fator--------


ft<-as.factor(a$trat)
fb<-as.factor(a$bloc)
f1<-as.factor(a$f1)
f2<-as.factor(a$f2)
resp<-as.numeric(a$resp)
Reunindo em novo data.frame

a1<-data.frame(ft,fb,f1,f2,resp)

Obteremos o quadrado médio do resíduo de forma rápida com o comando aov. Porém para obter a saída mais
comum utilizaremos o comando summary(...). Extrairemos o grau de liberdade e a soma de quadrados do resíduo
apenas para conferir com os resultados de nossa rotina passo a passo.

# Anova apenas tratamentos ------


ane0 <-aov(resp~fb+ft, data=a1)
summary(ane0)
## Df Sum Sq Mean Sq F value Pr(>F)
## fb 3 37.83 12.61 3.01 0.08711 .
## ft 3 171.27 57.09 13.63 0.00107 **
## Residuals 9 37.70 4.19
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
df.residual(ane0) # gl do residuo

21
## [1] 9
sum(residuals(ane0)^2) # SQresiduo
## [1] 37.7025

Lembremos que para calcular a SQ de um fator em estudo usamos a fórmula: SQ=....

Dividiremos a fórmula em duas partes, sendo (...)=term1 e, (...)=term2. Depois juntaremos as duas para obter a SQ.

term1<-sum((tapply(resp,fb,sum)^2)/tapply(resp,fb,length))
term2<-sum(tapply(resp,fb,sum))^2/sum(tapply(resp,fb,length))
SQ<-term1-term2
SQ
## [1] 37.8275

Observe que para calcular a SQ para tratamentos, apenas trocaríamos fb por ft na estrutura dos comandos acima. O
mesmo vale para f1 e f2. Para não utilizar os blocos de comandos acima para cada fator em estudo, utilizaremos a
função function(x){...return(...)} em que o objeto "curinga" x é o vetor do fator em estudo.

# funcao para SQs ---------


fu1<-function(x){
term1<-sum((tapply(resp,x,sum)^2)/tapply(resp,x,length))
term2<-((sum(tapply(resp,x,sum)))^2)/sum(tapply(resp,x,length))
sq<-term1-term2
return(sq)}

Experimente aplicar a fu1 nos objetos fb, ft, f1 e f2

fu1(fb) # conferir os resultados com aqueles do comando aov(...)


## [1] 37.8275
fu1(ft)
## [1] 171.2675

Reuniremos as SQs, por linha, em um objto chamado vsq

# aplicando fu1 para SQs


vsq<-rbind(vb=fu1(fb),
vt=fu1(ft),
vtotal=fu1(fb:f1:f2),
vresiduo=fu1(fb:f1:f2)-fu1(ft)-fu1(fb),
vf1=fu1(f1),
vf2=fu1(f2),
vf1i2=fu1(f1:f2)-fu1(f1)-fu1(f2))
vsq
## [,1]
## vb 37.8275
## vt 171.2675
## vtotal 246.7975
## vresiduo 37.7025
## vf1 131.1025
## vf2 12.6025
## vf1i2 27.5625

De modo semelhante calcularemos os graus de liberdade

22
# calculando os gls --------
vgl<-c(glb<-length(levels(fb))-1,
glt<-length(levels(ft))-1,
gltotal<-length(levels(fb:f1:f2))-1,
glresiduo<-gltotal-glb-glt,
gl1<-length(levels(f1))-1,
gl2<-length(levels(f2))-1,
gl1i2<-gl1*gl2)
vgl
## [1] 3 3 15 9 1 1 1

Sabemos que o QM=SQ/GL. Os valores calculados serão armazenados em um vetor vqm, do qual sabemos que o 4º
valor na 1ª linha (vqm[4,1]) é o QM do resíduo. Sabemos que o F calculado é obtido por Fcal=QM do fator em
estudo/QMr. Armazenamos os valores de Fcal num vetor chamdo vfcal. Posteriormente fazemos o teste F usando o
comando pf(...). Os procedimentos acima listados são realizados um a um para verificação dos resultados. Em
seguida reunimos os diversos objetos com o uso da comando cbind(....). As aspas " " indicam que mesmo os números
estão sendo reconhecidos como caracteres pelo software. Isto é consequência do tipo de objeto, pois as matrizes são
compostas de apenas um tipo de objeto, ou númerico ou caracter.

# reunindo em uma matriz


cbind(vsq,
vgl,
vqm<-vsq/vgl,
vfcal<-vqm/vqm[4,1],
p_valor<-pf(vfcal, vgl, gltotal-glb-glt,lower.tail = FALSE))
## vgl
## vb 37.8275 3 12.609167 3.009946 0.0871123525
## vt 171.2675 3 57.089167 13.627810 0.0010748062
## vtotal 246.7975 15 16.453167 3.927551 0.0219051669
## vresiduo 37.7025 9 4.189167 1.000000 0.5000000000
## vf1 131.1025 1 131.102500 31.295604 0.0003367442
## vf2 12.6025 1 12.602500 3.008355 0.1168637053
## vf1i2 27.5625 1 27.562500 6.579471 0.0304340412

Adicionaremos um vetor de nomes ao nosso objeto

# identificando as colunas
rbind(c("FV", "SQ", "GL", "QM", "Fcal", "P_valor"),
cbind(vsq,
vgl,
vqm<-vsq/vgl,
vfcal<-vqm/vqm[4,1],
p_valor<-pf(vfcal, vgl, gltotal-glb-glt,lower.tail = FALSE)))
## Warning in rbind(c("FV", "SQ", "GL", "QM", "Fcal", "P_valor"), cbind(vsq, :
## number of columns of result is not a multiple of vector length (arg 1)
## vgl
## "FV" "SQ" "GL" "QM"
## vb "37.8274999999994" "3" "12.6091666666665" "3.00994629003374"
## vt "171.2675" "3" "57.0891666666666" "13.6278098269344"
## vtotal "246.7975" "15" "16.4531666666666" "3.92755122339363"
## vresiduo "37.7025000000003" "9" "4.1891666666667" "1"
## vf1 "131.102499999999" "1" "131.102499999999" "31.2956037398046"
## vf2 "12.6025" "1" "12.6025" "3.00835488362837"
## vf1i2 "27.5625000000009" "1" "27.5625000000009" "6.57947085737036"
##
23
## "Fcal"
## vb "0.0871123524548996"
## vt "0.00107480616992565"
## vtotal "0.0219051668686572"
## vresiduo "0.5"
## vf1 "0.000336744197665661"
## vf2 "0.116863705339496"
## vf1i2 "0.0304340412024341"

Utilizaremos o comando round(...,dig=3), internamente, para arredondar os valores obtidos até 3 casas decimais.

rbind(c("FV", "SQ", "GL", "QM", "Fcal", "P_valor"),


cbind(round(vsq,dig=1),
round(vgl,dig=1),
round(vqm<-vsq/vgl,dig=1),
round(vfcal<-vqm/vqm[4,1],dig=2),
round(p_valor<-pf(vfcal, vgl, gltotal-glb-glt,
lower.tail = FALSE),dig=3)))
## Warning in rbind(c("FV", "SQ", "GL", "QM", "Fcal", "P_valor"),
## cbind(round(vsq, : number of columns of result is not a multiple of vector
## length (arg 1)
## [,1] [,2] [,3] [,4] [,5]
## "FV" "SQ" "GL" "QM" "Fcal"
## vb "37.8" "3" "12.6" "3.01" "0.087"
## vt "171.3" "3" "57.1" "13.63" "0.001"
## vtotal "246.8" "15" "16.5" "3.93" "0.022"
## vresiduo "37.7" "9" "4.2" "1" "0.5"
## vf1 "131.1" "1" "131.1" "31.3" "0"
## vf2 "12.6" "1" "12.6" "3.01" "0.117"
## vf1i2 "27.6" "1" "27.6" "6.58" "0.03"

Para retirar as " " transformaremos o objeto em um data frame, pois os data frames aceitam números e caracteres ao
mesmo tempo.

# transformando emum data.frame


# despreze o fcal e pv para total e residuo
as.data.frame(
rbind(c("SQ", "GL", "QM", "Fcal", "P_valor"),
cbind(round(vsq,dig=1),
round(vgl,dig=1),
round(vqm<-vsq/vgl,dig=1),
round(vfcal<-vqm/vqm[4,1],dig=2),
round(p_valor<-pf(vfcal, vgl, gltotal-glb-glt,
lower.tail = FALSE),dig=3))))
## V1 V2 V3 V4 V5
## SQ GL QM Fcal P_valor
## vb 37.8 3 12.6 3.01 0.087
## vt 171.3 3 57.1 13.63 0.001
## vtotal 246.8 15 16.5 3.93 0.022
## vresiduo 37.7 9 4.2 1 0.5
## vf1 131.1 1 131.1 31.3 0
## vf2 12.6 1 12.6 3.01 0.117
## vf1i2 27.6 1 27.6 6.58 0.03

Para fazer os desdobramentos fazemos recortes no objetos contendo os dados.

24
# anova dos desdobramentos -----
levels(f1) # lembranod os níveis de f1
## [1] "ca" "sa"
levels(f2)
## [1] "0" "1"
# fazendo recortes no banco de dados
f2_0<-subset(a1, f2=="0") #f1 qndo torta =0
f2_1<-subset(a1, f2=="1") #f1 qndo torta =1

Criaremos um nova function(..){...} para calcular as SQ, GL, QM, Fcal e Pvalores para o fator em estudo de acordo
com os recortes feitos. Observe na função que o fator f1é o fator em estudo dentro dos níveis de f2. Portanto nosso
"objeto curinga" será o própiro recorte (f2_0...) do banco de dados(a1).

#criaremos uma nova function-------


fu2<-function(x){
somqy<-tapply(x$resp,x$f1,sum)^2
n<-tapply(x$resp,x$f1,length)
ter1<-sum(somqy/n)
qsomy<-sum(tapply(x$resp,x$f1,sum))^2
t<-sum(n)
ter2<-qsomy/t
SQ<-ter1-ter2
GL<-length(somqy)-1
QM<-SQ/GL
Fcal<- QM/(sum(residuals(ane0)^2)/df.residual(ane0))
PV<-round(c(pf(Fcal, GL, df.residual(ane0),
lower.tail = FALSE)), dig=3)
vetnum<-round(c(SQ,GL,QM,Fcal,PV),dig=3)
return(vetnum)
}

Aplicando a fu2 aos recortes

fu2(f2_0)
## [1] 139.445 1.000 139.445 33.287 0.000
fu2(f2_1)
## [1] 19.220 1.000 19.220 4.588 0.061

Reunindo numa matriz

# reunindo numa matriz ------


cbind(c("f1 d/f2=0","f1 d/f2=1"), # identificação
rbind(fu2(f2_0),fu2(f2_1)))
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] "f1 d/f2=0" "139.445" "1" "139.445" "33.287" "0"
## [2,] "f1 d/f2=1" "19.22" "1" "19.22" "4.588" "0.061"

Identificando colunas

rbind(c("FV", "SQ", "GL", "QM", "Fcal", "P_valor"),


cbind(c("f1 d/f2=0","f1 d/f2=1"),
rbind(fu2(f2_0),fu2(f2_1))))

25
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] "FV" "SQ" "GL" "QM" "Fcal" "P_valor"
## [2,] "f1 d/f2=0" "139.445" "1" "139.445" "33.287" "0"
## [3,] "f1 d/f2=1" "19.22" "1" "19.22" "4.588" "0.061"

Transformando em um data frame

as.data.frame(rbind(c("FV", "SQ", "GL", "QM", "Fcal", "P_valor"),


cbind(c("f1 d/f2=0","f1 d/f2=1"),
rbind(fu2(f2_0),fu2(f2_1)))))
## V1 V2 V3 V4 V5 V6
## 1 FV SQ GL QM Fcal P_valor
## 2 f1 d/f2=0 139.445 1 139.445 33.287 0
## 3 f1 d/f2=1 19.22 1 19.22 4.588 0.061

Neste caso o teste F é conclusivo, pois temos apenas um contraste. Se você quer saber quais são as médias utilize o
comando tapply(....) para os recortes definidos anteriormente

tapply(f2_0$resp, f2_0$f1, mean) # na ausencia de torta


## ca sa
## 20.20 11.85
tapply(f2_1$resp, f2_1$f1, mean) # na presença de torta
## ca sa
## 19.35 16.25

Fatorial duplo: progenes de eucalipto

Usando o ExpDes

Utilizaremos os dados simulados de um fatorial duplo, em dbc. Os fatores em estudo são 2 progênies de plantas (A,B)
e 4 tipos de adubo (1, 2, 3, 4). As variáveis resposta são a produção de matéria seca da parte aérea(msf) ou de
caule(msc) de mudas de eucalipto. O objetivo é saber qual tipo de adubo permite maior produção de folhas ou caule
dentro dos níveis de progênies.

Para importar os dados lembre-se que o diretório deve ser reconhecido pelo software. Para fazê-lo vá em:
Session>Set Working Directory> Choose Directory> escolha a pasta onde está o arquivo de dados

a<-read.table("fat2_prog.txt",h=T)# importando os dados


head(a) # cabeçalho está ok?
## trat bloc prog adub msf msc
## 1 1 1 A 1 12.98 6.60
## 2 2 1 A 2 5.47 2.36
## 3 3 1 A 3 12.64 6.95
## 4 4 1 A 4 6.33 3.38
## 5 5 1 B 1 25.13 15.18
## 6 6 1 B 2 6.62 3.47
str(a)
## 'data.frame': 32 obs. of 6 variables:
## $ trat: int 1 2 3 4 5 6 7 8 1 2 ...
## $ bloc: int 1 1 1 1 1 1 1 1 2 2 ...
## $ prog: Factor w/ 2 levels "A","B": 1 1 1 1 2 2 2 2 1 1 ...

26
## $ adub: int 1 2 3 4 1 2 3 4 1 2 ...
## $ msf : num 12.98 5.47 12.64 6.33 25.13 ...
## $ msc : num 6.6 2.36 6.95 3.38 15.18 ...

Colocaremos os fatores como fatores e a variável resposta como numérca


# transformando os dados em fator--------
ft<-as.factor(a$trat) # tratamentos
fb<-as.factor(a$bloc) # blocos
f1<-as.factor(a$prog) # progenie
f2<-as.factor(a$adub) # tipo de adubo
resp<-as.numeric(a$msf)# variável resposta
# reunindo em novo data -------
a1<-data.frame(ft,fb,f1,f2,resp)
head(a1)
## ft fb f1 f2 resp
## 1 1 1 A 1 12.98
## 2 2 1 A 2 5.47
## 3 3 1 A 3 12.64
## 4 4 1 A 4 6.33
## 5 5 1 B 1 25.13
## 6 6 1 B 2 6.62

Utilizaremos o pacote ExpDes. Se este já estiver instalado no seu PC, utilize o comando require(...) para ativá-lo.
# usando o ExpDes
require(ExpDes)
## Loading required package: ExpDes
## Warning: package 'ExpDes' was built under R version 3.2.5

Após ativar o ExpDes, digite na janela do console o comando ??fat... e veja qual opção melhor se encaixa aos seus
dados. Aqui pode haver alguma variação em fat2.rbd ou fat2.dbc, se você instalou a versão do pacote em inglês ou
português.
??fat2.rbd
## starting httpd help server ...
## done

Após identificar, na janela do help, qual subrotina se encaixa aos seus dados, copie-a e cole na janelo do seu editor.
Lembrando os nomes dados aos vetores no objeto a1, informe quais são os vetores dos fatores (f1, f2...), qual é a
variável resposta em estudo (resp). Informe ainda qual o tipo de teste (tukey), quais os nomes de saída dos fatores (em
fac.names("Fulano", "Beltrano") e quais são os níveis de significância para os testes F e t.

Dica 1: se o teste F não foi significativo, o ExpDes não faz o desdobramento. Para forçá-lo a fazer o desdobramento
coloque o nível de significância mais alto.

Dica 2: este pacote também faz ajuste de modelos até o 3º grau. Para fazê-lo indique no comando quali=c(...) qual
dos fatores é quantitativo. Basta colocar FALSE no lugar de TRUE
fat2.rbd(f1, f2, fb, resp,
quali = c(TRUE, TRUE), mcomp = "tukey",
fac.names = c("F1", "F2"), sigT = 0.05, sigF = 0.05)
## ------------------------------------------------------------------------
## Legend:

27
## FACTOR 1: F1
## FACTOR 2: F2
## ------------------------------------------------------------------------
##
##
## Analysis of Variance Table
## ------------------------------------------------------------------------
## DF SS MS Fc Pr>Fc
## Block 3 128.82 42.940 1.6543 0.20725
## F1 1 29.36 29.357 1.1310 0.29964
## F2 3 693.87 231.291 8.9106 0.00053
## F1*F2 3 32.07 10.688 0.4118 0.74624
## Residuals 21 545.09 25.957
## Total 31 1429.21
## ------------------------------------------------------------------------
## CV = 42.21 %
##
## ------------------------------------------------------------------------
## Shapiro-Wilk normality test
## p-value: 0.698664
## According to Shapiro-Wilk normality test at 5% of significance, residuals can be
considered normal.
## ------------------------------------------------------------------------
##
## Not significant interaction: analyzing the simple effect
## ------------------------------------------------------------------------
## F1
## According to the F test, the means of this factor are statistical equal.
## Levels Means
## 1 A 11.11187
## 2 B 13.02750
## ------------------------------------------------------------------------
## F2
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 1 17.99
## a 4 13.1075
## a 3 12.22375
## b 2 4.9575
## ------------------------------------------------------------------------

E para a variável resposta msc como seria? Volte no bloco de comandos "Transformando dados em fator" e mude a
variável resposta de a msf para msc. Execute novamente todos os comandos daquela linha para baixo.

Fatorial duplo: progênies de eucalípto

Passo a passo

Utilizaremos os dados simulados de um fatorial duplo, em dbc. Os fatores em estudo são 2 progênies de plantas (A,B)
e 4 tipos de adubo (1, 2, 3, 4). As variáveis resposta são a produção de matéria seca da parte aérea(msf) ou de
caule(msc) de mudas de eucalipto. O objetivo é saber qual tipo de adubo permite maior produção de folhas ou caule
dentro dos níveis de progênies.

28
Neste exemplo, calcularemos o QMr atraves do comando aov(...). Mas criaremos rotinas que irão calcular novamente
as somas de quadrados de blocos, tratamentos e novamente do residuo, sendo estes reunidos em uma matriz mais
parecida com os quadros de anova que estamos acostumados. Faremos o mesmo para os demais fatores (f1 e f2),
para interação f12 e para os desdobramentos. Depois utilizaremos o pacote agricolae para fazer os testes de médias.
No entanto devemos lembrar que a decomposiçõa dos efeitos dos fatores na anova não altera nossos procedimentos
para o teste de média. Pois para o teste de média bastaria ter o valor do QMr.

a<-read.table("fat2_prog.txt",h=T)# importando os dados


head(a)
## trat bloc prog adub msf msc
## 1 1 1 A 1 12.98 6.60
## 2 2 1 A 2 5.47 2.36
## 3 3 1 A 3 12.64 6.95
## 4 4 1 A 4 6.33 3.38
## 5 5 1 B 1 25.13 15.18
## 6 6 1 B 2 6.62 3.47
str(a)
## 'data.frame': 32 obs. of 6 variables:
## $ trat: int 1 2 3 4 5 6 7 8 1 2 ...
## $ bloc: int 1 1 1 1 1 1 1 1 2 2 ...
## $ prog: Factor w/ 2 levels "A","B": 1 1 1 1 2 2 2 2 1 1 ...
## $ adub: int 1 2 3 4 1 2 3 4 1 2 ...
## $ msf : num 12.98 5.47 12.64 6.33 25.13 ...
## $ msc : num 6.6 2.36 6.95 3.38 15.18 ...

Transformando os dados em fatores ou numéricos


ft<-as.factor(a$trat) # tratamentos
fb<-as.factor(a$bloc)
f1<-as.factor(a$prog) # progenie
f2<-as.factor(a$adub) # tipo de adubo
resp<-as.numeric(a$msf)# variável resposta

Reunindo em novo data


a1<-data.frame(ft,fb,f1,f2,resp)
head(a1)
## ft fb f1 f2 resp
## 1 1 1 A 1 12.98
## 2 2 1 A 2 5.47
## 3 3 1 A 3 12.64
## 4 4 1 A 4 6.33
## 5 5 1 B 1 25.13
## 6 6 1 B 2 6.62

Anova apenas com tratamentos e blocos


ane0 <-aov(resp~fb+ft, data=a1)
summary(ane0)
## Df Sum Sq Mean Sq F value Pr(>F)
## fb 3 128.8 42.94 1.654 0.20725
## ft 7 755.3 107.90 4.157 0.00514 **
## Residuals 21 545.1 25.96
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
29
df.residual(ane0) # gl do residuo
## [1] 21
sum(residuals(ane0)^2) # SQresiduo
## [1] 545.0921
QMr<-sum(residuals(ane0)^2)/df.residual(ane0)
QMr
## [1] 25.95677

Função para SQs


fu1<-function(x){
term1<-sum((tapply(resp,x,sum)^2)/tapply(resp,x,length))
term2<-((sum(tapply(resp,x,sum)))^2)/sum(tapply(resp,x,length))
sq<-term1-term2
return(sq)}

Aplicando a fu1 para SQs principais e reunindo por linhanda com rbind(...)
vsq<-rbind(vb<-fu1(fb),
vt<-fu1(ft),
vtotal<-fu1(fb:f1:f2),
vresiduo<-fu1(fb:f1:f2)-fu1(ft)-fu1(fb),
vf1<-fu1(f1),
vf2<-fu1(f2),
vf1i2<-fu1(f1:f2)-fu1(f1)-fu1(f2))

Colocando nomes nas linhas do objeto vsq


rownames(vsq)<-c("bloc", "trat","total",
"res", "f1", "f2", "f1i2")
vsq
## [,1]
## bloc 128.81966
## trat 755.29512
## total 1429.20690
## res 545.09212
## f1 29.35695
## f2 693.87281
## f1i2 32.06536

Calculando os gls
vgl<-c(glb<-length(levels(fb))-1,
glt<-length(levels(ft))-1,
gltotal<-length(levels(fb:f1:f2))-1,
glresiduo<-gltotal-glb-glt,
gl1<-length(levels(f1))-1,
gl2<-length(levels(f2))-1,
gl1i2<-gl1*gl2)

Reunindo em uma matriz


ane1<-cbind(vsq,
vgl,
vqm<-vsq/vgl,
30
vfcal<-vqm/vqm[4,1],
p_valor<-pf(vfcal, vgl, gltotal-glb-glt,lower.tail = FALSE))
ane1
## vgl
## bloc 128.81966 3 42.93989 1.6542848 0.2072465061
## trat 755.29512 7 107.89930 4.1568852 0.0051398843
## total 1429.20690 31 46.10345 1.7761629 0.0863900570
## res 545.09212 21 25.95677 1.0000000 0.5000000000
## f1 29.35695 1 29.35695 1.1309942 0.2996401348
## f2 693.87281 3 231.29094 8.9106218 0.0005274477
## f1i2 32.06536 3 10.68845 0.4117791 0.7462352098

Identificando as colunas
colnames(ane1) #veja que o vetor de GL tem nomes
## [1] "" "vgl" "" "" ""
colnames(ane1)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
ane1
## SQ GL QM Fcal P_valor
## bloc 128.81966 3 42.93989 1.6542848 0.2072465061
## trat 755.29512 7 107.89930 4.1568852 0.0051398843
## total 1429.20690 31 46.10345 1.7761629 0.0863900570
## res 545.09212 21 25.95677 1.0000000 0.5000000000
## f1 29.35695 1 29.35695 1.1309942 0.2996401348
## f2 693.87281 3 231.29094 8.9106218 0.0005274477
## f1i2 32.06536 3 10.68845 0.4117791 0.7462352098

Arredondando os valores
round(ane1,dig=3)
## SQ GL QM Fcal P_valor
## bloc 128.820 3 42.940 1.654 0.207
## trat 755.295 7 107.899 4.157 0.005
## total 1429.207 31 46.103 1.776 0.086
## res 545.092 21 25.957 1.000 0.500
## f1 29.357 1 29.357 1.131 0.300
## f2 693.873 3 231.291 8.911 0.001
## f1i2 32.065 3 10.688 0.412 0.746

Anova dos desdobramentos


levels(f1)
## [1] "A" "B"
levels(f2)
## [1] "1" "2" "3" "4"
# Qual adubo produz mais dentro de cada progene desdobraremos f2 d/f1...

# Fazendo os recortes no banco de dados


f1_a<-subset(a1, f1=="A") #f2 d/ f1=A
f1_b<-subset(a1, f1=="B") #f2 d/ f1=B
f1_a

31
## ft fb f1 f2 resp
## 1 1 1 A 1 12.98
## 2 2 1 A 2 5.47
## 3 3 1 A 3 12.64
## 4 4 1 A 4 6.33
## 9 1 2 A 1 10.80
## 10 2 2 A 2 7.06
## 11 3 2 A 3 14.50
## 12 4 2 A 4 23.66
## 17 1 3 A 1 22.27
## 18 2 3 A 2 2.51
## 19 3 3 A 3 13.62
## 20 4 3 A 4 10.87
## 25 1 4 A 1 19.39
## 26 2 4 A 2 5.01
## 27 3 4 A 3 8.07
## 28 4 4 A 4 2.61

Criaremos uma nova function


fu2<-function(x){
somqy<-tapply(x$resp,x$f2,sum)^2
n<-tapply(x$resp,x$f2,length)
ter1<-sum(somqy/n)
qsomy<-sum(tapply(x$resp,x$f2,sum))^2
t<-sum(n)
ter2<-qsomy/t
SQ<-ter1-ter2
GL<-length(somqy)-1
QM<-SQ/GL
Fcal<- QM/(sum(residuals(ane0)^2)/df.residual(ane0))
PV<-round(c(pf(Fcal, GL, df.residual(ane0),
lower.tail = FALSE)), dig=3)
vetnum<-round(c(SQ,GL,QM,Fcal,PV),dig=3)
return(vetnum)
}

Aplicando a fu2 nos recortes


fu2(f1_a)
## [1] 264.021 3.000 88.007 3.391 0.037
fu2(f1_b)
## [1] 461.917 3.000 153.972 5.932 0.004

Reunindo numa matriz


ane2<-rbind(fu2(f1_a),fu2(f1_b))

Nomeando colunas e linhas


colnames(ane2)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
row.names(ane2)<-c("f2d/f1=A", "f2d/f1=B")
ane2
## SQ GL QM Fcal P_valor
## f2d/f1=A 264.021 3 88.007 3.391 0.037
## f2d/f1=B 461.917 3 153.972 5.932 0.004
32
Neste caso o teste F não é conclusivo, pois temos mais de um contraste. Então faremos o teste de tukey paras as
medias de f2 dentro dos níveis f1

tapply(f1_a$resp, f1_a$f2, mean) # lembrando as medias f2 d progene A


## 1 2 3 4
## 16.3600 5.0125 12.2075 10.8675
tapply(f1_b$resp, f1_b$f2, mean) # lembrando as medias f2 d progene B
## 1 2 3 4
## 19.6200 4.9025 12.2400 15.3475

Depois de ter instalado o pacote no seu pc


require(agricolae) # carregando pacote
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3
f2d/f1_a

tk<-HSD.test(f1_a$resp,f1_a$f2,glresiduo,vresiduo/glresiduo,
alpha=0.05,group=TRUE, main = NULL,console=FALSE)
tk[5]
## $groups
## trt means M
## 1 1 16.3600 a
## 2 3 12.2075 ab
## 3 4 10.8675 ab
## 4 2 5.0125 b

f2d/f1_b
tk<-HSD.test(f1_b$resp,f1_b$f2,glresiduo,vresiduo/glresiduo,
alpha=0.05,group=TRUE, main = NULL,console=FALSE)
tk[5]
## $groups
## trt means M
## 1 1 19.6200 a
## 2 4 15.3475 a
## 3 3 12.2400 ab
## 4 2 4.9025 b

Fatorial triplo: dados simulados para experimento com milho

Obtenção rápida do QMr e teste de médias

Usaremos os dados simulados de um fatorial triplo com 12 tratamentos, sendo: 3 cultivares (A, B, C); 2 níveis de
calagem (0, 1); 2 níveis de aplicação de fósforo (0, 1); 3 variáveis resposta: produtividade (t/ha), teor de K no solo e
teor de N no solo

Importando e verificando os dados


a<-read.table("fat3_milho_sil.txt",h=T)# importando os dados
str(a)
## 'data.frame': 36 obs. of 8 variables:
## $ trat : int 1 2 3 4 5 6 7 8 9 10 ...
33
## $ bloc : int 1 1 1 1 1 1 1 1 1 1 ...
## $ cul : Factor w/ 3 levels "A","B","C": 1 1 1 1 2 2 2 2 3 3 ...
## $ cal : int 0 0 1 1 0 0 1 1 0 0 ...
## $ fos : int 0 1 0 1 0 1 0 1 0 1 ...
## $ tha : num 17.2 32.4 31.3 64.1 19.3 33.8 29.3 52 26.6 40.4 ...
## $ ksolo: num 23.7 59.2 64.9 40.4 26.1 ...
## $ nsolo: num 20.3 21.2 35.8 72.7 33.2 ...
head(a)
## trat bloc cul cal fos tha ksolo nsolo
## 1 1 1 A 0 0 17.2 23.71 20.34
## 2 2 1 A 0 1 32.4 59.22 21.23
## 3 3 1 A 1 0 31.3 64.91 35.80
## 4 4 1 A 1 1 64.1 40.36 72.67
## 5 5 1 B 0 0 19.3 26.15 33.16
## 6 6 1 B 0 1 33.8 68.51 46.30

Transformando os dados em fator


ft<-as.factor(a$trat) # tratamentos
fb<-as.factor(a$bloc) # bloco
f1<-as.factor(a$cul) # cultivar
f2<-as.factor(a$cal) # calagem
f3<-as.factor(a$fos) # fósforo
resp<-as.numeric(a$tha)# variável resposta

Reunindo em novo data frame


a1<-data.frame(ft,fb,f1,f2,f3,resp)
head(a1)
## ft fb f1 f2 f3 resp
## 1 1 1 A 0 0 17.2
## 2 2 1 A 0 1 32.4
## 3 3 1 A 1 0 31.3
## 4 4 1 A 1 1 64.1
## 5 5 1 B 0 0 19.3
## 6 6 1 B 0 1 33.8

Anova apenas com tratamentos


ane0 <-aov(resp~fb+ft, data=a1)
summary(ane0)
## Df Sum Sq Mean Sq F value Pr(>F)
## fb 2 21 10.6 1.636 0.218
## ft 11 7179 652.6 100.510 3.57e-16 ***
## Residuals 22 143 6.5
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
GLr<-df.residual(ane0) # gl do residuo
GLr
## [1] 22
QMr<-sum(residuals(ane0)^2)/df.residual(ane0)
QMr
## [1] 6.49303
34
Comentário: já obtivemos o GLr e QMr, se não temos interesse em relalizar a decomposição dos efeitos dos fatores e
testá-los pelo teste F, então partiremos diretamente para o teste de médias. Utilizaremos o pacote agricolae
require(agricolae) # carregando pacote
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3
Teste de tukey para as médias de f1(cultivares) independentemente dos níveis de f2 e f3

tk1<-HSD.test(resp, f1, GLr, QMr,


alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk1[[5]]
## trt means M
## 1 A 36.96667 a
## 2 C 36.61667 a
## 3 B 34.86667 a

OBS: adapte o comando tk1 para comparar as médias de f2 e f.

Agora vamos comparar as medias de f3 dentro dos níveis de f1 e f2

Tukey f1d/f2...d/f3...

levels(f2)# níveis de f2 calagem

levels(f3) # níveis de f3 fósforo


expand.grid(levels(f2),levels(f3)) # combina os níveis para lhe
## Var1 Var2
## 1 0 0
## 2 1 0
## 3 0 1
## 4 1 1
# auxiliar a nomear os recortes

Fazendo os recortes
f23_00<-subset(a1,f2=="0" & f3=="0")
f23_10<-subset(a1,f2=="1" & f3=="0")
f23_01<-subset(a1,f2=="0" & f3=="1")
f23_11<-subset(a1,f2=="1" & f3=="1")

Criando uma função para o teste de Tukey considerando os desdobramentos. Lembre-se que o "objeto curinga" será o
recorte
futkd1<-function(x){
tkd1<-HSD.test(x$resp, x$f1, GLr, QMr,
alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk<-tkd1[[5]]
return(tk)}

Aplicando a futkd1

35
futkd1(f23_00)
## trt means M
## 1 C 24.53333 a
## 2 B 19.90000 a
## 3 A 12.56667 b
futkd1(f23_10)
## trt means M
## 1 A 33.63333 a
## 2 B 32.50000 a
## 3 C 30.16667 a
futkd1(f23_01)
## trt means M
## 1 C 44.00000 a
## 2 B 36.20000 b
## 3 A 34.43333 b
futkd1(f23_11)
## trt means M
## 1 A 67.23333 a
## 2 B 50.86667 b
## 3 C 47.76667 b

Atividade 1: Veja que construimos 4 estruturas semelhantes com o comando HSD.test. Nelas só temos variação do
recorte com os dados de entrada. Seria possível "automatizar" ainda mais aquela rotina?

Atividade 2: Compare as médias de f3(fosforo)dentro dos níveis de f2 (calagem)idependentemente do cultivar


levels(f2)
## [1] "0" "1"
# faz os recortes
f2_0<-subset(a1,f2=="0")
f2_1<-subset(a1,f2=="1")
futk3<-function(x){
tkd2<-HSD.test(x$resp,x$f3, GLr, QMr,
alpha = 0.05, group=TRUE, main = NULL,console=FALSE)
return(tkd2[[5]])}

Aplicando a função futk3 nos recortes de f2...


futk3(f2_0)
## trt means M
## 1 1 38.21111 a
## 2 0 19.00000 b
futk3(f2_1)
## trt means M
## 1 1 55.28889 a
## 2 0 32.10000 b

Atividade 3: Como você faria para as demais variáveis resposta?

36
Atividade 4: Faça o teste de correlação entre as 3 variáveis resposta.
head(a) # lembrando quais são as variáveis resposta
## trat bloc cul cal fos tha ksolo nsolo
## 1 1 1 A 0 0 17.2 23.71 20.34
## 2 2 1 A 0 1 32.4 59.22 21.23
## 3 3 1 A 1 0 31.3 64.91 35.80
## 4 4 1 A 1 1 64.1 40.36 72.67
## 5 5 1 B 0 0 19.3 26.15 33.16
## 6 6 1 B 0 1 33.8 68.51 46.30
require(agricolae)# o teste está em subrotinas do agricolae

a[,6:8] # variáveis resposta de interesse para o teste


## tha ksolo nsolo
## 1 17.2 23.71 20.34
## 2 32.4 59.22 21.23
## 3 31.3 64.91 35.80
## 4 64.1 40.36 72.67
## 5 19.3 26.15 33.16
## 6 33.8 68.51 46.30
## 7 29.3 33.25 40.86
## 8 52.0 119.66 53.95
## 9 26.6 37.49 33.10
## 10 40.4 63.59 48.83
## 11 28.3 49.28 23.77
## 12 46.5 118.79 53.12
## 13 9.5 17.10 11.15
## 14 36.1 84.61 60.38
## 15 35.2 66.71 34.88
## 16 66.2 120.29 99.49
## 17 22.0 35.26 25.29
## 18 39.1 58.36 30.40
## 19 34.3 69.03 43.82
## 20 52.0 116.25 87.44
## 21 24.6 34.88 31.61
## 22 44.6 104.89 35.84
## 23 30.1 86.69 46.95
## 24 49.3 82.15 65.91
## 25 11.0 15.16 12.68
## 26 34.8 63.61 27.07
## 27 34.4 71.53 44.06
## 28 71.4 44.94 120.02
## 29 18.4 24.99 23.69
## 30 35.7 72.40 28.63
## 31 33.9 38.57 52.94
## 32 48.6 111.86 65.07
## 33 22.4 31.63 17.41
## 34 47.0 74.03 60.12
## 35 32.1 66.66 53.96
## 36 47.5 29.93 61.09
cp<-correlation(a[,6:8],method="pearson") # aplica o teste de correlação
##
## Correlation Analysis
##
37
## Method : pearson
## Alternative: two.sided

cp # na matriz $correlation temos os coeficientes


# na matriz $ pvalue temos os P_valores
## $correlation
## tha ksolo nsolo
## tha 1.00 0.62 0.88
## ksolo 0.62 1.00 0.50
## nsolo 0.88 0.50 1.00
##
## $pvalue
## tha ksolo nsolo
## tha 1.000000e+00 5.995737e-05 9.392487e-13
## ksolo 5.995737e-05 1.000000e+00 1.997065e-03
## nsolo 9.392487e-13 1.997065e-03 1.000000e+00
##
## $n.obs
## [1] 36

Fatorial triplo: dados simulados de um experimento com milho

Passo a passo

Fatorial triplo com dados simulados com 12 tratamentos, sendo: 3 cultivares; 2 níveis de calagem; 2 níveis de
aplicação de fósforo
a<-read.table("fat3_milho_sil.txt",h=T)# importando os dados
head(a)
## trat bloc cul cal fos tha ksolo nsolo
## 1 1 1 A 0 0 17.2 23.71 20.34
## 2 2 1 A 0 1 32.4 59.22 21.23
## 3 3 1 A 1 0 31.3 64.91 35.80
## 4 4 1 A 1 1 64.1 40.36 72.67
## 5 5 1 B 0 0 19.3 26.15 33.16
## 6 6 1 B 0 1 33.8 68.51 46.30
str(a)
## 'data.frame': 36 obs. of 8 variables:
## $ trat : int 1 2 3 4 5 6 7 8 9 10 ...
## $ bloc : int 1 1 1 1 1 1 1 1 1 1 ...
## $ cul : Factor w/ 3 levels "A","B","C": 1 1 1 1 2 2 2 2 3 3 ...
## $ cal : int 0 0 1 1 0 0 1 1 0 0 ...
## $ fos : int 0 1 0 1 0 1 0 1 0 1 ...
## $ tha : num 17.2 32.4 31.3 64.1 19.3 33.8 29.3 52 26.6 40.4 ...
## $ ksolo: num 23.7 59.2 64.9 40.4 26.1 ...
## $ nsolo: num 20.3 21.2 35.8 72.7 33.2 ...

Transformando os dados em fator


ft<-as.factor(a$trat) # tratamentos
fb<-as.factor(a$bloc)
f1<-as.factor(a$cul) # cultivar

38
f2<-as.factor(a$cal) # calagem
f3<-as.factor(a$fos) # fósforo
resp<-as.numeric(a$tha)# variável resposta

Reunindo em novo data


a1<-data.frame(ft,fb,f1,f2,f3,resp)
head(a1)
## ft fb f1 f2 f3 resp
## 1 1 1 A 0 0 17.2
## 2 2 1 A 0 1 32.4
## 3 3 1 A 1 0 31.3
## 4 4 1 A 1 1 64.1
## 5 5 1 B 0 0 19.3
## 6 6 1 B 0 1 33.8

Anova apenas com tratamentos


ane0 <-aov(resp~fb+ft, data=a1)
summary(ane0)
## Df Sum Sq Mean Sq F value Pr(>F)
## fb 2 21 10.6 1.636 0.218
## ft 11 7179 652.6 100.510 3.57e-16 ***
## Residuals 22 143 6.5
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
df.residual(ane0) # gl do residuo
## [1] 22
sum(residuals(ane0)^2) # SQresiduo
## [1] 142.8467
QMr<-sum(residuals(ane0)^2)/df.residual(ane0)
QMr
## [1] 6.49303

Função para SQs


fu1<-function(x){
term1<-sum((tapply(resp,x,sum)^2)/tapply(resp,x,length))
term2<-((sum(tapply(resp,x,sum)))^2)/sum(tapply(resp,x,length))
sq<-term1-term2
return(sq)}

Aplicando a fu1 para as SQs principais


vsq<-rbind(vb<-fu1(fb),
vt<-fu1(ft),
vtotal<-fu1(fb:f1:f2:f3),
vresiduo<-fu1(fb:f1:f2:f3)-fu1(ft)-fu1(fb),
vf1<-fu1(f1),
vf2<-fu1(f2),
vf3<-fu1(f3),
vf12<-fu1(f1:f2)-fu1(f1)-fu1(f2),
vf13<-fu1(f1:f3)-fu1(f1)-fu1(f3),

39
vf23<-fu1(f2:f3)-fu1(f2)-fu1(f3),
vf123<-fu1(f1:f2:f3)-vf1-vf2-vf3-vf12-vf13-vf23)

Outra maneira de obter a interação tripla seria:

vf123=fu1(f1:f2:f3)-fu1(f1:f2)-fu1(f1:f3)-fu1(f2:f3)+fu1(f1)+fu1(f2)+fu1(f3)

Conferindo os resultados:
Lembre-se de que os tratamentos encerram todos os efeitos simples da interação, portanto,
SQ(simples+interação)=SQtratamentos, então:

vt<-vf1+vf2+vf3+vf12+vf13+vf23+vf123 vt

Colocando nomes nas linhas


rownames(vsq)<-c("bloc", "trat","total",
"res", "f1", "f2", "f3",
"f1i2", "f1i3", "f2i3","f1i2i3")
vsq
## [,1]
## bloc 21.24667
## trat 7178.73667
## total 7342.83000
## res 142.84667
## f1 30.38000
## f2 2049.07111
## f3 4044.96000
## f1i2 751.01556
## f1i3 194.24000
## f2i3 35.60111
## f1i2i3 73.46889

Calculando os gls
vgl<-c(glb<-length(levels(fb))-1,
glt<-length(levels(ft))-1,
gltotal<-length(levels(fb:f1:f2:f2))-1,
glresiduo<-gltotal-glb-glt,
gl1<-length(levels(f1))-1,
gl2<-length(levels(f2))-1,
gl3<-length(levels(f3))-1,
gl1i2<-gl1*gl2,
gl1i3<-gl1*gl3,
gl2i3<-gl2*gl3,
gl123<-gl1*gl2*gl3)

Reunindo em uma matriz


ane1<-cbind(vsq,
vgl,
vqm<-vsq/vgl,
vfcal<-vqm/vqm[4,1],
p_valor<-pf(vfcal, vgl, gltotal-glb-glt,
lower.tail = FALSE))

Identificando as colunas
colnames(ane1)

40
## [1] "" "vgl" "" "" ""
colnames(ane1)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
ane1
## SQ GL QM Fcal P_valor
## bloc 21.24667 2 10.62333 1.636113 2.175559e-01
## trat 7178.73667 11 652.61242 100.509684 3.571169e-16
## total 7342.83000 35 209.79514 32.310821 1.532895e-12
## res 142.84667 22 6.49303 1.000000 5.000000e-01
## f1 30.38000 2 15.19000 2.339432 1.198972e-01
## f2 2049.07111 1 2049.07111 315.580094 1.561996e-14
## f3 4044.96000 1 4044.96000 622.969524 1.242833e-17
## f1i2 751.01556 2 375.50778 57.832439 1.736180e-09
## f1i3 194.24000 2 97.12000 14.957577 7.914325e-05
## f2i3 35.60111 1 35.60111 5.482973 2.866498e-02
## f1i2i3 73.46889 2 36.73444 5.657519 1.041372e-02

Arredondando os valores
round(ane1,dig=3)
## SQ GL QM Fcal P_valor
## bloc 21.247 2 10.623 1.636 0.218
## trat 7178.737 11 652.612 100.510 0.000
## total 7342.830 35 209.795 32.311 0.000
## res 142.847 22 6.493 1.000 0.500
## f1 30.380 2 15.190 2.339 0.120
## f2 2049.071 1 2049.071 315.580 0.000
## f3 4044.960 1 4044.960 622.970 0.000
## f1i2 751.016 2 375.508 57.832 0.000
## f1i3 194.240 2 97.120 14.958 0.000
## f2i3 35.601 1 35.601 5.483 0.029
## f1i2i3 73.469 2 36.734 5.658 0.010

Anova dos desdobramentos


levels(f1)
## [1] "A" "B" "C"
levels(f2)
## [1] "0" "1"
levels(f3)
## [1] "0" "1"

Qual cultivar produz mais dentro de cada nível de calagem e adubo? desdobraremos f1 d/f2... d/f3...

Faremos os recortes no banco de dados


expand.grid(levels(f2),levels(f3))#cobinações possíveis
## Var1 Var2
## 1 0 0
## 2 1 0
## 3 0 1
## 4 1 1

41
Fazendo os recortes no banco de dados
f23_00<-subset(a1, f2=="0"&f3=="0") #f1 d/f2=0 d/f3=0
f23_10<-subset(a1, f2=="1"&f3=="0") #f1 d/f2=1 d/f3=0
f23_01<-subset(a1, f2=="0"&f3=="1") #f1 d/f2=0 d/f3=1
f23_11<-subset(a1, f2=="1"&f3=="1") #f1 d/f2=1 d/f3=1

Criaremos uma nova function


fu2<-function(x){
somqy<-tapply(x$resp,x$f1,sum)^2
n<-tapply(x$resp,x$f1,length)
ter1<-sum(somqy/n)
qsomy<-sum(tapply(x$resp,x$f1,sum))^2
t<-sum(n)
ter2<-qsomy/t
SQ<-ter1-ter2
GL<-length(somqy)-1
QM<-SQ/GL
Fcal<- QM/(sum(residuals(ane0)^2)/df.residual(ane0))
PV<-round(c(pf(Fcal, GL, df.residual(ane0),
lower.tail = FALSE)), dig=3)
vetnum<-round(c(SQ,GL,QM,Fcal,PV),dig=3)
return(vetnum)
}

Aplicando a função fu2 aos recortes


fu2(f23_00)
## [1] 218.447 2.000 109.223 16.822 0.000
fu2(f23_10)
## [1] 18.747 2.000 9.373 1.444 0.258
fu2(f23_01)
## [1] 155.482 2.000 77.741 11.973 0.000
fu2(f23_11)
## [1] 656.429 2.000 328.214 50.549 0.000

Reunindo numa matriz


ane2<-rbind(fu2(f23_00),
fu2(f23_10),
fu2(f23_01),
fu2(f23_11))
ane2
## [,1] [,2] [,3] [,4] [,5]
## [1,] 218.447 2 109.223 16.822 0.000
## [2,] 18.747 2 9.373 1.444 0.258
## [3,] 155.482 2 77.741 11.973 0.000
## [4,] 656.429 2 328.214 50.549 0.000

Nomeando colunas
colnames(ane2)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
row.names(ane2)<-c("f1d/f2=0 d/f3=0",
42
"f1d/f2=1 d/f3=0",
"f1d/f2=0 d/f3=1",
"f1d/f2=1 d/f3=1")
ane2
## SQ GL QM Fcal P_valor
## f1d/f2=0 d/f3=0 218.447 2 109.223 16.822 0.000
## f1d/f2=1 d/f3=0 18.747 2 9.373 1.444 0.258
## f1d/f2=0 d/f3=1 155.482 2 77.741 11.973 0.000
## f1d/f2=1 d/f3=1 656.429 2 328.214 50.549 0.000

Neste caso o teste F não é conclusivo, pois temos mais de um contraste para níveis de f1. Então faremos o teste de
Tukey para as médias de f1 d/ dos níveis f2 e f3
tapply(f23_00$resp, f23_00$f1, mean) # mostra as medias
## A B C
## 12.56667 19.90000 24.53333
tapply(f23_01$resp, f23_01$f1, mean)
## A B C
## 34.43333 36.20000 44.00000
tapply(f23_10$resp, f23_10$f1, mean)
## A B C
## 33.63333 32.50000 30.16667
tapply(f23_11$resp, f23_11$f1, mean)
## A B C
## 67.23333 50.86667 47.76667

Depois de ter instalado o pacoteagricolae no seu pc


require(agricolae) # carregando pacote
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3
Criando uma função para o teste de Tukey para f1 d/f2...d/f3...

fu3<-function(x){
tk<-HSD.test(x$resp,x$f1,glresiduo,QMr,
alpha=0.05,group=TRUE, main = NULL,console=FALSE)
return(tk[5])
}

Aplicando a função fu3 aos recortes


fu3(f23_00)# f1 d/f2=0 d/f3=0
## $groups
## trt means M
## 1 C 24.53333 a
## 2 B 19.90000 a
## 3 A 12.56667 b
fu3(f23_01)

43
## $groups
## trt means M
## 1 C 44.00000 a
## 2 B 36.20000 b
## 3 A 34.43333 b
fu3(f23_10)
## $groups
## trt means M
## 1 A 33.63333 a
## 2 B 32.50000 a
## 3 C 30.16667 a
fu3(f23_11)
## $groups
## trt means M
## 1 A 67.23333 a
## 2 B 50.86667 b
## 3 C 47.76667 b

Parcelas subdivididas: produtividade de milho

Usando o ExpDes
Exemplo adaptado de Banzatto & Kronka (2008), sendo resp= produtividade de milho em kg/ha; bloc= blocos (4).
Fatorial (4 x 3), sendo:
4 adubos(f1)= adubaçao com salitre do chile (sc), sulfato de amonio (sa), ureia(u), calnitro (cn)
3 dos(f2)= doses de N ( 10, 40 ou 70 kg/ha)

Experimento em parcelas subdividas, sendo:


parc= bloc x adu (16)
spar= bloc x adu x dos (48)

Os objetivos são:
1. comparar as fontes(f1) independentemente de dose(f2)
2. comparar as doses(f2) dentro de cada fonte(f1)
3. comparar as fontes(f1) dentro de cada dose(f2)

Importando os dados.
a<-read.table("par_sub2.txt", h=T)
head(a)
## par spar bloc adu dos resp
## 1 1sc 1sc10 1 sc 10 2747
## 2 1sc 1sc40 1 sc 40 2889
## 3 1sc 1sc70 1 sc 70 3578
## 4 1sa 1sa10 1 sa 10 3164
## 5 1sa 1sa40 1 sa 40 3831
## 6 1sa 1sa70 1 sa 70 4107
str(a)
## 'data.frame': 48 obs. of 6 variables:
## $ par : Factor w/ 16 levels "1cn","1sa","1sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ spar: Factor w/ 48 levels "1cn10","1cn40",..: 7 8 9 4 5 6 10 11 12 1 ...
## $ bloc: int 1 1 1 1 1 1 1 1 1 1 ...
44
## $ adu : Factor w/ 4 levels "cn","sa","sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ dos : int 10 40 70 10 40 70 10 40 70 10 ...
## $ resp: int 2747 2889 3578 3164 3831 4107 1902 2547 3364 2978 ...

Observe acima que os vetores das parcelas e subparcelas foram definidos anteriormente no próprio Excel. Nesta
rotina não usaremos estes vetores, pois o ExpDes já faz as combinações com os fatores em estudo para obtenção das
parcelas e subparcelas. Porém manteremos a estrutura da tabela de dados para ser utilizada em exemplos posteriores
onde aqueles vetores serão necessários.

Tranformando em fator
fspar<-as.factor(a$spar) # subparcelas
fpar<-as.factor(a$par) # parcelas
fb<-as.factor(a$bloc)
f1<-as.factor(a$adu)
f2<-as.factor(a$dos)
resp<-as.numeric(a$resp)

Conferindo o obejeto a1
length(levels(fspar)) # são 48 subparcelas
## [1] 48
length(levels(fpar)) # são 16 parcelas
## [1] 16
length(levels(fb)) # são 4 blocos
## [1] 4

Usaremos o pacote ExpDes. Ao ativá-lo poderá aparecer uma mensagem de advertência a respeito da versão do R
mais recomendada. Mas usaremos a versão do R3.2.0 sem maiores problemas.
require(ExpDes)
## Loading required package: ExpDes
## Warning: package 'ExpDes' was built under R version 3.2.5
No consol, faça uma busca com a palavra-chave split, relacionada a parcelas subdivididas. rbd diz respeito a
radomized blocs design

??split2.rbd
## starting httpd help server ...
## done

Copie a estrutura da rotina na janela do help e cole no editor do Rstudio. Posteriormente informe quais são os
vetores dos fatores (f1,f2,fb) e da variável resposta(resp) em estudo. Informe se os fatores são qualitativos(TRUE) ou
quantitativos(FALSE); se qualitativos qual o teste de médias será usado (tukey); em fac.names informe quais os
nomes de saída dos fatores; e finalmente defina quais os níveis de alpha para o teste F e Tukey(ou para o teste de
médias).
split2.rbd(f1, f2, fb, resp,
quali = c(TRUE, TRUE), mcomp = "tukey",
fac.names = c("Adubo", "Dose"), sigT = 0.05, sigF = 0.05)
## ------------------------------------------------------------------------
## Legend:
## FACTOR 1 (plot): Adubo
45
## FACTOR 2 (split-plot): Dose
## ------------------------------------------------------------------------
##
## ------------------------------------------------------------------------
## $`Analysis of Variance Table\n-----------------------------------------------------
-------------------\n`
## DF SS MS Fc Pr(>Fc)
## Adubo 3 2486093 828698 2.5815 0.11818
## Block 3 3198892 1066297 3.3216 0.07058 .
## Error a 9 2889146 321016
## Dose 2 4703630 2351815 31.5765 < 2e-16 ***
## Adubo*Dose 6 1286153 214359 2.8781 0.02945 *
## Error b 24 1787519 74480
## Total 47 16351434
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## ------------------------------------------------------------------------
## CV 1 = 18.63581 %
## CV 2 = 8.976448 %
##
##
##
## Significant interaction: analyzing the interaction
## ------------------------------------------------------------------------
##
## Analyzing Adubo inside of each level of Dose
## ------------------------------------------------------------------------
## DF SS MS Fc p.value
## Adubo : Dose 10 3.00000 933524.5 311174.8 1.986323 0.152462
## Adubo : Dose 40 3.00000 1856524.2 618841.4 3.950252 0.025249
## Adubo : Dose 70 3.00000 982197.5 327399.2 2.089888 0.13765
## Pooled Error 17.84912 2796221.2 156658.7
## ------------------------------------------------------------------------
##
##
## Adubo inside of Dose 10
## ------------------------------------------------------------------------
## According to F test, the means of this factor are not different.
##
## Levels Means
## 1 cn 2732.25
## 2 sa 3045.50
## 3 sc 2666.75
## 4 u 2365.50
## ------------------------------------------------------------------------
##
## Adubo inside of Dose 40
## ------------------------------------------------------------------------
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a sa 3541
## ab u 2865
## ab sc 2752.25
## b cn 2687.25
## ------------------------------------------------------------------------

46
##
## Adubo inside of Dose 70
## ------------------------------------------------------------------------
## According to F test, the means of this factor are not different.
##
## Levels Means
## 1 cn 3193.50
## 2 sa 3619.00
## 3 sc 3776.75
## 4 u 3238.75
## ------------------------------------------------------------------------
##
##
## Analyzing Dose inside of each level of Adubo
## ------------------------------------------------------------------------
## DF SS MS Fc p.value
## Dose : Adubo cn 2 628087.5 314043.75 4.216486 0.026958
## Dose : Adubo sa 2 774008.7 387004.33 5.196086 0.013336
## Dose : Adubo sc 2 3052014.0 1526007.00 20.488823 6e-06
## Dose : Adubo u 2 1535673.2 767836.58 10.309303 0.000587
## Error b 24 1787519.3 74479.97
## ------------------------------------------------------------------------
##
##
## Dose inside of Adubo cn
## ------------------------------------------------------------------------
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 70 3193.5
## ab 10 2732.25
## b 40 2687.25
## ------------------------------------------------------------------------
## ------------------------------------------------------------------------
##
##
## Dose inside of Adubo sa
## ------------------------------------------------------------------------
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 70 3619
## a 40 3541
## b 10 3045.5
## ------------------------------------------------------------------------
## ------------------------------------------------------------------------
##
##
## Dose inside of Adubo sc
## ------------------------------------------------------------------------
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 70 3776.75
## b 40 2752.25
## b 10 2666.75
## ------------------------------------------------------------------------

47
## ------------------------------------------------------------------------
##
##
## Dose inside of Adubo u
## ------------------------------------------------------------------------
## Tukey's test
## ------------------------------------------------------------------------
## Groups Treatments Means
## a 70 3238.75
## a 40 2865
## b 10 2365.5
## ------------------------------------------------------------------------
## ------------------------------------------------------------------------

Parcelas subdivididas: produtividade de milho

Obetenção rápida do QMr e teste de médias


Exemplo adaptado de Banzatto & Kronka (2008), sendo resp= produtividade de milho em kg/ha; bloc= blocos (4).
Fatorial (4 x 3), sendo:
4 adu(f1)= adubaçao com salitre do chile (sc), sulfato de amonio (sa), ureia(u), calnitro (cn)
3 dos(f2)= doses de N ( 10, 40 ou 70 kg/ha)

Experimento em parcelas subdividas, sendo:


parc= bloc x adu (16)
spar= bloc x adu x dos (48)

Os objetivos são:
1. comparar as fontes(f1) independentemente de dose(f2)
2. comparar as doses(f2) dentro de cada fonte(f1)
3. comparar as fontes(f1) dentro de cada dose(f2)

Importando os dados
a<-read.table("par_sub2.txt", h=T)
head(a)
## par spar bloc adu dos resp
## 1 1sc 1sc10 1 sc 10 2747
## 2 1sc 1sc40 1 sc 40 2889
## 3 1sc 1sc70 1 sc 70 3578
## 4 1sa 1sa10 1 sa 10 3164
## 5 1sa 1sa40 1 sa 40 3831
## 6 1sa 1sa70 1 sa 70 4107
str(a)
## 'data.frame': 48 obs. of 6 variables:
## $ par : Factor w/ 16 levels "1cn","1sa","1sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ spar: Factor w/ 48 levels "1cn10","1cn40",..: 7 8 9 4 5 6 10 11 12 1 ...
## $ bloc: int 1 1 1 1 1 1 1 1 1 1 ...
## $ adu : Factor w/ 4 levels "cn","sa","sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ dos : int 10 40 70 10 40 70 10 40 70 10 ...
## $ resp: int 2747 2889 3578 3164 3831 4107 1902 2547 3364 2978 ...

Tranformando em fator
fspar<-as.factor(a$spar) # subparcelas
fpar<-as.factor(a$par) # parcelas
fb<-as.factor(a$bloc)
48
f1<-as.factor(a$adu)
f2<-as.factor(a$dos)
resp<-as.numeric(a$resp)

Gerando novo data.frame


a1<-data.frame(fspar,fpar,fb,f1,f2,resp)
head(a1)
## fspar fpar fb f1 f2 resp
## 1 1sc10 1sc 1 sc 10 2747
## 2 1sc40 1sc 1 sc 40 2889
## 3 1sc70 1sc 1 sc 70 3578
## 4 1sa10 1sa 1 sa 10 3164
## 5 1sa40 1sa 1 sa 40 3831
## 6 1sa70 1sa 1 sa 70 4107
str(a1)
## 'data.frame': 48 obs. of 6 variables:
## $ fspar: Factor w/ 48 levels "1cn10","1cn40",..: 7 8 9 4 5 6 10 11 12 1 ...
## $ fpar : Factor w/ 16 levels "1cn","1sa","1sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ fb : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ f1 : Factor w/ 4 levels "cn","sa","sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ f2 : Factor w/ 3 levels "10","40","70": 1 2 3 1 2 3 1 2 3 1 ...
## $ resp : num 2747 2889 3578 3164 3831 ...

Conferindo o objeto a1
length(levels(fspar))
## [1] 48
length(levels(fpar))
## [1] 16
length(levels(fb))
## [1] 4

Anova geral
ane00<-summary(aov (resp~fb+(f1+f2)^2+Error(fb/f1)))
ane00
##
## Error: fb
## Df Sum Sq Mean Sq
## fb 3 3198892 1066297
##
## Error: fb:f1
## Df Sum Sq Mean Sq F value Pr(>F)
## f1 3 2486093 828698 2.581 0.118
## Residuals 9 2889146 321016
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## f2 2 4703630 2351815 31.576 1.9e-07 ***
## f1:f2 6 1286153 214359 2.878 0.0295 *
## Residuals 24 1787519 74480
49
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Porém para retirar as SQ e GL usaremos a ane01 abaixo


ane01<-aov(resp~fb+(f1+f2)^2+Error(fb/f1))
ane01
##
## Call:
## aov(formula = resp ~ fb + (f1 + f2)^2 + Error(fb/f1))
##
## Grand Mean: 3040.292
##
## Stratum 1: fb
##
## Terms:
## fb
## Sum of Squares 3198892
## Deg. of Freedom 3
##
## Estimated effects may be unbalanced
##
## Stratum 2: fb:f1
##
## Terms:
## f1 Residuals
## Sum of Squares 2486093 2889146
## Deg. of Freedom 3 9
##
## Residual standard error: 566.583
## 6 out of 9 effects not estimable
## Estimated effects may be unbalanced
##
## Stratum 3: Within
##
## Terms:
## f2 f1:f2 Residuals
## Sum of Squares 4703630 1286153 1787519
## Deg. of Freedom 2 6 24
##
## Residual standard error: 272.9102
## Estimated effects may be unbalanced

Extraindo GLr e SQr relativa a parcelas (resíduo_a) da ane01.


GLra<-df.residual(ane01[[3]]) # GLresiduo_a
GLra
## [1] 9
SQra<-sum(residuals(ane01[[3]])^2) # SQresidua_a
QMra<-SQra/GLra
QMra
## [1] 321016.3

Extraindo GLr e SQr relativa a subparcelas (resíduo_b)

50
GLrb<-df.residual(ane01[[4]]) # GLresiduo_b
SQrb<-sum(residuals(ane01[[4]])^2) # SQresidua_b
QMrb<-SQrb/GLrb
QMrb
## [1] 74479.97

Comentário: Já obtivemos os GLr e QMr, se não temos interesse em realizar a decomposição dos efeitos dos fatores e
testá-los pelo teste F,então partiremos diretamente para o teste de médias.

Utilizaremos o pacote agricolae


require(agricolae) # carregando pacote
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3

Efeito dos adubos(f1) com Tukey, independentemente da dose(f2)

OBS: usaremos o GLra e QMra


levels(f1) #apenas conferindo os níveis f1
## [1] "cn" "sa" "sc" "u"

Aplicando o teste de tukey para f1


tk1<-HSD.test(resp, f1, GLra,QMra,alpha=0.05,
group=TRUE, main = NULL,console=FALSE)
tk1[5] #tente rodar com com alpha 0.20!
## $groups
## trt means M
## 1 sa 3401.833 a
## 2 sc 3065.250 a
## 3 cn 2871.000 a
## 4 u 2823.083 a

Anova e Tukey f2 d/f1, ou seja, doses dentro de níveis de adubo

OBS: usaremos QMrb e Glrb


levels(f1)# lembrando os niveis de f1
## [1] "cn" "sa" "sc" "u"

Recortes de interesse
f1_cn<-subset(a1, f1=="cn")
f1_sa<-subset(a1, f1=="sa")
f1_sc<-subset(a1, f1=="sc")
f1_u<-subset(a1, f1=="u")

f1_cn # observe os níveis de f1 e f2 no recorte


## fspar fpar fb f1 f2 resp
## 10 1cn10 1cn 1 cn 10 2978
## 11 1cn40 1cn 1 cn 40 3451
## 12 1cn70 1cn 1 cn 70 3742
## 22 2cn10 2cn 2 cn 10 2769
## 23 2cn40 2cn 2 cn 40 2258
51
## 24 2cn70 2cn 2 cn 70 2498
## 34 3cn10 3cn 3 cn 10 2640
## 35 3cn40 3cn 3 cn 40 2478
## 36 3cn70 3cn 3 cn 70 3458
## 46 4cn10 4cn 4 cn 10 2542
## 47 4cn40 4cn 4 cn 40 2562
## 48 4cn70 4cn 4 cn 70 3076

Teste de Tukey para f2 d/f1, ou seja, dose d/adubo. Lembre-se que já fizemos os recortes de a1 e que neste caso
usaremos o GLrb e QMrb
futk1<-function(x){
tk<-HSD.test(x$resp,x$f2,GLrb,QMrb,alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
return(tk[[5]])
}

Aplicando a futk1 nos recortes


futk1(f1_cn) # Tukey para f2 d/f1=cn
## trt means M
## 1 70 3193.50 a
## 2 10 2732.25 ab
## 3 40 2687.25 b
futk1(f1_sa)
## trt means M
## 1 70 3619.0 a
## 2 40 3541.0 a
## 3 10 3045.5 b
futk1(f1_sc)
## trt means M
## 1 70 3776.75 a
## 2 40 2752.25 b
## 3 10 2666.75 b
futk1(f1_u)
## trt means M
## 1 70 3238.75 a
## 2 40 2865.00 a
## 3 10 2365.50 b

Tukey f1 d/f2

Uma situação comum, porém que exige de rotinas mais elaboras é testar os níveis do fator 1 dentro dos níveis do
fator 2. Para comparar médias de f1 d/f2 faz-se necessário calcular um novo GLrm e QMrm (m=médio).Mais
detalhes em Pimentel Gomes (2008), v15, ed15, pg165-171.

Calculando a variância comum (QMrm)

QMra # calculado anteriormente

QMrb # calculado anteriormente

52
n2= número de níves de f2
n2<-length(levels(f2)) # nº niveis do fator em estudo(f2)
QMrm<-(QMra+QMrb*(n2-1))/n2
QMrm # QMrmédio
## [1] 156658.7

Calculando o GL médio a f1 e f2
Sabemos que a fórmula é:

GLrm=(QMra+((n2-1)QMrb))2/(((QMra2)/GLra)+((((n2-1)QMrb)^2)/GLrb))

Para evitar erros de digitação vamos simplificar a formula:

GLrm = (termo1)^2/(termo2+termo3)

Agora detalharemos mais os termos:


termo1<-QMra+((n2-1)*QMrb)
termo2<-(QMra^2)/GLra
termo3<-(((n2-1)*QMrb)^2)/GLrb

Montaremos a equação para obter o GLr médio


GLrm<-((termo1)^2)/(termo2+termo3)
GLrm<-round(GLrm, dig=0) #arredonda
GLrm
## [1] 18

Antes de aplicar o teste de Tukey para f1 d/f2 faremos os recortes no banco de dados(a1)
levels(f2)# lembrando as doses
## [1] "10" "40" "70"
f2_10<-subset(a1, f2=="10") #recortando
f2_40<-subset(a1, f2=="40")
f2_70<-subset(a1, f2=="70")

Criando uma função para o teste de Tukey


futk2<-function(x){
tk<-HSD.test(x$resp, x$f1, GLrb,QMrb,
alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk<-tk[5]
return(tk)}

Aplicando a função futk2 nos recortes


futk2(f2_10) # f1 d/f2=10
## $groups
## trt means M
## 1 sa 3045.50 a
## 2 cn 2732.25 ab
## 3 sc 2666.75 ab
## 4 u 2365.50 b

53
futk2(f2_40) # f1 d/f2=40
## $groups
## trt means M
## 1 sa 3541.00 a
## 2 u 2865.00 b
## 3 sc 2752.25 b
## 4 cn 2687.25 b
futk2(f2_70) # f1 d/f2=70
## $groups
## trt means M
## 1 sc 3776.75 a
## 2 sa 3619.00 ab
## 3 u 3238.75 b
## 4 cn 3193.50 b

Parcelas subdivididas: produtividade de milho

Passo a passo
Exemplo adaptado de Banzatto & Kronka (2008), sendo: resp= produtividade de milho em kg/ha, bloc= blocos (4).
Fatorial (4 x 3), sendo:
4 adu(f1)= adubaçao com salitre do chile (sc), sulfato de amonio (sa), ureia(u), calnitro (cn)
3 dos(f2)= doses de N ( 10, 40 ou 70 kg/ha)

Experimento em parcelas subdividas, sendo:


parc= bloc x adu (16)
spar= bloc x adu x dos (48)

Os objetivos são:
1. comparar as fontes(f1) independentemente de dose(f2)
2. comparar as doses(f2) dentro de cada fonte(f1)
3. comparar as fontes(f1) dentro de cada dose(f2)

Importando os dados

a<-read.table("par_sub2.txt", h=T)
head(a)
## par spar bloc adu dos resp
## 1 1sc 1sc10 1 sc 10 2747
## 2 1sc 1sc40 1 sc 40 2889
## 3 1sc 1sc70 1 sc 70 3578
## 4 1sa 1sa10 1 sa 10 3164
## 5 1sa 1sa40 1 sa 40 3831
## 6 1sa 1sa70 1 sa 70 4107
str(a)
## 'data.frame': 48 obs. of 6 variables:
## $ par : Factor w/ 16 levels "1cn","1sa","1sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ spar: Factor w/ 48 levels "1cn10","1cn40",..: 7 8 9 4 5 6 10 11 12 1 ...
## $ bloc: int 1 1 1 1 1 1 1 1 1 1 ...
## $ adu : Factor w/ 4 levels "cn","sa","sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ dos : int 10 40 70 10 40 70 10 40 70 10 ...
## $ resp: int 2747 2889 3578 3164 3831 4107 1902 2547 3364 2978 ...
54
Tranformando

fspar<-as.factor(a$spar) # subparcelas
fpar<-as.factor(a$par) # parcelas
fb<-as.factor(a$bloc)
f1<-as.factor(a$adu)
f2<-as.factor(a$dos)
resp<-as.numeric(a$resp)

Gerando um novo data.frame

a1<-data.frame(fspar,fpar,fb,f1,f2,resp)
head(a1)
## fspar fpar fb f1 f2 resp
## 1 1sc10 1sc 1 sc 10 2747
## 2 1sc40 1sc 1 sc 40 2889
## 3 1sc70 1sc 1 sc 70 3578
## 4 1sa10 1sa 1 sa 10 3164
## 5 1sa40 1sa 1 sa 40 3831
## 6 1sa70 1sa 1 sa 70 4107
str(a1)
## 'data.frame': 48 obs. of 6 variables:
## $ fspar: Factor w/ 48 levels "1cn10","1cn40",..: 7 8 9 4 5 6 10 11 12 1 ...
## $ fpar : Factor w/ 16 levels "1cn","1sa","1sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ fb : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ f1 : Factor w/ 4 levels "cn","sa","sc",..: 3 3 3 2 2 2 4 4 4 1 ...
## $ f2 : Factor w/ 3 levels "10","40","70": 1 2 3 1 2 3 1 2 3 1 ...
## $ resp : num 2747 2889 3578 3164 3831 ...

Conferindo o objeto a1

length(levels(fspar))
## [1] 48
length(levels(fpar))
## [1] 16
length(levels(fb))
## [1] 4
1ª parte da anova:
Relativa a parcelas, servirá para fb, f1 e fpar. A SQ do resíduo_a será calculada por diferença. Trabalharemos
inicialmente apenas com SQ e GL. Após montado o quadro calculamos o QM, F e PV de uma só vez.

fu1<-function(x){
y<-tapply(resp,x,sum)
n<-tapply(resp,x,length)
ter1<-sum((y^2)/n)
ter2<-((sum(y))^2)/sum(n)
SQ<-ter1-ter2
GL<-length(y)-1
vetnum<-round(c(SQ,GL),dig=3)
return(vetnum)
}

55
Matriz dos GL e SQ dos fatores principais da parte da anova relativa à parcelas

sqp<-rbind(fu1(fb),fu1(f1),fu1(fpar))

vra<-c(sqra<-fu1(fpar)[1]-fu1(fb)[1]-fu1(f1)[1],
glra<-fu1(fpar)[2]-fu1(fb)[2]-fu1(f1)[2])

# juntando em uma matriz


anep<-rbind(fu1(fb),fu1(f1),fu1(fpar),
c(sqra<-fu1(fpar)[1]-fu1(fb)[1]-fu1(f1)[1],
glra<-fu1(fpar)[2]-fu1(fb)[2]-fu1(f1)[2]))
rownames(anep)<-c("fb", "f1", "fpar", "res (a)")
anep
## [,1] [,2]
## fb 3198892 3
## f1 2486093 3
## fpar 8574131 15
## res (a) 2889146 9

Calculando QM, F, P_valor

vqmp<-anep[,1]/anep[,2]
vfcal<-(anep[,1]/anep[,2])/glra
vp_valor<-signif(pf(vfcal, anep[,2], glra, lower.tail = FALSE, log.p = FALSE), dig=3)

anep<-cbind(anep,vqmp,vfcal, vp_valor)
colnames(anep)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
anep
## SQ GL QM Fcal P_valor
## fb 3198892 3 1066297.2 118477.47 5.35e-21
## f1 2486093 3 828697.7 92077.52 1.66e-20
## fpar 8574131 15 571608.8 63512.08 9.98e-21
## res (a) 2889146 9 321016.3 35668.47 2.17e-19
GLra<-glra # precisaremos dele no teste de tukey
QMra<-sqra/glra # precisaremos dele no teste de tukey
2ª parte da anova
Calcularemos a SQ e o GL para f2 e fspar usando a fu1(...). Também usaremos a fu1(...) para SQ bruta de f1:f2 e por
diferença obteremos a SQ da interação f1i2. O GL da f1i2 é obtido através do glf1*glf2. Por diferença calcularemos
a SQ e GL do resíduo b.

fu1(f2) # sq e gl do fator 2
## [1] 4703630 2
fu1(fspar) # sq e gl da subparcela
## [1] 16351434 47
fu1(f1:f2)[1] # efeito bruto f1:f2
## [1] 8475876
vf1i2<-c(sqf1i2<-fu1(f1:f2)[1]-fu1(f1)[1]-fu1(f2)[1], # sq interação f1i2
glf1i2<-fu1(f1)[2]*fu1(f2)[2]) # gl interação f1i2

vresb<-c(sqrb<-fu1(fspar)[1]-sqf1i2-fu1(f2)[1]-fu1(fpar)[1],glrb<-fu1(fspar)[2]-
glf1i2-fu1(f2)[2]-fu1(fpar)[2])
56
# juntando em uma matriz anesp
# pense na sequencia de linhas abaixo:
# vetor de sq e gl do f2
# vetor de sq e gl da f1if2
# vetor de sq e gl da suparcela
# vetor de sq e gl do resíduo b
# reuna os obj com os vetores na sequencia e
# depois junte com o rbind. Não se esqueça de usar "," entre os objs

anesp<-rbind(fu1(f2),
vf1i2<-c(sqf1i2<-fu1(f1:f2)[1]-fu1(f1)[1]-fu1(f2)[1],
glf1i2<-fu1(f1)[2]*fu1(f2)[2]),
fu1(fspar),
vresb<-c(sqrb<-fu1(fspar)[1]-sqf1i2-fu1(f2)[1]-fu1(fpar)[1],
glrb<-fu1(fspar)[2]-glf1i2-fu1(f2)[2]-fu1(fpar)[2]))
rownames(anesp)<-c("f2", "f1if2", "fspar", "res (b)")
anesp
## [,1] [,2]
## f2 4703630 2
## f1if2 1286153 6
## fspar 16351434 47
## res (b) 1787519 24
vqm<-anesp[,1]/anesp[,2]
vfcal<-anesp[,1]/anesp[,2]/(sqrb/glrb)
vp_valor<-signif(pf(vfcal, anesp[,2],glrb ,lower.tail =FALSE, log.p = FALSE), dig=4)

# reunindo numa matriz anesp


anesp<-cbind(anesp, vqm,vfcal,vp_valor)
colnames(anesp)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
anesp
## SQ GL QM Fcal P_valor
## f2 4703630 2 2351815.08 31.576476 1.902e-07
## f1if2 1286153 6 214358.86 2.878074 2.945e-02
## fspar 16351434 47 347902.85 4.671093 6.754e-05
## res (b) 1787519 24 74479.97 1.000000 5.000e-01
GLrb<-glrb # precisaremos dele nos teste de tukey
QMrb<-sqrb/glrb # precisaremos dele no teste de tukey

Reunindo anep e anesp numa matriz anepsp

anepsp<-rbind(anep, anesp)
round(anepsp,dig=3)
## SQ GL QM Fcal P_valor
## fb 3198892 3 1066297.25 118477.472 0.000
## f1 2486093 3 828697.69 92077.522 0.000
## fpar 8574131 15 571608.75 63512.083 0.000
## res (a) 2889146 9 321016.27 35668.474 0.000
## f2 4703630 2 2351815.08 31.576 0.000
## f1if2 1286153 6 214358.86 2.878 0.029
## fspar 16351434 47 347902.85 4.671 0.000
## res (b) 1787519 24 74479.97 1.000 0.500

Efeito dos adubos(f1 com Tukey), independente da dose. Usaremos o GLra e QMra
57
levels(f1)#apenas conferindo os níveis f1
## [1] "cn" "sa" "sc" "u"
require(agricolae)
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3
tk1<-HSD.test(resp, f1, GLra,QMra,alpha=0.05,
group=TRUE, main = NULL,console=FALSE)
tk1[5] #tem rodar com com alpha 0.20!
## $groups
## trt means M
## 1 sa 3401.833 a
## 2 sc 3065.250 a
## 3 cn 2871.000 a
## 4 u 2823.083 a

Anova e Tukey f2 d/f1, ou seja,doses dentro de níveis de adubo. Usaremos QMrb e Glrb

levels(f1)# relembrando os niveis de f1


## [1] "cn" "sa" "sc" "u"
# Fazendo os recortes de interesse
f1_cn<-subset(a1, f1=="cn")
f1_sa<-subset(a1, f1=="sa")
f1_sc<-subset(a1, f1=="sc")
f1_u<-subset(a1, f1=="u")

Função para SQ dos desdobramento de f1:f2

fu3<-function(x){
y<-tapply(x$resp,x$f2,sum)
n<-tapply(x$resp,x$f2,length)
ter1<-sum((y^2)/n)
ter2<-(sum(y)^2)/sum(n)
SQ<-ter1-ter2
GL<-(length(levels(f2)))-1
QM<-SQ/GL
Fcal<-QM/QMrb # usamos o residuo_b
PV<-c(pf(Fcal, GL, QM,
lower.tail=FALSE))
v3<-round(c(SQ,GL,QM,Fcal,PV),dig=3)
return(v3)
}

Aplicando a fu3 aos recortes e reunindo os vetores resultantes por linhas

anef2df1<-rbind(fu3(f1_cn),
fu3(f1_sa),
fu3(f1_sc),
fu3(f1_u))

Renomeando linhas e colunas de anef2df1

rownames(anef2df1)<-c("f2df1_cn", "f2df1_sa", "f2df1_sc", "f2df1u")


anef2df1
58
## [,1] [,2] [,3] [,4] [,5]
## f2df1_cn 628087.5 2 314043.8 4.216 0.015
## f2df1_sa 774008.7 2 387004.3 5.196 0.006
## f2df1_sc 3052014.0 2 1526007.0 20.489 0.000
## f2df1u 1535673.2 2 767836.6 10.309 0.000
colnames(anef2df1)<-c("SQ", "GL","QM", "Fcal", "P_valor")
anef2df1
## SQ GL QM Fcal P_valor
## f2df1_cn 628087.5 2 314043.8 4.216 0.015
## f2df1_sa 774008.7 2 387004.3 5.196 0.006
## f2df1_sc 3052014.0 2 1526007.0 20.489 0.000
## f2df1u 1535673.2 2 767836.6 10.309 0.000
Teste de Tukey para f2 d/f1

require(agricolae)

f2 d/f1 ou dose d/adubo. Lembre-se que já fizemos os recortes de a1. Lembrar que neste caso usaremos o GLrb e
QMrb

futk1<-function(x){
tk<-HSD.test(x$resp, x$f2, GLrb,QMrb,
alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk<-tk[5]
return(tk)
}

Aplicando a futk1 aos recortes e reunindo numa lista

list(futk1(f1_cn),
futk1(f1_sa),
futk1(f1_sc),
futk1(f1_u))
## [[1]]
## [[1]]$groups
## trt means M
## 1 70 3193.50 a
## 2 10 2732.25 ab
## 3 40 2687.25 b
##
##
## [[2]]
## [[2]]$groups
## trt means M
## 1 70 3619.0 a
## 2 40 3541.0 a
## 3 10 3045.5 b
##
##
## [[3]]
## [[3]]$groups
## trt means M
## 1 70 3776.75 a
## 2 40 2752.25 b
## 3 10 2666.75 b

59
##
##
## [[4]]
## [[4]]$groups
## trt means M
## 1 70 3238.75 a
## 2 40 2865.00 a
## 3 10 2365.50 b
Tukey para f1 d/f2
Para comparar médias f1 d/f2 faz-se necessário calcular novo GLrm e QMrm (m=médio). Mais detalhes em Pimentel
Gomes (2008), v15, ed15, pg165-171

Calculando a variância média pela fórmula:

#QMrm=(QMra+QMrb*(n2-1))/n2

Sabemos que:

n2<-length(levels(f2)) # nº níveis do fator 2 em estudo


QMra # calculado anteriormente
## [1] 321016.3
QMrb # calculado anteriormente
## [1] 74479.97
Então:

QMrm<-(QMra+QMrb*(n2-1))/n2

Calculando um GL médio para f1 e f2

#GLrm=(QMra+((n2-1)QMrb))2/(((QMra2)/GLra)+((((n2-1)QMrb)^2)/GLrb))

Para evitar erros de digitação simplificaremos a formula:

# GLrm=(termo1)^2/(termo2+termo3)

Agora detalharemos os termos:

termo1<-QMra+((n2-1)*QMrb)
termo2<-(QMra^2)/GLra
termo3<-(((n2-1)*QMrb)^2)/GLrb

Agora montaremos a equação

GLrm<-((termo1)^2)/(termo2+termo3)
GLrm<-round(GLrm, dig=0) #arredonda
GLrm
## [1] 18
Tukey para f1 d/f2
Primeiro faremos os recortes no banco de dados(a1)

levels(f2)# lembrando as doses


## [1] "10" "40" "70"

60
f2_10<-subset(a1, f2=="10") # recorte...
f2_40<-subset(a1, f2=="40")
f2_70<-subset(a1, f2=="70")

Criaremos uma função para o teste de Tukey

futk2<-function(x){
tk<-HSD.test(x$resp, x$f1, GLrb,QMrb,
alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk<-tk[5]
return(tk)
}

Aplicaremos a função futk2 nos recortes de f1d/f2

list(futk2(f2_10),
futk2(f2_40),
futk2(f2_70))
## [[1]]
## [[1]]$groups
## trt means M
## 1 sa 3045.50 a
## 2 cn 2732.25 ab
## 3 sc 2666.75 ab
## 4 u 2365.50 b
##
##
## [[2]]
## [[2]]$groups
## trt means M
## 1 sa 3541.00 a
## 2 u 2865.00 b
## 3 sc 2752.25 b
## 4 cn 2687.25 b
##
##
## [[3]]
## [[3]]$groups
## trt means M
## 1 sc 3776.75 a
## 2 sa 3619.00 ab
## 3 u 3238.75 b
## 4 cn 3193.50 b

Parcelas subdivididas: dados simulados de um experimento com amendoim forrageiro

Passo a passo

Dados simulados considerando um experimente,o em parcelas subdividas, com amendoim forrageiro.


Fatorial (6 x 4), sendo:
6 ecotipos de amendoim ( e1, e2, e3, e4, e5, e6)
4 fontes de P: super simples(ss), super triplo (st), fosfato natural (fn) e controle sem fertilizante (ct)
3 blocos parcelas= bloco x ecotipo
subparcelas= bloco x ecotipo x fonte de P

61
Objetivos:
1. avaliar qual ecotipo(f1) produz mais, independente da fonte de P(f2)
2. avaliar qual fonte(f2) permite maior produção, dentro de cada ecotipo(f1)
3. avliar qual ecotipo(f1) responde melhor as fontes(f2)= st e fn

Importando os dados
a<-read.table("par_sub_amendoin.txt", h=T)
head(a)
## par spar trat bloc esp fos resp
## 1 1e.1 1e.1ct 1 1 e.1 ct 41
## 2 1e.2 1e.2ct 2 1 e.2 ct 29
## 3 1e.3 1e.3ct 3 1 e.3 ct 41
## 4 1e.4 1e.4ct 4 1 e.4 ct 45
## 5 1e.5 1e.5ct 5 1 e.5 ct 23
## 6 1e.6 1e.6ct 6 1 e.6 ct 48
str(a)
## 'data.frame': 72 obs. of 7 variables:
## $ par : Factor w/ 18 levels "1e.1","1e.2",..: 1 2 3 4 5 6 1 2 3 4 ...
## $ spar: Factor w/ 72 levels "1e.1ct","1e.1fn",..: 1 5 9 13 17 21 2 6 10 14 ...
## $ trat: int 1 2 3 4 5 6 7 8 9 10 ...
## $ bloc: int 1 1 1 1 1 1 1 1 1 1 ...
## $ esp : Factor w/ 6 levels "e.1","e.2","e.3",..: 1 2 3 4 5 6 1 2 3 4 ...
## $ fos : Factor w/ 4 levels "ct","fn","ss",..: 1 1 1 1 1 1 2 2 2 2 ...
## $ resp: int 41 29 41 45 23 48 76 74 74 98 ...

Tranformando em fator
fspar<-as.factor(a$spar) # subparcelas
fpar<-as.factor(a$par) # parcelas
fb<-as.factor(a$bloc)
f1<-as.factor(a$esp)
f2<-as.factor(a$fos)
resp<-as.numeric(a$resp)

Gerando novo data.frame


a1<-data.frame(fspar,fpar,fb,f1,f2,resp)
head(a1)
## fspar fpar fb f1 f2 resp
## 1 1e.1ct 1e.1 1 e.1 ct 41
## 2 1e.2ct 1e.2 1 e.2 ct 29
## 3 1e.3ct 1e.3 1 e.3 ct 41
## 4 1e.4ct 1e.4 1 e.4 ct 45
## 5 1e.5ct 1e.5 1 e.5 ct 23
## 6 1e.6ct 1e.6 1 e.6 ct 48
str(a1)
## 'data.frame': 72 obs. of 6 variables:
## $ fspar: Factor w/ 72 levels "1e.1ct","1e.1fn",..: 1 5 9 13 17 21 2 6 10 14 ...
## $ fpar : Factor w/ 18 levels "1e.1","1e.2",..: 1 2 3 4 5 6 1 2 3 4 ...
## $ fb : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ f1 : Factor w/ 6 levels "e.1","e.2","e.3",..: 1 2 3 4 5 6 1 2 3 4 ...
## $ f2 : Factor w/ 4 levels "ct","fn","ss",..: 1 1 1 1 1 1 2 2 2 2 ...
## $ resp : num 41 29 41 45 23 48 76 74 74 98 ...

62
Conferindo o obj a1
length(levels(fspar))
## [1] 72
length(levels(fpar))
## [1] 18
length(levels(fb))
## [1] 3

Anova geral
ane00<-summary(aov (resp~fb+(f1+f2)^2+Error(fb/f1)))
ane00
##
## Error: fb
## Df Sum Sq Mean Sq
## fb 2 25.86 12.93
##
## Error: fb:f1
## Df Sum Sq Mean Sq F value Pr(>F)
## f1 5 13158 2631.5 1226 1.34e-13 ***
## Residuals 10 21 2.1
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## f2 3 139125 46375 15750 <2e-16 ***
## f1:f2 15 49545 3303 1122 <2e-16 ***
## Residuals 36 106 3
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Porém, para retirar as SQ e Gl usaremos a ane01 abaixo


ane01<-aov (resp~fb+(f1+f2)^2+Error(fb/f1))
ane01
##
## Call:
## aov(formula = resp ~ fb + (f1 + f2)^2 + Error(fb/f1))
##
## Grand Mean: 95.27778
##
## Stratum 1: fb
##
## Terms:
## fb
## Sum of Squares 25.86111
## Deg. of Freedom 2
##
## Estimated effects may be unbalanced
##
## Stratum 2: fb:f1

63
##
## Terms:
## f1 Residuals
## Sum of Squares 13157.611 21.472
## Deg. of Freedom 5 10
##
## Residual standard error: 1.46534
## 15 out of 20 effects not estimable
## Estimated effects may be unbalanced
##
## Stratum 3: Within
##
## Terms:
## f2 f1:f2 Residuals
## Sum of Squares 139124.78 49544.72 106.00
## Deg. of Freedom 3 15 36
##
## Residual standard error: 1.715938
## Estimated effects may be unbalanced

Extraindo GLr e SQr relativa a parcelas (resíduo_a)


GLra<-df.residual(ane01[[3]]) # GLresiduo_a
SQra<-sum(residuals(ane01[[3]])^2) # SQresidua_a
QMra<-SQra/GLra
QMra
## [1] 2.147222

Extraindo GLr e SQr relativa a subparcelas (resíduo_b)


GLrb<-df.residual(ane01[[4]]) # GLresiduo_b
SQrb<-sum(residuals(ane01[[4]])^2) # SQresidua_b
QMrb<-SQrb/GLrb
QMrb
## [1] 2.944444
Comentário:
Já obtivemos o GLr e QMr, se não temos interesse em realizar a decomposição dos efeitos dos fatores e testá-los pelo
teste F, então partiremos diretamente para o teste de médias.

Utilizaremos o pacote agricolae


require(agricolae) # carregando pacote
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3

Efeito dos adubos(f1 com Tukey)


OBS: Independente da dose Usaremos o GLra e QMra
levels(f1)#apenas conferindo os níveis f1
## [1] "e.1" "e.2" "e.3" "e.4" "e.5" "e.6"
tk1<-HSD.test(resp, f1, GLra,QMra,alpha=0.05,
group=TRUE, main = NULL,console=FALSE)
tk1[5] #tem rodar com com alpha 0.20!

64
## $groups
## trt means M
## 1 e.2 114.08333 a
## 2 e.5 112.66667 a
## 3 e.1 93.66667 b
## 4 e.4 88.66667 c
## 5 e.3 82.50000 d
## 6 e.6 80.08333 e
Anova e Tukey para f2 d/f1, ou seja, doses d/ de níveis de adubo.
Usaremos QMrb e Glrb
levels(f1)# lembrando os niveis de f1
## [1] "e.1" "e.2" "e.3" "e.4" "e.5" "e.6"
# recortes de interesse -----
f1_e.1<-subset(a1, f1=="e.1")
f1_e.2<-subset(a1, f1=="e.2")
f1_e.3<-subset(a1, f1=="e.3")
f1_e.4<-subset(a1, f1=="e.4")
f1_e.5<-subset(a1, f1=="e.5")
f1_e.6<-subset(a1, f1=="e.6")

Teste de Tukey para f2 d/f1, ou seja, dose d dentro de adubo. Lembre-se que o procedimento exige o pacote agricolae.
Neste caso usaremos o GLrb e QMrb
futk1<-function(x){
tk<-HSD.test(x$resp,x$f2,GLrb,QMrb,alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
return(tk[[5]])
}

Aplicando a futk1 aos recortes


futk1(f1_e.1)# f2 d/f1=e.1
## trt means M
## 1 ss 154.00000 a
## 2 st 102.33333 b
## 3 fn 75.66667 c
## 4 ct 42.66667 d
futk1(f1_e.2)
## trt means M
## 1 ss 200.33333 a
## 2 st 154.33333 b
## 3 fn 72.33333 c
## 4 ct 29.33333 d
futk1(f1_e.3)
## trt means M
## 1 ss 124.33333 a
## 2 st 91.33333 b
## 3 fn 73.00000 c
## 4 ct 41.33333 d
futk1(f1_e.4)

65
## trt means M
## 1 ss 119.66667 a
## 2 fn 98.00000 b
## 3 st 90.33333 c
## 4 ct 46.66667 d
futk1(f1_e.5)
## trt means M
## 1 ss 249.0000 a
## 2 st 124.6667 b
## 3 fn 55.0000 c
## 4 ct 22.0000 d
futk1(f1_e.6)
## trt means M
## 1 ss 104.33333 a
## 2 fn 85.00000 b
## 3 st 81.66667 b
## 4 ct 49.33333 c
Tukey f1 d/f2
Faz-se necessário calcular novo GLrm e QMrm (m=médio). Mais detalhes em Pimentel Gomes (2008), v15, ed15,
pg165-171

Variância comum é dada por:


# QMrm=(QMra+QMrb*(n2-1))/n2

Sabemos que:
QMra # calculado anteriormente
QMrb # calculado anteriormente n2=número de níves de f2
n2<-length(levels(f2)) # nº niveis do fator em estudo(f2)

QMrm<-(QMra+QMrb*(n2-1))/n2
QMrm
## [1] 2.745139
Calculando um GLrm para f1 e f2 Sabemos que a fórmula é:
# GLrm=(QMra+((n2-1)QMrb))2/(((QMra2)/GLra)+((((n2-1)QMrb)^2)/GLrb))

Para evitar erros de digitação vamos simplificar a formula:


# GLrm= (termo1)^2/(termo2+termo3)

Agora detalhe mais os termos:


termo1<-QMra+((n2-1)*QMrb)
termo2<-(QMra^2)/GLra
termo3<-(((n2-1)*QMrb)^2)/GLrb

Montaresmo a equação
GLrm<-((termo1)^2)/(termo2+termo3)
GLrm<-round(GLrm, dig=0) #arredonda
GLrm
## [1] 46
Tukey f1 d/f2

66
Primeiro faremos os recortes no banco de dados(a1)
levels(f2)# lembrando as doses
## [1] "ct" "fn" "ss" "st"
f2_ct<-subset(a1, f2=="ct")
f2_fn<-subset(a1, f2=="fn")
f2_ss<-subset(a1, f2=="ss")
f2_st<-subset(a1, f2=="st")

Criando uma função para o Tukey


futk2<-function(x){
tk<-HSD.test(x$resp, x$f1, GLrb,QMrb,
alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk<-tk[5]
return(tk)
}

Aplicando a futk2
futk2(f2_ct) # f1 d/f2=ct
## $groups
## trt means M
## 1 e.6 49.33333 a
## 2 e.4 46.66667 ab
## 3 e.1 42.66667 bc
## 4 e.3 41.33333 c
## 5 e.2 29.33333 d
## 6 e.5 22.00000 e
futk2(f2_fn)
## $groups
## trt means M
## 1 e.4 98.00000 a
## 2 e.6 85.00000 b
## 3 e.1 75.66667 c
## 4 e.3 73.00000 c
## 5 e.2 72.33333 c
## 6 e.5 55.00000 d
futk2(f2_ss)
## $groups
## trt means M
## 1 e.5 249.0000 a
## 2 e.2 200.3333 b
## 3 e.1 154.0000 c
## 4 e.3 124.3333 d
## 5 e.4 119.6667 e
## 6 e.6 104.3333 f
futk2(f2_st)
## $groups
## trt means M
## 1 e.2 154.33333 a
67
## 2 e.5 124.66667 b
## 3 e.1 102.33333 c
## 4 e.3 91.33333 d
## 5 e.4 90.33333 d
## 6 e.6 81.66667 e

Fatorial duplo com um tratamento adicional

Odirley Campos

Exemplo foi retirado no endereço abaixo: http://ridiculas.wordpress.com/2011/08/09/experimento-fatorial-duplo-


com-um-tratamento-adicional/
Após gerar os dados utilizamos rotinas um pouco diferentes daquelas do site. A melhor cultivar de soja é A e tem
como dose ótima 100 kg/ha de fertilizante. Temos 5 novas cultivares e desejamos descobrir qual a melhor dose de
fertilizante. A produtividade será comparada com a da cultivar A, num experimento com os 5 níveis de cultivar de
soja (B, C, D, E, F). Temos 5 níveis de fertilizante (50, 75, 100, 125, 150 kg). Portanto o experimento tem 25 níveis
(5×5) da porção fatorial, um nível de referência que é cultivar A com 100 kg(identificado como 101). Trata-se de um
fatorial 5×5+1.
Objetivos:
1. comparar as culturas, independentemente da dose de fertilizante
2. comparar as doses de fertilizante dentro de cada cultura

OBS: o arquivo de entrada contendo os dados abriga tanto tratamentos fatoriais como a parte adicional
Importando os dados
a<-read.table("fat2_1ad_soja.txt", h=T)
str(a) #verificar a "natureza" dos dados
## 'data.frame': 130 obs. of 5 variables:
## $ trat: int 1 2 3 4 5 6 7 8 9 10 ...
## $ bloc: int 1 1 1 1 1 1 1 1 1 1 ...
## $ cult: Factor w/ 6 levels "A","B","C","D",..: 1 2 3 4 5 6 2 3 4 5 ...
## $ dos : int 101 50 50 50 50 50 75 75 75 75 ...
## $ resp: num 361 133 156 111 226 ...
head(a)
## trat bloc cult dos resp
## 1 1 1 A 101 360.95
## 2 2 1 B 50 133.17
## 3 3 1 C 50 156.06
## 4 4 1 D 50 111.30
## 5 5 1 E 50 226.46
## 6 6 1 F 50 53.48
Transformando os dados em fator
ft<-as.factor(a$trat) # tratamentos
fb<-as.factor(a$bloc)
f1<-as.factor(a$cult) # progenie
f2<-as.factor(a$dos) # tipo de adubo
resp<-as.numeric(a$resp)# variável resposta
Reunindo em novo data
a1<-data.frame(ft,fb,f1,f2,resp)
head(a1)
68
## ft fb f1 f2 resp
## 1 1 1 A 101 360.95
## 2 2 1 B 50 133.17
## 3 3 1 C 50 156.06
## 4 4 1 D 50 111.30
## 5 5 1 E 50 226.46
## 6 6 1 F 50 53.48
# Anova apenas tratamentos ------
ane0 <-aov(resp~fb+ft, data=a1)
summary(ane0)
## Df Sum Sq Mean Sq F value Pr(>F)
## fb 4 4412 1103 0.911 0.461
## ft 25 941309 37652 31.092 <2e-16 ***
## Residuals 100 121098 1211
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
GLr<-df.residual(ane0) # gl do residuo
GLr
## [1] 100
sum(residuals(ane0)^2) # SQresiduo
## [1] 121098.2
QMr<-sum(residuals(ane0)^2)/df.residual(ane0)
QMr
## [1] 1210.982
Calculando as SQ para os efeitos principais
fu1<-function(x){
y<-tapply(resp,x,sum)
n<-tapply(resp,x,length)
t<-sum(n)
term1<-sum((y^2)/n)
term2<-((sum(y))^2)/t
SQ<-term1-term2
GL<-length(n)-1
return(c(SQ,GL))}
Aplicando a fu1
ane1<-rbind(fu1(fb),
fu1(ft),
fu1(fb:ft),
fu1(fb:ft)-fu1(ft)-fu1(fb))
Calculando o F e os P-valores
ane1<-cbind(ane1, QM<-ane1[,1]/ane1[,2],
Fcal<-QM/QM[4],
P_valor<-signif(pf(Fcal,ane1[,2],
ane1[4,2],
lower.tail = FALSE),dig=1))
ane1

69
## [,1] [,2] [,3] [,4] [,5]
## [1,] 4412.279 4 1103.070 0.9108885 5e-01
## [2,] 941308.528 25 37652.341 31.0923981 2e-36
## [3,] 1066819.029 129 8269.915 6.8290969 2e-20
## [4,] 121098.222 100 1210.982 1.0000000 5e-01
Renomeando colunas e linhas
colnames(ane1)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
ane1
## SQ GL QM Fcal P_valor
## [1,] 4412.279 4 1103.070 0.9108885 5e-01
## [2,] 941308.528 25 37652.341 31.0923981 2e-36
## [3,] 1066819.029 129 8269.915 6.8290969 2e-20
## [4,] 121098.222 100 1210.982 1.0000000 5e-01
rownames(ane1)<-c("bloc", "trat", "total", "residuo")
round(ane1,dig=3)
## SQ GL QM Fcal P_valor
## bloc 4412.279 4 1103.070 0.911 0.5
## trat 941308.528 25 37652.341 31.092 0.0
## total 1066819.029 129 8269.915 6.829 0.0
## residuo 121098.222 100 1210.982 1.000 0.5
SQ para culturas, incluindo A
fu2<-function(x){
y<-tapply(resp,x,sum)
n<-tapply(resp,x,length)
term1<-sum((y^2)/n)
term2<-(sum(y)^2)/sum(n)
SQ<-term1-term2
GL<-length(n)-1
QM<-SQ/GL
Fcal<-QM/ane1[4,3]
P_valor<-pf(Fcal,GL,
ane1[4,2],
lower.tail = FALSE)
return(round(c(SQ,GL,QM,Fcal,P_valor),dig=3))
}

fu2(f2)# apliando a fu2


## [1] 560406.000 5.000 112081.200 92.554 0.000

Nova função para SQ da parte fatorial


a2<-subset(a1,!f1=="A")#recortando o obj a1
head(a2)# apenas o cabecalho
## ft fb f1 f2 resp
## 2 2 1 B 50 133.17
## 3 3 1 C 50 156.06
## 4 4 1 D 50 111.30
## 5 5 1 E 50 226.46
## 6 6 1 F 50 53.48
## 7 7 1 B 75 249.36

70
fu3<-function(vresp,vfator){
y<-as.vector(na.omit(as.vector(tapply(vresp,vfator,sum))))
n<-as.vector(na.omit(as.vector(tapply(vresp,vfator,length))))
term1<-sum((y^2)/n)
term2<-(sum(y)^2)/sum(n)
SQ<-term1-term2
GL<-length(n)-1
QM<-SQ/GL
Fcal<-QM/ane1[4,3]
P_valor<-pf(Fcal,GL,
ane1[4,2],
lower.tail = FALSE)
vetor<-c(SQ,GL,QM,Fcal,P_valor)
return(round(vetor,dig=3))
}
Aplicando a fu3
fu3(a2$resp,a2$f2)# para dose, excluindo 101
## [1] 498680.07 4.00 124670.02 102.95 0.00
fu3(a2$resp,a2$f1)# para cultura, excluindo "A"
## [1] 295159.660 4.000 73789.915 60.934 0.000
fu2(f1) # para cultura, incluindo "A"
## [1] 356885.588 5.000 71377.118 58.942 0.000
fu3(a1$resp,a1$f1) # para cultura, incluindo "A"
## [1] 356885.588 5.000 71377.118 58.942 0.000
# veja que a fu3(a1$resp,a1$f1) retorna o mesmo resultado da fu2(f1)
# tornando desnecessária a fu2
Calculando a SQ da parte adicional. Lembrando que:
SQ_adicional= SQ_todas_culturas - SQ_culturas_parte_fatorial
fu2(f1)[1]-fu3(a2$resp,a2$f1)[1] #SQ da parte adicional
## [1] 61725.93
vadi<-c(fu2(f1)[1]-fu3(a2$resp,a2$f1)[1],1,1,1,1) #vetor sq adicional
Usaremos a fu3 para calcular a SQbruta f1:f2 sem a parte adicional
sqbruta<-fu3(a2$resp,a2$f1:a2$f2)[1] #sqbruta
sqf1sa<-fu3(a2$resp,a2$f1)[1] #efeito simple f2 sem parte adicional
sqf2sa<-fu3(a2$resp,a2$f2)[1] # efeito simples f2 sem parte adicional
Vetor da SQ da interação, sem a parte adicional
vf1i2<-c(sqf1i2<-sqbruta-sqf1sa-sqf2sa,
glf1i2<-fu3(a2$resp,a2$f1)[2]*fu3(a2$resp,a2$f2)[2],
qmf1i2<-sqf1i2/glf1i2,
fcal1i2<-qmf1i2/ane1[4,3],
p_valor<-round(pf(fcal1i2,glf1i2,
ane1[4,2],
lower.tail = FALSE),dig=3))

71
Reunindo tudo numa matriz
ane2<-rbind(fu3(a1$resp,a1$f1),# culturas, inclui A
fu3(a2$resp,a2$f1),# para cultura, excluindo "A"
fu3(a2$resp,a2$f2),# para dose, excluindo 101
vadi, # parte adicional
vf1i2) # intercao f1i2
rownames(ane2)<-c("culturas 6","culturas,sem A",
"dose, sem 101",
"adicional", "Inter_f1f2")
ane2
## [,1] [,2] [,3] [,4] [,5]
## culturas 6 356885.59 5 71377.118 58.942000 0
## culturas,sem A 295159.66 4 73789.915 60.934000 0
## dose, sem 101 498680.07 4 124670.018 102.950000 0
## adicional 61725.93 1 1.000 1.000000 1
## Inter_f1f2 85742.87 16 5358.929 4.425275 0
colnames(ane2)<-c("SQ", "GL", "QM", "Fcal", "P_valor")
round(ane2, dig=3) # Quadro da anova
## SQ GL QM Fcal P_valor
## culturas 6 356885.59 5 71377.118 58.942 0
## culturas,sem A 295159.66 4 73789.915 60.934 0
## dose, sem 101 498680.07 4 124670.018 102.950 0
## adicional 61725.93 1 1.000 1.000 1
## Inter_f1f2 85742.87 16 5358.929 4.425 0

Tukey para f1 d/ f2=100 ou 101 (cultura d/ dose 100 kg/ha)


dos_100<-subset(a1, f2==100|f2==101)#recorte

require(agricolae) # carrega o pacote


## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3
futk1<-function(x){
tk<-HSD.test(x$resp, x$f1, GLr, QMr,
alpha=0.05, group=TRUE, main = NULL,console=FALSE)
return(tk[5])
}

futk1(dos_100)# cul d/ dos 100


## $groups
## trt means M
## 1 A 385.852 a
## 2 D 372.594 a
## 3 E 335.722 ab
## 4 C 304.546 bc
## 5 B 290.448 bc
## 6 F 265.636 c
# e para as cul_d/150 vs cul_d/101, como seria?
Tukey para f2 d/ f1 (dose d/ cultura)
levels(f1)
72
## [1] "A" "B" "C" "D" "E" "F"
# Fazendo os recortes
cul_b<-subset(a1,f1=="B")
cul_c<-subset(a1,f1=="C")
cul_d<-subset(a1,f1=="D")
cul_e<-subset(a1,f1=="E")
cul_f<-subset(a1,f1=="F")

require(agricolae)

futk2<-function(x){
tk<-HSD.test(x$resp, x$f2, GLr, QMr,
alpha=0.05, group=TRUE, main = NULL,console=FALSE)
return(tk[5])
}

futk2(cul_b)
## $groups
## trt means M
## 1 100 290.448 a
## 2 150 285.602 a
## 3 125 263.840 a
## 4 75 233.632 a
## 5 50 143.872 b
futk2(cul_c)
## $groups
## trt means M
## 1 125 320.414 a
## 2 100 304.546 a
## 3 150 288.206 a
## 4 75 221.950 b
## 5 50 154.028 c
futk2(cul_d)
## $groups
## trt means M
## 1 150 459.758 a
## 2 125 438.276 a
## 3 100 372.594 b
## 4 75 305.874 c
## 5 50 180.924 d
futk2(cul_e)
## $groups
## trt means M
## 1 125 353.052 a
## 2 150 341.766 a
## 3 100 335.722 a
## 4 75 274.534 b
## 5 50 190.380 c
futk2(cul_f)

73
## $groups
## trt means M
## 1 100 265.636 a
## 2 125 255.186 a
## 3 75 222.232 ab
## 4 150 192.998 b
## 5 50 118.098 c

Fatorial triplo com um tratamento adicional

Passo a passo

Dados simulados de um experimento onde avaliar-se-á a germinação de sementes em função da dose de fertilizante
aplicada. Veja a descrição abaixo:
3 blocos
2 solos (AG e AR)
2 fontes de K na forma de KCl (K e Kr) onde r indica revestido
4 doses de equivalente K2O (40; 80; 120; 180 kg/ha)
1 controle sem aplicação de K fará a vez do tratamento adicional

Variável resposta: % germinação de sementes de uma cultura X

Fatorial ((2 x 4)+1) x 2)= 18; ou seria ((2 x 2 x 4)+ 1 + 1)= 18;

Então temos 1 adicional para cada solo

Objetivo: comparar as doses d/ fonte d/ solo

OBS: o mesmo banco de dados se prestaria a ajuste de modelos dentro de cada fonte de K e solo

Importando os dados
a<-read.table("fat3_ad2.txt",h=T)# importando os dados
str(a) #verificar a "natureza" dos dados
## 'data.frame': 54 obs. of 6 variables:
## $ trat: int 1 2 3 4 5 6 7 8 9 10 ...
## $ bloc: int 1 1 1 1 1 1 1 1 1 1 ...
## $ sol : Factor w/ 2 levels "ag","ar": 1 1 1 1 1 1 1 1 1 2 ...
## $ fon : Factor w/ 3 levels "0","k","kr": 1 2 2 2 2 3 3 3 3 1 ...
## $ dos : int 0 40 80 120 160 40 80 120 160 0 ...
## $ resp: int 100 99 95 70 20 100 99 94 88 100 ...

Transformando em fatores
ft<-as.factor(a$trat)
fb<-as.factor(a$bloc)
f1<-as.factor(a$sol)
f2<-as.factor(a$fon)
f3<-as.factor(a$dos)
resp<-as.numeric(a$resp)

Reunindo em novo data


a1<-data.frame(ft,fb,f1,f2,f3,resp)
str(a1)

74
## 'data.frame': 54 obs. of 6 variables:
## $ ft : Factor w/ 18 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ fb : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ f1 : Factor w/ 2 levels "ag","ar": 1 1 1 1 1 1 1 1 1 2 ...
## $ f2 : Factor w/ 3 levels "0","k","kr": 1 2 2 2 2 3 3 3 3 1 ...
## $ f3 : Factor w/ 5 levels "0","40","80",..: 1 2 3 4 5 2 3 4 5 1 ...
## $ resp: num 100 99 95 70 20 100 99 94 88 100 ...

Anova apenas tratamentos


ane0 <-aov(resp~fb+ft, data=a1)
summary(ane0)
## Df Sum Sq Mean Sq F value Pr(>F)
## fb 2 81 40.7 31.95 1.56e-08 ***
## ft 17 42690 2511.2 1971.98 < 2e-16 ***
## Residuals 34 43 1.3
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
GLr<-df.residual(ane0) # gl do residuo
SQr<-sum(residuals(ane0)^2) # SQresiduo
QMr<-SQr/GLr
QMr
## [1] 1.27342

Achando os levels de cada fator


lt<-levels(ft) #levels tratamentos
lb<- levels(fb) #levels blocos
l1<- levels(f1) #levels solos
l2<- levels(f2) #levels fontes, veja que ctl tb pode ser fonte
l3<- levels(f3) #levels doses, veja que são 5 doses e não 4

Numero de obs de cada fator


nb <- length(lb) #nº de níveis do fator Bloco
nt<-length(lt) # n de niveis dos trat
n1 <- length(l1) #n niveis fontes
n2 <- length(l2) # n niveis doses
n3 <- length(l3) # n niveis doses
nresp<- length(resp)# nº de obs do experimento

Modo rápido de calcular as SQ


# decompondo nos fatores principais
fu1<-function(x){
y<-tapply(resp,x,sum)
n<-tapply(resp,x,length)
ter1<-sum((y^2)/n)
fc<-(sum(y)^2)/sum(n)
SQ<-ter1-fc
GL<-length(y)-1
QM<-SQ/GL
Fcal<-QM/QMr
PV=signif(c(pf(Fcal, GL, GLr,
lower.tail = FALSE)), dig=3)
vetnum<-round(c(GL,SQ,QM,Fcal,PV),dig=3)
return(vetnum)}
75
Aplicando a fu1
ane1<-rbind(fu1(fb),fu1(f1),fu1(f2),fu1(f3))# reunindo
colnames(ane1)<-c("GL", "SQ", "QM", "F", "PV")
rownames(ane1)<-c("fb","f1","f2","f3")
ane1
## GL SQ QM F PV
## fb 2 81.37 40.685 31.950 0
## f1 1 1014.00 1014.000 796.281 0
## f2 2 13282.45 6641.227 5215.266 0
## f3 4 20216.37 5054.093 3968.911 0

Apenas relembrando os levels


l1
## [1] "ag" "ar"
l2
## [1] "0" "k" "kr"
l3
## [1] "0" "40" "80" "120" "160"
# lembremos que para os efeitos principais o adicional
# está incluindo na SQ, isto é necessário qndo queremos fazer
# algum teste de media, a nível de efeito principal (f1,f2 ou f3)

# extraindo as SQ da matrix, apenas ilustrando


SQ1<-ane1[2,2]
SQ1
## [1] 1014
SQ2<-ane1[3,2]
SQ2
## [1] 13282.45
SQ3<-ane1[4,2]
SQ3
## [1] 20216.37

Tukey para fonte (f2) independentemente de f1 e f3


require(agricolae)
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.2.3
futk1<-function(x){
tuk<-HSD.test(resp, x, GLr,QMr,
alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk1<-tuk[5]
return(tk1)
}

76
futk1(f2) # obs que a dose 0 (trat adicional) é mantida para
## $groups
## trt means M
## 1 0 98.66667 a
## 2 kr 91.79167 b
## 3 k 61.87500 c
# comparação com o K e Kr
# mas isto é uma informação muito geral
# é necessário desdobrar ao menos a nível de solo

SQ bruta das interações duplas


fu2<-function(x){
y0<-tapply(resp,x, sum)
y<-as.vector(na.omit(
as.vector(y0[-grep(":0",names(y0))])))
n0<-tapply(resp,x, length)
n<-as.vector(na.omit(
as.vector(n0[-grep(":0",names(y0))])))
ter1<-sum(y^2/n)
fc<-(sum(y)^2)/(sum(n))
SQ<-ter1-fc
return(SQ)
}

fu2(f1:f2) # sq bruto mas sem ctl ou dose 0


## [1] 12305.5
fu2(f1:f3) # sq bruto mas sem ctl ou dose 0
## [1] 19118.67
fu2(f2:f3) # sq bruto mas sem ctl ou dose 0
## [1] 38029
fu2(f1:f2:f3) # sq bruto mas sem ctl ou dose 0
## [1] 40146.67

Fazendo o recorte para extrair efeito dos fatores não considerando a parte adicional
a2<-subset(a1, !f2=="0") # retiranto a fonte 0 ou dose 0 do data
# adpataremos a fu1 a nova condição e chamaremos de fu3
# para calcular a SQ dos fatores principais sem os adicionais ("0")
fu3<-function(x){
y<-as.vector(na.omit(
as.vector(tapply(a2$resp,x,sum))))
n<-as.vector(na.omit(
as.vector(tapply(a2$resp,x,length))))
ter1<-sum(y^2/n)
fc<-(sum(y)^2)/(sum(n))
SQ<-ter1-fc
return(SQ)
}

fu3(a2$f1) # SQ do solo sem adicionais


77
## [1] 1121.333
fu3(a2$f2) # SQ da fonte sem adicionais
## [1] 10740.08
fu3(a2$f3) # SQ da dose sem adicionais
## [1] 17674

Agora vamos achar as SQ das interações sem os adicionais


SQ12<-fu2(f1:f2)-fu3(a2$f1)-fu3(a2$f2)
GL12<-(n1-1)*(n2-1-1)
SQ13<-fu2(f1:f3)-fu3(a2$f1)-fu3(a2$f3)
GL13<-(n1-1)*(n3-1-1)
SQ23<-fu2(f2:f3)-fu3(a2$f2)-fu3(a2$f3)
GL23<-(n2-1-1)*(n3-1-1)
SQ123<-fu2(f1:f2:f3)-fu3(a2$f1)-fu3(a2$f2)-fu3(a2$f3)
GL123<-(n1-1)*(n2-1-1)*(n3-1-1)

Matriz com a anova das interações


ane2<-cbind(GLs<-c(GL12,GL13,GL23,GL123),
SQs<-c(SQ12,SQ13,SQ23,SQ123),
QM<-SQs/GLs,
Fcal<- QM/(QMr),
PV<-round(c(pf(Fcal, GLs, GLr,
lower.tail = FALSE)),dig=3))
rownames(ane2)<-c("f12","f13",
"f23","f123")
round(ane2,dig=3)
## [,1] [,2] [,3] [,4] [,5]
## f12 1 444.083 444.083 348.733 0
## f13 3 323.333 107.778 84.636 0
## f23 3 9614.917 3204.972 2516.822 0
## f123 3 10611.250 3537.083 2777.624 0
ane2
## [,1] [,2] [,3] [,4] [,5]
## f12 1 444.0833 444.0833 348.73268 0
## f13 3 323.3333 107.7778 84.63644 0
## f23 3 9614.9167 3204.9722 2516.82164 0
## f123 3 10611.2500 3537.0833 2777.62404 0

Desdobrando f3 d/f2 d/f1


# primeiro recortamos,
l1
## [1] "ag" "ar"
l2
## [1] "0" "k" "kr"
# temos 2 nivies para solo e 3-1 para fonte
# então emos 2 x 2= desdobramentos
# repare que agora deixaremos a dose 0 (adicional)
# pois queremos q as outras sejam comparadas a ela
78
# num eventual teste de Tukey ou ajuste de modelos

fagk<-subset(subset(a1,f1=="ag"),f2=="k"|f2=="0")
fagkr<-subset(subset(a1,f1=="ag"),f2=="kr"|f2=="0")
fark<-subset(subset(a1,f1=="ar"),f2=="k"|f2=="0")
farkr<-subset(subset(a1,f1=="ar"),f2=="kr"|f2=="0")

fu3<-function(x){
y<-tapply(x$resp,x$f3,sum)
n<-tapply(x$resp,x$f3,length)
ter1<-sum((y^2)/n)
fc<-(sum(y)^2)/sum(n)
SQ<-ter1-fc
GL<-length(y)-1
vet<-c(GL,SQ)
return(vet)}

ane3<-rbind(fu3(fagk),fu3(fagkr),fu3(fark),fu3(farkr))

aned123<-cbind(GLs<-ane3[,1],
SQs<-ane3[,2],
QMs<-ane3[,2]/ane3[,1],
Fcal<-QM/QMr,
PV<-round(c(pf(Fcal, GLs, GLr,
lower.tail = FALSE)),dig=3))
rownames(aned123)<-c("f3 d/f2=k d/f1=ag",
"f3 d/f2=kr d/f1=ag",
"f3 d/f2=k d/f1=ar",
"f3 d/f2=kr d/f1=ar")
aned123
## [,1] [,2] [,3] [,4] [,5]
## f3 d/f2=k d/f1=ag 4 14164.9333 3541.23333 348.73268 0
## f3 d/f2=kr d/f1=ag 4 339.3333 84.83333 84.63644 0
## f3 d/f2=k d/f1=ar 4 19789.7333 4947.43333 2516.82164 0
## f3 d/f2=kr d/f1=ar 4 554.6667 138.66667 2777.62404 0

Tukey para f3 d/f2 d/f1


# require(agricolae)
futk3<-function(x){
tuk<-HSD.test(x$resp, x$f3, GLr,QMr,
alpha = 0.05, group=TRUE,
main = NULL,console=FALSE)
tk1<-tuk[5]
return(tk1)}
futk3(fagk)
## $groups
## trt means M
## 1 0 99.00000 a
## 2 40 98.66667 a
## 3 80 93.33333 b
## 4 120 68.66667 c
## 5 160 18.33333 d
futk3(fagkr)

79
## $groups
## trt means M
## 1 0 99.00000 a
## 2 40 98.33333 a
## 3 80 96.66667 a
## 4 120 93.33333 b
## 5 160 86.00000 c
futk3(fark)
## $groups
## trt means M
## 1 0 98.33333 a
## 2 40 94.66667 b
## 3 80 79.00000 c
## 4 120 38.33333 d
## 5 160 4.00000 e
futk3(farkr)
## $groups
## trt means M
## 1 0 98.33333 a
## 2 40 97.66667 a
## 3 80 91.00000 b
## 4 120 89.66667 b
## 5 160 81.66667 c

Bibliografia
Banzatto, D. A.; Kronka, S. N. Experimentação agrícola. 4.ed. Jaboticabal: FUNEP, 2006. 237p.
Pimentel Gomes, F. Curso de estatística experimental. 15.ed. Piracicaba: Fealq, 2008. 451p.

80

S-ar putea să vă placă și