R para Entomologistas: nível básico


CAPÍTULO 4


Aplicações de MLG para dados entomológicos de contagem

 

José Bruno Malaquias, Jéssica Karina da Silva Pachú, Filipe Lemos Jacques, Paulo Eduardo Degrande

 

https://doi.org/10.4322/mp.2020-12.c4

 

Resumo

Apresentamos nesta última seção, dois exemplos de dados que são de natureza discreta. Para isto, lançamos mão do teste de ajuste de Modelos Lineares Generalizados (MLG) com as seguintes distribuições: Poisson; quase-Poisson e Binomial Negativo. Um dos bancos de dados apresenta apenas um fator, enquanto o segundo banco de dados é constituído de um fatorial. Utilizaremos os seguintes pacotes do R: readxl, hnp, MASS, multcomp e Rmisc. Os comandos a serem executados no R estão sendo apresentados com a cor azul.

Palavras-chave: deviance; variável discreta; número de insetos; contrastes; glm.


1. Importação do banco de dados - exemplo 1

O banco de dados a ser trabalhado, trata-se da ocorrência de Scaptocoris castanea Perty, 1830 (Hemiptera: Cydnidae) em diferentes culturas. Para acessar o banco de dados clique aqui, o banco de dados também está exposto no anexo desse capítulo.

Host é a planta hospedeira;

Rep corresponde a bloco (repetição) e

y é a variável resposta que foi estudada como sendo a ocorrência dos insetos.

Antes de iniciarmos a análise devemos rodar o comando: rm(list=ls(all=TRUE)) que serve para limpar a memória do programa e evitar erros.

Depois de alterar o nosso diretório (selecionar a pasta que contém os arquivos que utilizaremos): Session -> Set working Directory -> Choose Directory

Podemos visualizar os nomes de todos os arquivos que contén na pasta selecionada: list.files()

Em seguida devemos usar o comando para carregar o pacote que lê a planilha do Excel, que é o pacote readxl [1]: require(readxl)

Depois de carregar o pacote, precisamos ler o arquivo, para isso usaremos a linha de comando:

data<-read_excel("Dados-Abundancia.xlsx", sheet = 1)

data é o nome dado ao dataframe (você pode colocar o nome que quiser);

read_excel é o comando para ler o arquivo do Excel;

Dados-Abundancia é o nome do seu arquivo dentro da pasta selecionada;

xlsx é a extensão do arquivo com o qual você está trabalhando;

sheet = 1 faz referência a qual aba do seu arquivo do Excel quer analisar.


2. Análise descritiva

O primeiro passo é a produção de uma análise descritiva, para isto utilizaremos o pacote Rmisc [2], para carregar o pacote usaremos o comando: require(Rmisc).

Em seguida com a função summarySE, iremos obter os valores médios, desvio padrão, erro padrão e intervalos de confiança associados à média, para isso devemos rodar a linha de comando:

(descritiva<- summarySE(data, measurevar="y", groupvars=c("Host")))

O resultado da análise descritiva segue abaixo:

O próximo passo é a escolha do modelo que melhor se ajusta a esse conjunto de dados.


3. Teste de ajuste dos modelos

Quando a variável é independente precisamos verificar se as mesmas são fatores, para isso utilizamos o comando:

is.factor(data$Host)

A resposta para a verificação precisa ser: TRUE

Caso a resposta de: FALSE, é necessário converter as variáveis independentes em fatores, para isso utilizamos a função "as.factor": data$Host<-as.factor(data$Host)

Em seguida é necessário verificar se a conversão foi bem sucedida: is.factor(data$Host)

Com a conversão bem sucedida, podemos analisar qual dos 4 modelos melhor se ajusta aos dados, para isso utilizaremos os modelos:

model1<-glm(y~Host+Rep, data=data): Modelo gaussiano (sem necessidade de testar esse modelo, pois ele é aplicado à variáveis contínuas.

model2<-glm(y~Host+Rep, family="poisson", data=data): Modelo Poisson.

model3<-glm(y~Host+Rep, family="quasipoisson", data=data): Modelo quase-Poisson.

Alguns modelos precisam de pacotes específicos (como o model4, modelo binomial negativo). Para isso é necessário carregar o pacote MASS [3] para trabalharmos com a função glm.nb

Require(MASS)

model4<-glm.nb(y~Host+Rep, data=data): Modelo Binomial Negativo.

Em seguida é necessário carregar o pacote "hnp" para analisarmos a qualidade de ajuste dos modelos aos dados, usamos: require(hnp), o pacote hnp foi desenvolvido por Moral et al., [4], para maiores detalhes sobre envelope simulado meio normal, consulte Demétrio [5] e Demétrio et al., [6].

Para visualizarmos os gráficos em outra janela usamos o comando: dev.new()

Para agrupar os 4 gráficos em um grid 2 x 2: par(mfrow=c(2,2))

Para testar o ajuste dos diferentes modelos utilizaremos diferentes linhas de comando:

hnp(model1, print.on="T", main="Normal"): Teste da qualidade de ajuste do modelo normal

hnp(model2, print.on="T", main="Poisson"): Teste da qualidade de ajuste do modelo Poisson

hnp(model3, print.on="T", main="QuasePoisson"): Teste da qualidade de ajuste do modelo quase-Poisson

hnp(model4, print.on="T", main="BN"): Teste da qualidade de ajuste do modelo Binomial Negativo

Esse é o resultado do ajuste dos modelos aos dados de contagem:

Percebe-se que o modelo Binomial Negativo (BN) foi o modelo que melhor se ajustou aos dados de contagem de S. castanea, pois ficaram apenas 5% dos pontos fora do envelope. Portanto, esse será o modelo selecionado.

O próximo passo é rodar o comando anova com teste F para mostrar a análise de deviance do modelo selecionado. Para isso, utilizaremos o comando:

anova(model4, test="F")

Conforme análise de deviance, é possível verificar que existem evidências de diferença significativa entre as plantas hospedeiras (fator host), pois Pr (> F) é inferior a 0,05 (5%).

Agora vamos comparar os tratamentos utilizando o pacote "multcomp" [7], para isso vamos rodar a linha de comando: require(multcomp)

Para visualizar as diferenças nós utilizaremos a função glht e o método Tukey, para isso é necessário rodar o comando:

(Comparações <- summary(glht(model4, linfct = mcp(Host = "Tukey"))))

Comparações <- summary(Comparações, test = univariate())

Em seguida vamos imprimir os resultados expresando as letras para cada tratamento:

(Letras.mP<-cld(Comparações, level=0.05, Letters= c(LETTERS, letters), decreasing=TRUE))

A partir do teste a cima obteremos como resultado as comparações, as que possuírem as memas letras são consideradas significativamente iguais:


4. Importação do banco de dados - exemplo 2

Exemplo 2 - Dados de contagem em um ensaio com estrutura de fatorial que tratou da contagem de Spodoptera frugiperda (Lepidoptera: Noctuidae) em diferentes plantas hospedeiras (fator 1) em dois estádios vegetativos (fator 2), para obter o banco de dados e script, clique aqui

Para ler os arquivos do Excel, precisamos do pacote "readxl" [1], para isso usamos o comando: library(readxl)

Para ler o banco de dados, usar o comando:

df <- read_excel("DadosContagem.xlsx", sheet = 1)

Para visualizar o cabeçalho: head(df, n=2)

Antes de seguir com as analises é necesario verificar se as variáveis sao fatores, para isso usamos o comando:

is.factor(df$Estadio): Perguntar se Estádio é fator

is.factor(df$Bloco): Perguntar se Bloco é fator

is.factor(df$Cultura): Perguntar se Estádio é fator

Caso a resposta seja "FALSE", é necessário converter as variáveis.

df$Estadio<-as.factor(df$Estadio): Conversão da variável Estadio a um fator

df$Bloco<-as.factor(df$Bloco): Conversão da variável Estadio a um fator

df$Cultura<-as.factor(df$Cultura): Conversão da variável Estadio a um fator

após a conversão é necessário verificar se deu certo.

is.factor(df$Estadio): Perguntar novamente se Estádio é fator

is.factor(df$Bloco): Perguntar novamente se Bloco é fator

is.factor(df$Cultura): Perguntar novamente se Estádio é fator

Se a resposta for "TRUE", podemos seguir com as análises

OBS: caso tenha dúvida sobre os passos descritos a cima, consultar os capítulos anteriores.


5. Teste de ajuste

Vamos testar o ajuste dos modelos Poisson, quase-Poisson e Binomial Negativo:

Modelo.poisson<-glm(SfrugTot~Estadio*Cultura+Bloco, family= "poisson", data=df)

Modelo.qpoisson<-glm(SfrugTot~Estadio*Cultura+Bloco, family= "quasipoisson", data=df)

library(MASS) - lembre-se que é necessário carregar esse pacote MASS [2] para testar o modelo binomial negativo.

Modelo.BN<-glm.nb(SfrugTot~Estadio*Cultura+Bloco, data=df)

Agora vamos testar se o modelo se ajustou aos dados, para isso vamos rodar o pacote hnp [3] com o seguinte comando:

require(hnp)

hnp(Modelo.poisson, print.on="T", main="Poisson")

É possível observar que o modelo Poisson se ajustou aos dados, pois nenhum dos pontos ficou fora das linhas, portanto, utilizaremos esse modelo.

Após escolher o modelo, podemos rodar o comando ANOVA. Como o modelo de poisson se ajustou os dados, vamos usar o teste de qui-quadrado (Chisq):

anova(Modelo.poisson, test="Chisq")

Esse é o resumo da análise de deviance. É possível observar que houve interação sig- nificativa envolvendo os fatores Estádio e Cultura.

Analysis of Deviance Table - Model: poisson, link: log

Response: SfrugTot


6. Desdobramento da interação

Como a interação foi significativa, vamos realizar o desdobramento da interação, precisamos conhecer os níveis de cada fator. Para isto vamos utilizar a função sqldf do pacote sqldf [8]

sqldf::sqldf("select distinct Estadio from df"): Verificar os níveis do fator Estadio

sqldf::sqldf("select distinct Cultura from df"): Verificar os níveis do fator Cultura

Para o fator Estádio nós temos: V5, V7 e V8.

Enquanto para Cultura nós temos: Milhoconv; MilhoBt e Urochloa

Vamos comparar primeiro os estádios dentro de cada cultura.

Primeiro, faremos um subset dentro de cada cultura:

EstadiosMC<-subset(df, df$Cultura=="Milhoconv")

EstadiosMBt<-subset(df, df$Cultura=="MilhoBt")

EstadiosU<-subset(df, df$Cultura=="Urochloa")

Depois, precisaremos criar um modelo para cultura

Modelo.EstadiosMC<-glm(SfrugTot~Estadio+Bloco, family= "poisson", data=EstadiosMC)

Modelo.EstadiosMBt<-glm(SfrugTot~Estadio+Bloco, family= "poisson", data=EstadiosMBt)

Modelo.EstadiosU<-glm(SfrugTot~Estadio+Bloco, family= "poisson", data=EstadiosU)

Para realizar as comparações, nós precisaremos do pacote "multcomp" [7], para isso vamos rodar a linha de comando (ela irá carregar ou instalar o pacote, caso necessário):

if(!require(multcomp)){install.packages("multcomp")}

Modelo para os dados de milho convencional:

Comp.EstadiosMC<-summary(glht(Modelo.EstadiosMC,linfct=mcp(Estadio="Tukey")))

Modelo para os dados de milho Bt:

Comp.EstadiosMBt<-summary(glht(Modelo.EstadiosMBt, infct=mcp(Estadio="Tukey")))

Modelo para os dados de Urochloa:

Comp.EstadiosU<-summary(glht(Modelo.EstadiosU, linfct=mcp(Estadio="Tukey")))

Resultados das comparações na forma de probabilidade:

(Comp.EstadiosMC<-summary(Comp.EstadiosMC, test = univariate()))

(Comp.EstadiosMBt<-summary(Comp.EstadiosMBt, test = univariate()))

(Comp.EstadiosU<-summary(Comp.EstadiosU, test = univariate()))

A partir dos resultados das comparações na forma de probabilidade podemos notar que houve diferença significativa apenas na terceira comparação em "V8 - V5" e "V8 - V7".

Para visualizar de forma mais clara, é possível atribuir letras para as diferenças significativas, com os comando a baixo:

(Letras.EstadiosMC<-cld(Comp.EstadiosMC, level=0.05, Letters= c(LETTERS, letters), decreasing=TRUE))

(Letras.EstadiosMBt<-cld(Comp.EstadiosMBt, level=0.05, Letters= c(LETTERS, letters), decreasing=TRUE))

(Letras.EstadiosU<-cld(Comp.EstadiosU, level=0.05, Letters= c(LETTERS, letters), decreasing=TRUE))

Com a atribuição de letras podemos confirmar a diferença estatística que ocorre na última comparação.

Agora vamos comparar as culturas dentro de cada estádio.

Faremos um subset dentro de cada estádio:

CulturasV5<-subset(df, df$Estadio=="V5")

CulturasV7<-subset(df, df$Estadio=="V7")

CulturasV8<-subset(df, df$Estadio=="V8")

Posteriormente, necessitaremos criar um modelo para cada estádio.

Modelo.V5<-glm(SfrugTot~Cultura+Bloco, family= "poisson", data=CulturasV5)

Modelo.V7<-glm(SfrugTot~Cultura+Bloco, family= "poisson", data=CulturasV7)

Modelo.V8<-glm(SfrugTot~Cultura+Bloco, family= "poisson", data=CulturasV8)

Vamos realizar as comparações utilizando o mesmo método anterior, só contrastando o fator "Cultura".

Comp.CulturasV5<-summary(glht(Modelo.V5, linfct=mcp(Cultura="Tukey")))

Comp.CulturasV7<-summary(glht(Modelo.V7, linfct=mcp(Cultura="Tukey")))

Comp.CulturasV8<-summary(glht(Modelo.V8, linfct=mcp(Cultura="Tukey")))

Resultados das comparações na forma de probabilidade:

(Comp.CulturasV5<-summary(Comp.CulturasV5, test = univariate()))

(Comp.CulturasV7<-summary(Comp.CulturasV7, test = univariate()))

(Comp.CulturasV8<-summary(Comp.CulturasV8, test = univariate()))

A partir dos resultados das comparações na forma de probabilidade podemos notar que houve diferença significativa apenas na primeira comparação em "Urochloa - Milhoconv" e na ultima comparação em "Urochloa - Milhoconv".

Para visualizar de forma mais clara, é possível atribuir letras para as diferenças significativas, com os comando a baixo:

(Letras.CulturasV5<-cld(Comp.CulturasV5, level=0.05, Letters= c(letters, letters), decreasing=TRUE))

(Letras.CulturasV7<-cld(Comp.CulturasV5, level=0.05, Letters= c(letters, letters), decreasing=TRUE))

(Letras.CulturasV8<-cld(Comp.CulturasV5, level=0.05, Letters= c(letters, letters), decreasing=TRUE))

Com a atribuição de letras podemos confirmar a diferença estatistica que ocorre na ultima comparação.

Agora vamos realizar uma análise descritiva, para isso precisamos do pacote "Rmisc" [2]. Vamos rodar a linha de comando a baixo, ela instalará o pacote, caso necessário.

if(!require(Rmisc)){install.packages("Rmisc")}: vamos utilizar o pacote "Rmisc"

Em seguida, fazemos um "summary", para visualizar um resumo da análise:

summarySE(df, measurevar = "SfrugTot", groupvars = c("Estadio", "Cultura"))

Os valores que não possuem variabilidade não podem ser considerados nas compara-ções. Os valores obtidos a partir da análise descritiva pode ser colocada em uma tabela da seguinte forma:

Letras minúsculas comparam culturas dentro do fator estádio (comparação dentro das colunas), enquanto letras maiúsculas comparam estádios dentro de cada cultura (comparação dentro das linhas). *Como não houve variabilidade nesse tratamento, o mesmo não será considerado nas comparações.

Anexo - Banco de Dados 1

Host

Rep

y

Brachiaria

1

13

Brachiaria

2

20

Brachiaria

3

24

Brachiaria

4

17

Brachiaria

5

22

Brachiaria

6

2

Brachiaria

7

17

Brachiaria

8

15

Brachiaria

9

26

Brachiaria

10

19

Crotalaria

1

36

Crotalaria

2

50

Crotalaria

3

1

Crotalaria

4

34

Crotalaria

5

2

Crotalaria

6

48

Crotalaria

7

6

Crotalaria

8

45

Crotalaria

9

27

Crotalaria

10

6

Algodão

1

216

Algodão

2

180

Algodão

3

197

Algodão

4

124

Algodão

5

180

Algodão

6

281

Algodão

7

203

Algodão

8

100

Algodão

9

228

Algodão

10

239

Soja

1

29

Soja

2

4

Soja

3

61

Soja

4

50

Soja

5

34

Soja

6

77

Soja

7

84

Soja

8

70

Soja

9

103

Soja

10

71

Milho

1

222

Milho

2

218

Milho

3

373

Milho

4

400

Milho

5

478

Milho

6

454

Milho

7

400

Milho

8

263

Milho

9

472

Milho

10

382

Guandu

1

2

Guandu

2

2

Guandu

3

4

Guandu

4

0

Guandu

5

2

Guandu

6

0

Guandu

7

5

Guandu

8

3

Guandu

9

0

Guandu

10

1

Mucuna Preta

1

0

Mucuna Preta

2

0

Mucuna Preta

3

0

Mucuna Preta

4

2

Mucuna Preta

5

4

Mucuna Preta

6

0

Mucuna Preta

7

1

Mucuna Preta

8

1

Mucuna Preta

9

5

Mucuna Preta

10

3

Sorgo

1

2

Sorgo

2

0

Sorgo

3

5

Sorgo

4

4

Sorgo

5

0

Sorgo

6

4

Sorgo

7

0

Sorgo

8

0

Sorgo

9

1

Sorgo

10

0

Girassol

1

2

Girassol

2

0

Girassol

3

1

Girassol

4

0

Girassol

5

1

Girassol

6

0

Girassol

7

0

Girassol

8

0

Girassol

9

1

Girassol

10

1

Pousio

1

0

Pousio

2

0

Pousio

3

1

Pousio

4

0

Pousio

5

1

Pousio

6

0

Pousio

7

0

Pousio

8

0

Pousio

9

0

Pousio

10

0


6. Referências dos pacotes utilizados

[1] Wickham H., Bryan J. readxl: Read Excel Files. R package version 1.3.1. 2019. https://CRAN.R-project.org/package=readxl

[2] Hope, R.M. Rmisc: Rmisc: Ryan Miscellaneous. R package version 1.5. https://CRAN.R-project.org/package=Rmisc. 2013.

[3] Venables W.N., Ripley B. D. Modern Applied Statistics with S. Fourth Edition. Springer, New York. 2002.

[4] Moral, R.A., Hinde, J., Demétrio, C.G.B. Half-normal plots and overdispersed models in R: The hnp package. Journal of Statistical Software, v. 81, n. 10, 2017.

[5] Demétrio, C.G.B. Modelos lineares generalizados em experimentação agronômica. USP/ESALQ, 2001.

[6] Demétrio, C.G., Hinde, J., Moral, R.A. Models for overdispersed data in entomology. In: Ecological modelling applied to entomology. Springer, Cham, 2014. p. 219-259.

[7] Hothorn, T., Bretz F., Westfall P. Simultaneous inference in general parametric models. Biometrical Journal 50(3), 346--363. 2008.

[8] Grothendieck, G. sqldf: Manipulate R Data Frames Using SQL. R package version 0.4-11. https://CRAN.R-project.org/package=sqldf. 2017.


7. Referências dos pacotes utilizados

Demétrio, C.G.B. Modelos lineares generalizados em experimentação agronômica. USP/ESALQ, 2001.

Demétrio, C.G., Hinde, J., Moral, R.A. Models for overdispersed data in entomology. In: Ecological modelling applied to entomology. Springer, Cham, 2014. p. 219-259.


Autores

José Bruno Malaquias, Instituto de Biociências - Campus de Botucatu. R. Prof. Dr. Antônio Celso Wagner Zanin, 250 - Distrito de Rubião Junior - Botucatu/SP, Brasil - CEP 18618-689

Jéssica Karina da Silva Pachú, Departamento de Entomologia e Acarologia - LEA Avenida Pádua Dias, 11 - CEP 13418-900 - Piracicaba/SP, Brasil

Filipe Lemos Jacques, Universidade Federal da Grande Dourados - Unidade I: Rua João Rosa Góes, nº 1761, Vila Progresso, Dourados/ MS, Brasil, CEP: 79825-070

Paulo Eduardo Degrande, Universidade Federal da Grande Dourados - Unidade I: Rua João Rosa Góes, nº 1761, Vila Progresso, Dourados/ MS, Brasil, CEP: 79825-070

* Autor para correspondência: malaquias.josebruno@gmail.com