1
ANOVA e testes de médias com o Software R
Ministrante
Odirley Rodrigues Campos
Viçosa-MG
Setembro/2016
UFV
Universidade Federal de Viçosa Campus-Viçosa
Grupo de estudos em Fertilizantes
2
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
3
Fatorial triplo com um tratamento adicional.............................................................................................................. 74
Passo a passo .......................................................................................................................................................... 74
Bibliografia .................................................................................................................................................................. 80
4
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:
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
Eq. 1
5
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
6
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).
Na parte superior direita, clicar em trat e arrastar para o campo de eixos
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:
EIXO (categórico): bloc
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 2: Selecionador de campos
do Excel
Figura 3: Campos selecionados
para compor os eixos do gráfico ou
da tabela dinâmica
Figura 4: Tabela dinâmica
7
Monte a seguinte tabela no Excel.
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.
Ʃyi)2
Figura 5: estrutura da tabela dinâmica(esquerda) e da tabela inicial da anova(direita)
8
Portanto, depois de
achar os efeitos simples,
devemos procurar pelo
efeito bruto f1f2,
conforme ilustrado ao
lado:
Para o desdobramento de f1 dentro dos níveis de f2 (f1 d/ f2=...) usaremos os filtros da tabela dinâmica, conforme
abaixo.
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.
Adubo (f1) na ausência de Torta (f2)
Figura 6: estrutura da tab dinâmica e da anova
Figura 7: utilização de filtros da tabela dinâmica
9
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
10
Verifique as mudanças nas configurações da janela do Rstudio
Mudando diretório
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.
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)
No console serão mostrados os resultados das operações e comandos Janela de edição
Gráficos e recursos de
ajuda são mostrados
aqui.
Figura 9: apresentação da janela do R studio
11
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:
12
# 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
13
## [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
14
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
15
## 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) )
16
)^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
17
## 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
18
## 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
19
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 ## ------------------------------------------------------------------------ ## ##
20
## ## 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 ## ------------------------------------------------------------------------
21
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
22
## [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
23
# 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" ##
24
## "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.
25
# 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))))
26
## [,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 ...
27
## $ 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:
28
## 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.
29
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
30
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,
31
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
32
## 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
33
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 ...
34
## $ 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
35
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
36
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?
37
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 ##
38
## 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
39
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),
40
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)
41
## [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
42
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",
43
"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)
44
## $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 ...
45
## $ 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
46
## 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 ## ------------------------------------------------------------------------
47
## ## 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 ## ------------------------------------------------------------------------
48
## ------------------------------------------------------------------------ ## ## ## 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)
49
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
50
## --- ## 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)
51
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
52
## 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
53
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/(((QMra
2)/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
54
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 ...
55
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) }
56
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])
57
# 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
58
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
59
## [,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
60
## ## ## [[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"
61
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
62
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 ...
63
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
64
## ## 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!
65
## $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)
66
## 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
67
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
68
## 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)
69
## 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
70
## [,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
71
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))
72
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)
73
## [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)
74
## $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)
75
## '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)}
76
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) }
77
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
78
## [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
79
# 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)
80
## $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.