- Minicurso de Introdução ao R
- Familiarização com a interface do RStudio
- Operações básicas
- Criando objetos
- Exportando e importando dados
- Planilha com dados reais
- Estruturas condicionais
- Estruturas de repetição
- Elaboração de gráficos simples
- Instalação e aplicações de pacotes
- Algumas ferramentas básicas de análise de dados
- Feedback e outros materiais
Minicurso de Introdução ao R
Esse material foi elaborado para o Minicurso de R do XIII Workshop de Férias em Genética e Melhoramento de Plantas organizado por alunos do Programa de Pós-Graduação em Genética e Melhoramento de Plantas da ESALQ- USP.
Recomendamos também outros materiais disponíveis online, encontre uma lista aqui.
Sugerimos que, antes de iniciar a prática aqui descrita, siga este tutorial para instalação do R e do RStudio.
Familiarização com a interface do RStudio
Abrindo o RStudio você verá:
A interface é separada em quatro janelas com principais funções:
- Edição de código
- Ambiente de trabalho e histórico
- Console
- Arquivos, gráficos, pacotes e ajuda
Explore cada uma das janelas. São inúmeras funcionalidades para cada uma delas, veremos algumas delas ao decorrer do curso.
Um primeiro script
A janela de edição de código (provavelmente localizada no canto superior esquerdo) você irá utilizar para escrever o seu código. Abra um novo script clicando no +
no canto superior esquerdo e selecionando R script
.
Vamos então iniciar os trabalhos com o tradicional Hello World
. Digite no seu script:
## Hello world
Agora, selecione a linha e aperte o botão Run
ou utilize Ctrl + enter
.
Ao fazer isso o seu código será processado na janela Console
, onde aparecerá em azul (se você estiver com as cores padrão do R) o código escrito e, logo em seguida, o resultado desejado. A linha somente não será processada no console se houver o símbolo #
na frente. Agora, experimente colocar #
na frente do código escrito. E, novamente, selecione a linha e aperte Run
.
O símbolo #
é muito utilizado para realizar comentários ao decorrer do código. Esta é uma ótima prática para deixar o código organizado e para que você possa lembrar mais tarde o que você mesmo/a estava pensando quando o escreveu ou para que outras pessoas possam entendê-lo. Como no exemplo:
## Hello world
Importante: sempre que quiser realizar alguma alteração, edite o seu script e não diretamente no console, pois tudo o que neste é escrito, não terá como ser salvo!
Para salvar seu script, você pode utilizar a aba Files
localizada (como padrão) no canto direito inferior para procurar uma localização de sua preferência, criar uma nova pasta com o nome CursoR
.
Dica:
- Evite colocar espaços e pontuações no nome das pastas e arquivos, isso pode dificultar o acesso via linha de comando no R. Por exemplo, ao invés de
Curso R
, optamos porCursoR
.
Depois, basta clicar no disquete localizado no cabeçalho do RStudio ou com Ctrl + s
e selecionar o diretório CursoR
criado. Scripts em R são salvos com a extensão .R
.
Estabelecendo diretório de trabalho
Outra boa prática no R é deixar o script no mesmo diretório onde estão seus dados brutos (arquivos de entrada no script) e os dados processados (gráficos, tabelas, etc). Para isso, vamos fazer com que o R identifique o mesmo diretório em que você salvou o script como diretório de trabalho, assim ele entenderá que é dali que precisa obter os dados e para lá que também irão os resultados.
Você pode fazer isso utilizando as facilidades do RStudio, basta localizar o diretório CursoR
pela aba Files
, clique em More
e depois “Set as Working Directory”. Repare que irá aparecer no console algo como:
Ou seja, você pode utilizar este mesmo comando para realizar esta ação. Esta então será nossa pasta de trabalho. Quando estiver perdido/a ou para ter certeza que o diretório de trabalho foi alterado utilize:
Facilitando a vida com Tab
Agora, imagine que você tem um diretório como ~/Documentos/mestrado/semestre1/disciplina_tal/aula_tal/dados_28174/analise_276182/resultados_161/
. Não é fácil lembrar todo este caminho para escrever num comando setwd()
.
Além da facilidade da janela do RStudio, você pode utilizar a tecla Tab
para completar o caminho para você. Experimente buscando alguma pasta no seu computador. Basta começar a digitar o caminho e apertar Tab
, ele irá completar o nome para você! Se você tiver mais do que um arquivo com aquele início de nome, aperte duas vezes o Tab
, ele mostrará todas as opções.
O Tab
funciona não só para indicar caminhos, mas também para comandos e nomes de objetos. É muito comum errarmos no código por erros de digitação, utilizar o Tab
fará com que reduza significativamente esses erros.
Operações básicas
Vamos então à linguagem!
O R pode funcionar como uma simples calculadora, que utiliza a mesma sintaxe que outros programas (como o excel):
#########################
# Script Minicurso R
# Data: 23/07/2019
# Genética
##########################
1+1.3 #Decimal definido com "."
2*3
4/2
2^3
sqrt(4) #raíz quadrada
log(100, base = 10) #logarítmo na base 10
log(100) #logarítmo com base neperiana
Agora, utilize as operações básicas para solucionar expressão abaixo. Lembre-se de utilizar parênteses ()
para estabelecer prioridades nas operações.
\((\frac{13+2+1.5}{3})+ log_{4}96\)
Resultado esperado:
## [1] 8.792481
Os comandos log
e sqrt
são duas de muitas outras funções básicas que o R possui. Para todas elas o R possui uma descrição para auxiliar no seu uso, para acessar essa ajuda use:
E será aberta a descrição da função na janela Help
do RStudio.
Se a descrição do próprio R não for suficiente para você entender como funciona a função, busque no google (de preferência em inglês). Existem diversos sites e fóruns com informações didáticas das funções do R.
Operações com vetores
Classes básicas:
- character (ex: A, B, C)
- numeric (ex: 1.1, 2.3)
- integer (ex: 1, 2, 3)
- complex (ex: 1 + 0i, 1 + 4i)
- logical (ex: TRUE, FALSE)
Os vetores são as estruturas mais simples trabalhadas no R. Construímos um vetor com uma sequencia numérica usando:
## [1] 1 3 2 5 2
MUITA ATENÇÃO: O c é a função do R (Combine Values into a Vector or List) com a qual construímos um vetor!
Utilizamos o simbolo :
para criar sequencias de números inteiros, como:
## [1] 1 2 3 4 5 6 7 8 9 10
Podemos utilizar outras funções para gerar sequencias, como:
## [1] 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80
## [18] 85 90 95 100
## [1] 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80
## [18] 85 90 95 100
- Crie uma sequencia utilizando a função
seq
que varie de 4 a 30, com intervalos de 3 em 3.
## [1] 4 7 10 13 16 19 22 25 28
A função rep
gera sequencias com números repetidos:
## [1] 3 4 5 3 4 5
## [1] 3 3 4 4 5 5
Podemos realizar operações utilizando esses vetores:
Repare que já esta ficando cansativo digitar os mesmos números repetidamente, vamos resolver isso criando objetos para armazenar nossos vetores e muito mais.
Criando objetos
O armazenamento de informações em objetos e a possível manipulação desses faz do R uma linguagem orientada por objetos. Para criar um objeto basta atribuir valores para as variáveis, como a seguir:
x = c(30.1,30.4,40,30.2,30.6,40.1)
# ou
x <- c(30.1,30.4,40,30.2,30.6,40.1)
y = c(0.26,0.3,0.36,0.24,0.27,0.35)
Os mais antigos costumam usar o sinal <-
, mas tem a mesma função de =
. Escolha usar o qual preferir.
Para acessar os valores dentro do objeto basta:
## [1] 30.1 30.4 40.0 30.2 30.6 40.1
A linguagem é sensível à letras maiúsculas e minúsculas, portanto x
é diferente de X
:
O objeto X
não foi criado.
Podemos então realizar as operações com o objeto criado:
E podemos armazenar a operação em outro objeto:
Podemos também aplicar algumas funções, como exemplo:
## [1] 101.59
## [1] 16.93167
## [1] 6.427507
Acessamos somente o 3º valor do vetor criado com []
:
Também podemos acessar o número da posição 2 a 4 com:
## [1] 15.35 20.18 15.22
Para obter informações do vetor criado utilize:
## num [1:6] 15.2 15.3 20.2 15.2 15.4 ...
A função str
nos diz sobre a estrutura do vetor, que se trata de um vetor numérico com 6 elementos.
Os vetores também podem receber outras categorias como caracteres:
Outra classe são os fatores, esses podem ser um pouco complexos de lidar.
De forma geral, fatores são valores categorizados por levels
, como exemplo, se transformarmos nosso vetor de caracteres clone
em fator, serão atribuidos níveis para cada uma das palavras:
## Factor w/ 4 levels "GRA01","GRA02",..: 2 3 4 2 1 3
## [1] "GRA01" "GRA02" "URO01" "URO03"
Dessa forma, teremos apenas 4 níveis para um vetor com 6 elementos, já que as palavras “GRA02” e “URO01” se repetem. Podemos obter o número de elementos do vetor ou o seu comprimento com:
## [1] 6
Também há vetores lógicos, que recebem valores de verdadeiro ou falso:
## [1] FALSE FALSE FALSE FALSE FALSE TRUE
Com ele podemos, por exemplo, identificar quais são as posições dos elementos maiores que 40:
## [1] 6
## [1] 40.1
Encontre mais sobre outros operadores lógicos, como o >
utilizado, neste link.
Warning1
Faça uma sequência numérica, contendo 10 valores inteiros, e salve em um objeto chamado “a”.
## [1] 1 2 3 4 5 6 7 8 9 10
Crie outra sequência, utilizando números decimais e qualquer operação matemática, de tal forma que seus valores sejam idênticos ao objeto “a”.
## [1] 1 2 3 4 5 6 7 8 9 10
Os dois vetores parecem iguais, não?
Então, utilizando um operador lógico, vamos verificar o objeto “b” é igual ao objeto “a”.
## [1] TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
Alguns valores não são iguais. Como isso é possivel?
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Warning2
Não é possível misturar diferentes classes dentro de um mesmo vetor, ao tentar fazer isso repare que o R irá tentar igualar para uma única classe:
## [1] "TRUE" "vish" "1"
No caso, todos os elementos foram transformados em caracter.
Algumas Dicas:
- Cuidado com a prioridade das operações, na dúvida, sempre acrescente parenteses conforme seu interesse de prioridade.
- Lembre-se que, se esquecer de fechar algum
(
ou[
ou"
, o console do R ficará esperando você fechar indicando um+
, nada será processado até que você digite diretamente no console um)
. - Cuidado para não sobrepor objetos já criados criando outros com o mesmo nome. Use, por exemplo: altura1, altura2.
- Mantenha no seu script .R somente os comandos que funcionaram e, de preferência, adicione comentários. Você pode, por exemplo, comentar dificuldades encontradas, para que você não cometa os mesmos erros mais tarde.
Você já pode fazer os exercícios da Sessão 1
Terminamos aqui o primeiro dia.
Caso não tenha salvado os objetos criados até agora, obtenha-os aqui.
Aqui você pode acessar um exemplo de script
.R
para esse primeiro dia.E aqui um exemplo de arquivo
.Rmd
para gerar um relatório com o conteúdo desse primeiro dia. E suas versões compiladas em pdf e html.
Matrizes
As matrizes são outra classe de objetos muito utilizadas no R, com elas podemos realizar operações de maior escala de forma automatizada.
Por serem usadas em operações, normalmente armazenamos nelas elementos numéricos. Para criar uma matriz, determinamos uma sequência de números e indicamos o número de linhas e colunas da matriz:
## [,1] [,2]
## [1,] 1 7
## [2,] 2 8
## [3,] 3 9
## [4,] 4 10
## [5,] 5 11
## [6,] 6 12
Podemos também utilizar sequencias já armazenadas em vetores para gerar uma matriz, desde que eles sejam numéricos:
## [,1] [,2]
## [1,] 30.1 0.26
## [2,] 30.4 0.30
## [3,] 40.0 0.36
## [4,] 30.2 0.24
## [5,] 30.6 0.27
## [6,] 40.1 0.35
Com elas podemos realizar operações matriciais:
## [,1] [,2]
## [1,] 2 14
## [2,] 4 16
## [3,] 6 18
## [4,] 8 20
## [5,] 10 22
## [6,] 12 24
## [,1] [,2]
## [1,] 1 49
## [2,] 4 64
## [3,] 9 81
## [4,] 16 100
## [5,] 25 121
## [6,] 36 144
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 50 58 66 74 82 90
## [2,] 58 68 78 88 98 108
## [3,] 66 78 90 102 114 126
## [4,] 74 88 102 116 130 144
## [5,] 82 98 114 130 146 162
## [6,] 90 108 126 144 162 180
Utilizar essas operações exige conhecimento de álgebra de matrizes, se quiser se aprofundar a respeito, o livro Linear Models in Statistics, Rencher (2008) possui um boa revisão à respeito. Você também pode explorar a sintaxe do R para essas operações neste link.
Acessamos os números internos à matriz dando as coordenadas [linha,coluna], como no exemplo:
## [1] 0.24
As vezes pode ser informativo dar nomes às colunas e às linhas da matriz, fazemos isso com:
## altura diametro
## GRA02 30.1 0.26
## URO01 30.4 0.30
## URO03 40.0 0.36
## GRA02 30.2 0.24
## GRA01 30.6 0.27
## URO01 40.1 0.35
Essas funções colnames
e rownames
também funcionam nos data.frames.
Data.frames
Diferente das matrizes, não realizamos operações com os data.frames, mas eles permitem a união de vetores com classes diferentes. Os data frames são semelhantes a tabelas geradas em outros programas, como o excel.
Os data frames são combinações de vetores de mesmo comprimento. Todos os que criamos até agora tem tamanho 6, verifique.
Podemos assim combiná-los em colunas de um único data.frame:
Repeticao <- rep(1:4,3)
Tratamento <- c(rep("L.A",4), rep("L.B",4), rep ("hibridoAB", 4) )
numero_folhas <- c(5,4,5,NA,13,9,10,11,6,9,9,9)
altura <- c(95,55,70,NA,61,77,80,97,140,155,175,170)
comprimento <- c(86,30,69,NA,80,77,88,87,95,75,95,100)
campo1 <- data.frame("Repeticao" = Repeticao, # Antes do sinal de "="
"Tratamento" = Tratamento, # estabelecemos os nomes
"numero_folhas" = numero_folhas, # das colunas
"altura" = altura,
"comprimento"= comprimento)
campo1
## Repeticao Tratamento numero_folhas altura comprimento
## 1 1 L.A 5 95 86
## 2 2 L.A 4 55 30
## 3 3 L.A 5 70 69
## 4 4 L.A NA NA NA
## 5 1 L.B 13 61 80
## 6 2 L.B 9 77 77
## 7 3 L.B 10 80 88
## 8 4 L.B 11 97 87
## 9 1 hibridoAB 6 140 95
## 10 2 hibridoAB 9 155 75
## 11 3 hibridoAB 9 175 95
## 12 4 hibridoAB 9 170 100
Podemos acessar cada uma das colunas com:
## [1] 95 55 70 NA 61 77 80 97 140 155 175 170
Ou também com:
## [1] 95 55 70 NA 61 77 80 97 140 155 175 170
Aqui, o número dentro dos colchetes se refere à coluna, por ser o segundo elemento (separado por vírgula). O primeiro elemento se refere à linha. Como deixamos o primeiro elemento vazio, estaremos nos referindo a todas as linhas para aquela coluna.
Dessa forma, se quisermos obter um conteúdo específico podemos dar as coordenadas com [linha,coluna]:
## [1] L.A
## Levels: hibridoAB L.A L.B
- Obtenha o altura da terceira repetição da Linhagem A.
## [1] 70
Mesmo se tratando de um data frame, podemos realizar operações com os vetores numéricos que a compõe.
- Com a altura das plantas em centímetros, obtenha em metros:
## [1] 0.95 0.55 0.70 NA 0.61 0.77 0.80 0.97 1.40 1.55 1.75 1.70
Agora, vamos adicionar o vetor calculado com o volume ao nosso data.frame. Para isso use a função cbind
.
## 'data.frame': 12 obs. of 6 variables:
## $ Repeticao : int 1 2 3 4 1 2 3 4 1 2 ...
## $ Tratamento : Factor w/ 3 levels "hibridoAB","L.A",..: 2 2 2 2 3 3 3 3 1 1 ...
## $ numero_folhas: num 5 4 5 NA 13 9 10 11 6 9 ...
## $ altura : num 95 55 70 NA 61 77 80 97 140 155 ...
## $ comprimento : num 86 30 69 NA 80 77 88 87 95 75 ...
## $ altura_m : num 0.95 0.55 0.7 NA 0.61 0.77 0.8 0.97 1.4 1.55 ...
Algumas dicas:
- Lembre-se que, para construir matrizes e data frames, o número de elementos em cada coluna tem que ser iguais.
- Caso não saiba o operador ou a função que deve ser utilizada, como o desvio padrão, busque no google algo como “desvio padrão R”, ou melhor “standard deviation R”. Logo nas primeiras páginas você obterá respostas. A comunidade do R é bastante ativa e grande parte das suas perguntas sobre ele já foram respondidas em algum lugar da web.
- Não esqueça que tudo o que fizer no R precisa ser explicitamente indicado, como uma multiplicação 4ac com
4*a*c
. Para gerar um vetor 1,3,2,6 é necessário:c(1,3,2,6)
.
Agora você já pode fazer os exercícios da Sessão 2
Exportando e importando dados
Podemos exportar nossos objetos em diversos formatos, como, por exemplo, .txt
ou .csv
. Para isso utilizamos:
write.table(campo1, file = "campo1.txt", sep = ";", dec = ".", row.names = FALSE)
write.csv(campo1, file = "campo1.csv", row.names = TRUE)
Obs: Você pode adquirir pacotes para exportar e importar dados com outros fomatos, como exemplo o pacote xlsx
exporta e importa dados com formato do excel.
Ao exportar, há diversas opções para a formatação do arquivo, é importante considerá-las se o arquivo for ser trabalhado em outro sofware posteriormente.
Abra os arquivos gerados para visualizar sua formatação.
Esses arquivos podem ser lidos novamente pelo R, utilizando as funções e suas especificações:
Planilha com dados reais
Agora que aprendemos a importar dados, vamos trabalhar com dados reais provenientes de um experimento.
A planilha com os dados será disponibilizada, adicione-a ao seu diretório de trabalho ou indique o caminho da pasta ao importá-la para dentro do R, como a seguir. Caso esteja difícil encontrá-la, acesse:
Aqui usaremos o argumento stringAsFactors
que impede que o R transforme os vetores da tabela em fatores, os quais são mais difíceis de trabalhar. O argumento na.strings
irá indicar como foram nomeados os dados perdidos.
Vamos explorar a estrutura dos dados coletados:
## 'data.frame': 200 obs. of 8 variables:
## $ Tempo : chr "T1" "T1" "T1" "T1" ...
## $ Bloco : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Parcela : int 1 1 1 1 1 2 2 2 2 2 ...
## $ Hibrido : chr "DKB390" "DKB390" "DKB390" "DKB390" ...
## $ AlturaPlantas: num 0.513 1.486 1.36 1.096 2.175 ...
## $ AlturaEspiga : num 0.512 0.733 0.868 0.959 1.4 ...
## $ NumeroFolhas : int 17 10 9 24 21 14 16 20 12 15 ...
## $ Estande : int 9 9 9 9 9 5 5 5 5 5 ...
## [1] 200 8
Estruturas condicionais
if e else
Para nossa próxima atividade com os dados, vamos primeiro entender como funcionam as estruturas if
e else
.
Nas funções condicionais if
e else
, estabelecemos uma condição para if, se ela for verdade a atividade será realizada, caso contrário (else) outra tarefa será. Como no exemplo:
if(2 > 3){ #o resultado de 2 > 3 é TRUE
print("dois é maior que três")
} else {
print("dois não é maior que três")
}
## [1] "dois não é maior que três"
- Verifique se a altura (5ª coluna) do terceiro híbrido (linha 3) é adequada. Envie uma mensagem se ele for pequeno demais, inferior a 1.5, e outra se a altura for adequada.
if(dados[3,5] < 1.5){
print("Híbrido pequeno demais")
} else {
print("Tamanho provavelmente adequado")
}
## [1] "Híbrido pequeno demais"
Podemos espeficiar mais do que uma condição repetindo a estrutura if
else
:
if(dados[8,5] < 1.5){
print("Híbrido pequeno demais")
} else if (dados[8,5] > 1.5 && dados[8,5] < 2.0){
print("Tamanho OK")
} else {
print("Cresceu demais")
}
## [1] "Cresceu demais"
Caso quiséssemos descobrir qual foi a planta com maior altura, uma forma de descobrir é testar qual delas tem o tamanho igual ao máximo:
maior_altura = max(dados[,5])
if(dados[1,5] == maior_altura){ # Testando com a primeira linha
print("A planta 1 é a maior planta")
} else if (dados[2,5] == maior_altura) { # Testando com a segunda linha
print("A planta 2 é a maior planta")
} else if (dados[3,5] == maior_altura) { # Testando com a terceira linha
print("A planta 3 é a maior planta")
} else if (dados[4,5] == maior_altura) { # Testando com a quarta linha
print("A planta 4 é a maior planta")
} else if (dados[5,5] == maior_altura) { # Testando com a quinta linha
print("A planta 5 é a maior planta")
} else { # Cansei
mensagem = paste("Vou ter que escrever", nrow(dados), "linhas?")
print(mensagem)
}
## [1] "Vou ter que escrever 200 linhas?"
Repare que só é possível utilizar essas estruturas para um elemento individual do vetor, se quisermos percorrer o vetor inteiro precisamos recorrer a outro recurso.
Estruturas de repetição
For
Esse recurso pode ser a função for
, uma função muito utilizada e poderosa. Ela constitui uma estrutura de loop, pois irá aplicar a mesma atividade repetidamente até atingir uma determinada condição. Veja exemplos:
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 10 20 30 40 50 60 70 80 90 100
Nos casos acima, i
funciona como um index que irá variar de 1 até 10 a operação determinada entre chaves.
Com essa estrutura, podemos repetir a operação realizada com as estruturas if
e else
para todo o vetor:
for(i in 1:nrow(dados)){
if(dados[i,5] < 1.5){
print("Híbrido pequeno demais")
} else if (dados[i,5] > 1.5 && dados[i,5] < 2.0){
print("Tamanho OK")
} else {
print("Cresceu demais")
}
}
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Tamanho OK"
## [1] "Cresceu demais"
## [1] "Tamanho OK"
## [1] "Híbrido pequeno demais"
## [1] "Cresceu demais"
## [1] "Híbrido pequeno demais"
## [1] "Híbrido pequeno demais"
E assim, descobrir qual é a planta mais alta:
maior_altura = max(dados[,5])
# Usando laço de repetição
for(i in 1:nrow(dados)){
if(dados[i,5] == maior_altura){
print(paste("A planta", i, "é a maior planta"))
}
}
## [1] "A planta 8 é a maior planta"
# Usando a função which
indice = which(dados[,5] == maior_altura)
print(paste("A planta", indice, "é a maior planta"))
## [1] "A planta 8 é a maior planta"
Dica: Identação
Repare a diferença:
# Sem identação
for(i in 1:nrow(dados)){
if(dados[i,7] > mean(dados[,7]) + 3){
print("Esse híbrido tem muitas folhas")
} else if (dados[i,7] < mean(dados[,7]) - 3){
print("Esse híbrido tem poucas folhas")
} else {
print("Esse híbrido está perto da média")
}
}
# Com identação correta
for(i in 1:nrow(dados)){
if(dados[i,7] > mean(dados[,7]) + 3){
print("Esse híbrido tem muitas folhas")
} else if (dados[i,7] < mean(dados[,7]) - 3){
print("Esse híbrido tem poucas folhas")
} else {
print("Esse híbrido está perto da média")
}
}
Loops dentro de loops
É possível também utilizarmos estruturas de repetição dentro de estruturas de repetição. Por exemplo, se quisermos trabalhar tanto nas colunas como nas linhas de uma matrix.
# Criando uma matrix vazia
ex_mat <- matrix(nrow=10, ncol=10)
# cada número dentro da matrix será o produto no índice da coluna pelo índice da linha
for(i in 1:dim(ex_mat)[1]) {
for(j in 1:dim(ex_mat)[2]) {
ex_mat[i,j] = i*j
}
}
ex_mat
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 2 3 4 5 6 7 8 9 10
## [2,] 2 4 6 8 10 12 14 16 18 20
## [3,] 3 6 9 12 15 18 21 24 27 30
## [4,] 4 8 12 16 20 24 28 32 36 40
## [5,] 5 10 15 20 25 30 35 40 45 50
## [6,] 6 12 18 24 30 36 42 48 54 60
## [7,] 7 14 21 28 35 42 49 56 63 70
## [8,] 8 16 24 32 40 48 56 64 72 80
## [9,] 9 18 27 36 45 54 63 72 81 90
## [10,] 10 20 30 40 50 60 70 80 90 100
Fizemos um vídeo com mais detalhes sobre loops no R, aumentem nossa quantidade de views e likes por lá.
Faça os exercícios da Sessão 3
Algumas dicas:
- Cuidado ao rodar o mesmo comando mais de uma vez, algumas variáveis podem não ser mais como eram antes. Para que o comando funcione da mesma forma é necessário que os objetos de entrada estejam da forma como você espera.
- Lembrem-se que
=
é para definir objetos e==
é o sinal de igualdade. - Nas estruturas condicionais e de repetição, lembrem-se que é necessário manter a sintaxe esperada: If(){} e for(i in 1:10){}. No for, podemos trocar a letra que será o índice, mas é sempre necessário fornecer uma sequência de inteiros contínua.
- Usar identação ajuda a visualizar o começo e fim de cada estrutura de código e facilita o abrir e fechar de chaves. Identação são aqueles espaços que usamos antes da linha
Paramos aqui no segundo dia do treinamento.
Elaboração de gráficos simples
Para outros dados coletados, vamos gerar alguns gráficos simples utilizando as funções básicas do R. Existem pacotes como o ggplot2
, plotly
e shiny
que possuem ferramentas muito poderosas para construção de gráficos, mas exigem um pouco mais de tempo para aprendizagem de sua sintaxe.
Os tipos mais comuns já possuem funções próprias, mas outros gráficos podem ser customizados de acordo com a necessidade do usuário. Vamos iniciar com um simples gráfico de frequências (ou histograma) para os dados de Altura
.
Vamos adicionar alguns argumentos para dar uma personalizada:
breaks
para definir os intervalos para cada barra;
#### Histograma ####
#Utiliza um vetor de valores para obter as frequências
hist(dados$AlturaPlantas)
hist(dados$AlturaPlantas, breaks = 2)
hist(dados$AlturaPlantas, breaks = 15)
Agora tente fazer o histograma para o altura de espiga, aproveite para tentar alterar alguns parâmetros.
Apresentaremos outros gráficos que poderão ser utilizados:
Barplot
Curve
Boxplot
#### Boxplot ####
#Necessita de um vetor de valores ou uma expressão
boxplot(dados$AlturaPlantas)
boxplot(dados$AlturaPlantas~dados$Tempo)
Explore o bloxplot de outros atributos, podendo combiná-los. Como desafio, tente fazer o boxplot da altura pela combinação de Hibridos e Blocos:
Scatter plot
Parâmetros gráficos
É possível customizar os gráficos alterando seus eixos, cores, fontes, etc. Começaremos através do histograma:
col
para adicionar cor;xlab
alterar título do eixo x;ylab
alterar título do eixo y;main
alterar título geral;
hist(dados$NumeroFolhas, breaks=6, col="blue", xlab="Número de folhas",
ylab="Frequencia", main="Histograma do número de Folhas")
Vamos explorar um pouco mais o gráfico de pontos. Vamos verificar se existe uma correlação entre o a altura de plantas e a altura da primeira espiga:
#Busque explorar mais parâmetros no gráfico a seguir:
##Dica: tente alterar o nome dos eixos
plot(x = dados$AlturaPlantas, y= dados$AlturaEspiga)
#Linha de ajuste
abline(lm(AlturaEspiga ~ AlturaPlantas, data = dados), col="red")
## [1] 0.7678205
Alguns argumentos são específicos para cada função, busque mais informações sobre cada uma delas para entender sobre seus argumentos. Outros parâmetros gráficos mais recorrentes são os relacionados com:
- O tamanho de texto e símbolos, chamados de
cex
; - Os símbolos de plotagem (25 ao todo), através do parâmetro
pch
; - Há os relacionados com a fonte (
font
efamily
); - Cores (
col
,bg
,fg
);
#Tamanho, pontos e cores
plot(x = dados$AlturaPlantas, y= dados$AlturaEspiga,
main = "Altura da prim. espiga x Altura da planta", #Título principal
xlab = "Altura de plantas", #Eixo x
ylab = "Alturada prim. espiga", #Eixo y
cex=2,
cex.axis=1.5)
Agora, busque alterar o nome dos rótulos (lab) e do título (main). Também utilize o parâmetro ‘pch=’ e coloque um número de 0 a 25.
De maneira similar ao tamanho, tente alterar as cores (utilize o color() para ver todas as cores disponíveis).
Salvar gráficos
Os gráficos podem ser salvos através dos menus disponíveis no RStudio, ou através de funções que permitem salvar em formatos específicos. Algumas delas são: pdf(); png(); jpeg(); bitmap(). De maneira geral, o parâmetro primordial é fornecer o nome do arquivo que será gerado (contendo sua extensão). Após abrir a função gráfica, deve-se gerar o gráfico de interesse. Por fim, utiliza-se o comando dev.off() para que saída gráfica volte para o console.
png(filename = "grafico_pontos.png")
plot(x = dados$AlturaPlantas, y= dados$AlturaEspiga,
main = "Altura da prim. espiga x Altura da planta", #Título principal
xlab = "Altura de plantas", #Eixo x
ylab = "Alturada prim. espiga", #Eixo y
cex=2,
cex.axis=1.5)
dev.off()
png(filename = "grafico_pontos.png", width = 1500, height = 1500, res= 300)
plot(x = dados$AlturaPlantas, y= dados$AlturaEspiga,
main = "Altura da prim. espiga x Altura da planta", #Título principal
xlab = "Altura de plantas", #Eixo x
ylab = "Alturada prim. espiga", #Eixo y
cex=2,
cex.axis=1.5)
dev.off()
Gere um gráfico e salve-o no formato de seu interesse. Em seguida, crie diversos gráficos dentro de uma mesma função gráfica e estude a saída.
Instalação e aplicações de pacotes
O que deixa o R ainda mais poderoso é a capacidade de incorporármos à ele novas funções chamando pacotes. Existem milhares de pacotes disponíveis no CRAN (repositorio oficial), e outros repositórios. Para cada área de estudo existem diversos pacotes disponíveis. Aqui usaremos o pacote desplot
.
Como ele esta disponível no CRAN, para instalá-lo basta:
Depois disso é necessário recrutá-lo com:
Este pacote é um conjunto de funções elaboradas para gerar gráficos de campo. Você pode obter mais informações sobre ele no manual disponível no CRAN.
Com esse pacote podemos desenhar o experimento de campo (assim como esta no papel que recebeu, mas um pouco mais bonito).
Para isso vamos adicionar duas outras colunas no nossa data.frame, com informações da posição de cada indivíduo no campo.
row <- rep(rep(1:10, each=5),4)
col <- c(rep(1:5,10),rep(6:10,10), rep(11:15,10), rep(16:20,10))
dados.up <- cbind(col, row, dados)
Para usar a função do pacote, buscamos no google por tutoriais, aqui esta aquele no qual nos baseamos para elaborarmos o código abaixo.
Algumas ferramentas básicas de análise de dados
A planilha com os dados será disponibilizada, adicione-a ao seu diretório de trabalho ou indique o caminho da pasta ao importá-la para dentro do R, como a seguir. Caso esteja difícil encontrá-la, acesse:
Claramente a análise de dados é algo muito específico de cada conjunto de dados e interesses. Vamos aqui mostrar alguns recursos básicos como análise de variância, regressão e teste de médias.
Algumas avaliações descritivas podem ser feitas pelo uso do tapply
e de gráficos. A função summary
também da informações gerais do conjunto. É possível usá-la em conjunto com o tapply
.
## 'data.frame': 20 obs. of 5 variables:
## $ gen : Factor w/ 10 levels "2","22","2d",..: 1 1 3 3 9 9 10 10 5 5 ...
## $ rep : int 1 2 1 2 1 2 1 2 1 2 ...
## $ prim_in: num 7 4.5 7.5 6.5 8 9.5 13 10 19 7 ...
## $ alt : num 60 42 43 45 45 58 50 64 46 55 ...
## $ prod : num 27.5 19.2 19.7 20.6 20.6 ...
# Certifique-se que esta lidando com variável categórica (fator)
dados_pim$gen <- as.factor(dados_pim$gen)
dados_pim$rep <- as.factor(dados_pim$rep)
tapply(dados_pim$alt, dados_pim$gen, summary)
## $`2`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 42.0 46.5 51.0 51.0 55.5 60.0
##
## $`22`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 48.00 53.12 58.25 58.25 63.38 68.50
##
## $`2d`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 43.0 43.5 44.0 44.0 44.5 45.0
##
## $`35`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 39.00 43.25 47.50 47.50 51.75 56.00
##
## $`71`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 46.00 48.25 50.50 50.50 52.75 55.00
##
## $`74`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 49.00 49.62 50.25 50.25 50.88 51.50
##
## $`80`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 21.00 27.25 33.50 33.50 39.75 46.00
##
## $DOS
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 50.00 53.25 56.50 56.50 59.75 63.00
##
## $T8
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 45.00 48.25 51.50 51.50 54.75 58.00
##
## $T9
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 50.0 53.5 57.0 57.0 60.5 64.0
## $`1`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 21.00 43.50 47.50 47.15 50.00 68.50
##
## $`2`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 42.00 46.50 53.25 52.85 57.50 64.00
Qual a relaçao entre altura de plantas e o primeiro entrenó?
## [1] 0.2026697
Podemos falar que a altura de plantas é significativamente diferente entre hibridos?
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 9 954.7 106.1 0.929 0.539
## Residuals 10 1141.8 114.2
O p-valor nos indica se podemos considerar diferenças de altura conforme o híbrido. Podemos também fazer um teste de médias para diferenciar a altura de plantas de cada híbrido. Aqui utilizaremos o método de Tukey:
modaov <- aov(alt ~ gen, data = dados_pim)
tukey.test <- TukeyHSD(x=modaov, 'gen', conf.level=0.95)
tukey.test
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = alt ~ gen, data = dados_pim)
##
## $gen
## diff lwr upr p adj
## 22-2 7.25 -35.04932 49.54932 0.9990485
## 2d-2 -7.00 -49.29932 35.29932 0.9992729
## 35-2 -3.50 -45.79932 38.79932 0.9999976
## 71-2 -0.50 -42.79932 41.79932 1.0000000
## 74-2 -0.75 -43.04932 41.54932 1.0000000
## 80-2 -17.50 -59.79932 24.79932 0.8054126
## DOS-2 5.50 -36.79932 47.79932 0.9998931
## T8-2 0.50 -41.79932 42.79932 1.0000000
## T9-2 6.00 -36.29932 48.29932 0.9997838
## 2d-22 -14.25 -56.54932 28.04932 0.9230467
## 35-22 -10.75 -53.04932 31.54932 0.9847292
## 71-22 -7.75 -50.04932 34.54932 0.9984267
## 74-22 -8.00 -50.29932 34.29932 0.9980093
## 80-22 -24.75 -67.04932 17.54932 0.4505023
## DOS-22 -1.75 -44.04932 40.54932 1.0000000
## T8-22 -6.75 -49.04932 35.54932 0.9994514
## T9-22 -1.25 -43.54932 41.04932 1.0000000
## 35-2d 3.50 -38.79932 45.79932 0.9999976
## 71-2d 6.50 -35.79932 48.79932 0.9995917
## 74-2d 6.25 -36.04932 48.54932 0.9997005
## 80-2d -10.50 -52.79932 31.79932 0.9868671
## DOS-2d 12.50 -29.79932 54.79932 0.9620165
## T8-2d 7.50 -34.79932 49.79932 0.9987696
## T9-2d 13.00 -29.29932 55.29932 0.9526637
## 71-35 3.00 -39.29932 45.29932 0.9999994
## 74-35 2.75 -39.54932 45.04932 0.9999997
## 80-35 -14.00 -56.29932 28.29932 0.9296976
## DOS-35 9.00 -33.29932 51.29932 0.9953549
## T8-35 4.00 -38.29932 46.29932 0.9999926
## T9-35 9.50 -32.79932 51.79932 0.9932470
## 74-71 -0.25 -42.54932 42.04932 1.0000000
## 80-71 -17.00 -59.29932 25.29932 0.8268907
## DOS-71 6.00 -36.29932 48.29932 0.9997838
## T8-71 1.00 -41.29932 43.29932 1.0000000
## T9-71 6.50 -35.79932 48.79932 0.9995917
## 80-74 -16.75 -59.04932 25.54932 0.8372283
## DOS-74 6.25 -36.04932 48.54932 0.9997005
## T8-74 1.25 -41.04932 43.54932 1.0000000
## T9-74 6.75 -35.54932 49.04932 0.9994514
## DOS-80 23.00 -19.29932 65.29932 0.5342839
## T8-80 18.00 -24.29932 60.29932 0.7829648
## T9-80 23.50 -18.79932 65.79932 0.5097255
## T8-DOS -5.00 -47.29932 37.29932 0.9999512
## T9-DOS 0.50 -41.79932 42.79932 1.0000000
## T9-T8 5.50 -36.79932 47.79932 0.9998931
Experimento de café
Agora, vamos trabalhar com outro conjunto de dados, contendo informações de um experimento de café. Acesse aqui:
- Arquivo cafe.txt
O experimento trata-se de dados em blocos completos casualizados de 10 progênies de café. Nele contém uma coluna rep para especificar a qual repetição o dado se refere, outra para qual indivíduo da progênie (prog) e outra para indicar em qual colheita o dado foi retirado (colheita).
## 'data.frame': 120 obs. of 4 variables:
## $ rep : int 1 1 1 1 1 1 1 1 1 1 ...
## $ prog : int 1 2 3 4 5 6 7 8 9 10 ...
## $ colheita: int 1 1 1 1 1 1 1 1 1 1 ...
## $ prod : num 4.3 13.2 1.59 2.76 11.38 ...
Não esqueça que é necessário que o arquivo esteja no seu ambiente de trabalho ou que você especifique o caminho completo para que o R o encontre.
Para essa análise de dados, nossa variável resposta é a produção (prod), a repetição (rep), a progênie (prog) e a colheita serão fatores no nosso modelo, identificados por seus níveis.
# Transformar em fator
data$rep <- as.factor(data$rep)
data$prog <- as.factor(data$prog)
data$colheita <- as.factor(data$colheita)
str(data)
## 'data.frame': 120 obs. of 4 variables:
## $ rep : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ prog : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ colheita: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ prod : num 4.3 13.2 1.59 2.76 11.38 ...
# Outra opção
data <- transform(data, rep = factor(rep), prog = factor(prog), colheita = factor(colheita))
str(data)
## 'data.frame': 120 obs. of 4 variables:
## $ rep : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ prog : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ colheita: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ prod : num 4.3 13.2 1.59 2.76 11.38 ...
Vamos primeiro análisar somente os dados referentes à primeira colheira. Podemos fazer um subset somente com esses dados.
## 'data.frame': 40 obs. of 4 variables:
## $ rep : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ prog : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ colheita: Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
## $ prod : num 4.3 13.2 1.59 2.76 11.38 ...
Repare que, ao fazer o subset, o conjunto de dados ainda mantém os três níveis do fator colheira, embora agora só tenhamos um. Isso pode ser um problema para a nossa análise, vamos remover os níveis excedentes com:
## 'data.frame': 40 obs. of 4 variables:
## $ rep : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## $ prog : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ colheita: Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ...
## $ prod : num 4.3 13.2 1.59 2.76 11.38 ...
Agora podemos rodar nosso modelo de análise de variância.
# Modelo
Modelo1 <- aov(prod ~ rep + prog,
contrasts = list(prog = "contr.sum"),
data = Colheita_1)
anova(Modelo1)
## Analysis of Variance Table
##
## Response: prod
## Df Sum Sq Mean Sq F value Pr(>F)
## rep 3 58.90 19.633 2.1836 0.113071
## prog 9 410.32 45.591 5.0708 0.000475 ***
## Residuals 27 242.75 8.991
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Essa análise variância exige alguns pressupostos, podemos verificar eles nos nossos dados usando:
####################################################
###verificar Pressupostos da análise de variância###
####################################################
names(Modelo1)
## [1] "coefficients" "residuals" "effects" "rank"
## [5] "fitted.values" "assign" "qr" "df.residual"
## [9] "contrasts" "xlevels" "call" "terms"
## [13] "model"
Modelo1_residuals <- Modelo1$residuals #armazenando os erros ou resíduos
# teste de Normalidade DOS ERROS##
#---------------------------------#
shapiro.test (Modelo1_residuals) # Hipótese de Nulidade
##
## Shapiro-Wilk normality test
##
## data: Modelo1_residuals
## W = 0.96494, p-value = 0.2461
# a hipótese de que os erros são normais, nesse caso, como o p-value = 0.24
# ou seja, >0.05 ou 0.01 ou qualquer alfa adotado, não se rejeita a hipotese de normalidade
Agora, vamos precisar de funções contidas nos scripts DIAGNOSTICS.R
e "outliers.R"
. Acesse eles em:
# Funções
source("DIAGNOSTICS.R")
source("outliers.R")
#Verificar pressupostos de análises
diagnostics(Modelo1$residuals, Modelo1$fitted.values)
As vezes outliers podem ser difíceis de identificarmos, aqui esta uma função (detalhes sobre a identificação e remoção de outliers estão disponíveis no artigo Bernal-Vasquez, AM., Utz, HF. & Piepho, HP. Theor Appl Genet-2016) que pode fazer isso:
## No outlier detected
## numeric(0)
Guardando o valor do quadrado médio:
## [1] 8.990907
E a média da primeira colheita da nossa variavel resposta (produção):
## [1] 8.54525
Com eles podemos calcular o coeficiente de variação (CV):
## [1] 35.08948
Calcule o CVe e QME para a colheita 2
Crie uma função calcular o CVe
Possibilidade de respostas:
CV_E <- function(anova, med){
QME <- anova(anova)["Residuals", "Mean Sq"]
CVe <- (sqrt(QME)/med)*100
return(CVe)
}
##
CV_E(anova = Modelo1, med = med)
## [1] 35.08948
Podemos também calcular a herdabilidade da característica produção:
n_rep <- nlevels(Colheita_1$rep)
VG <- (anova(Modelo1)["prog", "Mean Sq"]- QME)/n_rep
VE <- QME
H_2 <- VG/ (VG + VE)
H_2
## [1] 0.5043871
Feedback e outros materiais
Caso tenha sugestões para aprimoramento desse material, enviar e-mail para gent.esalq@gmail.com
.
Acesse também outros materiais em português produzidos por Cristiane Taniguti, Fernando Correr e Rodrigo Amadeu aqui.
Este material foi produzido por alunos do programa de pós-graduação em Genética e Melhoramento de Plantas. Ana Letycia Basso Garcia, Cristiane Taniguti, Fernando Correr, Guilherme Hokasa e Victor Mello ministraram o Treinamento.
Também recomendamos materiais em inglês aqui.