Tabela de conteúdos
Uso da Linguagem R para Análise de Dados em Ecologia
6. Modelos Lineares
São chamados modelos lineares aqueles que apresentam uma relação entre variáveis que seja linear nos parâmetros. Essa linearidade implica que matematicamente a variação de cada um dos parâmetros é independente dos demais parâmetros do modelo.
Em termos gerais, podemos reconhecer dois grandes grupos clássicos de modelos lineares:
- Modelos de Regressão.
- Modelos de Análise de Variância.
Nesse tópico utlizaremos os arquivos de dados:
Regressão Linear
Os modelos lineares de regressão são utilizados para modelar a relação entre variáveis quantitativas:
- Variável Resposta (y): variável quantitativa (também chamada de variável dependente).
- Variáveis Preditoras (x): variáveis quantitativas (também chamadas de variáveis independentes).
A função 'lm'
A função utilizada para construir modelos lineares de regressão é a função 'lm' que tem os seguintes argumentos principais:
lm( formula, data, weights, subset, na.action )
'formula' - é uma fórmula estatística que indica o modelo a ser ajustado. Possui a mesma forma básica que foi vista na funções gráficas.'data' - o conjunto de dados (data.frame).'weights' - são os pesos para regressão ponderada.'subset' - um vetor com as condições que definem um sub-conjunto dos dados.'na.acation' - função que especifica o que fazer no caso de observações perdidas (NA). O valor default é'na.omit' que elimina as linhas (observações) que possuem observações perdidas nas variáveis definidas na fórmula.
Vejamos um exemplo simples:
> egr = read.csv("egrandis.csv",header=T)
> egr[1,]
especie rot regiao inv faz proj talhao parcela arv fuste cap ht hdom
1 E.grandis 1 Botucatu 1995 36 33 1 1 1 1 57 27 NA
idade carac dap
1 7.49315 N 18.14366
>
> hipso1 = lm( ht ~ dap, data=egr )
> class(hipso1)
[1] "lm"
>
Uma Palavra sobre o Argumento 'formula'
O argumento fórmula nos modelos lineares é bastante diverso das fórmulas matemáticas usuais. Nesse argumento, sinais de mais e de menos, símbolos como circunfexo (^) e asterísco (*) têm significado bastante diferente dos significados usuais matemáticos.
Apresentaremos agora alguns aspectos básicos do argumento:
'y ~ x' indica: modele y como função estatística de x;'y ~ x1 + x2' indica: modele y como função estatística das variáveis x1 e x2 (efeito aditivo dos modelos lineares);
Se quisermos utilizar os símbolos matemáticos no sentido matemático usual dentro de uma fórmula estatística, temos que utilizar
a função 'I()':
' y ~ I( x1^2 * x2^3 )' indica: modele y como função estatística da variável (x1^2 * x2^3);' y ~ I( x1 / x2 )' indica: modele y como função estatística da variável (x1/x2);
No caso de utilizarmos funções matemáticas específicas a função 'I()' torna-se desnecessária:
'log(y) ~ log(x)' indica: modele o log(y) com função estatística da variável log(x));'log(y) ~ log(x1^2 * x2)' indica: modele o log(y) com função estatística da variável log(x1^2 * x2));
Mais detalhes sobre o argumento 'formula' serão apresentados mais adiante.
Exercícios
<box 100% left red | Exercício: Relação Diâmetro-Altura em Florestas Plantadas >
Ajuste um modelo de regressão linear simples da altura (ht) em função do DAP (dap) das árvores de floresta plantada
(dados-egrandis) para cada uma das rotações (rot).
</box>
<box 100% left red | Exercício: Equação de Biomassa para Árvores de Eucalyptus saligna >
Utilizando o conjunto de dados de E. Saligna (dados-esaligna), construa um modelo de regressão da biomassa do tronco das árvores (tronco') em função do diâmetro (dap) e altura (ht), utizando dois modelos:
<latex>
b_i = \beta_0 + \beta_1 (d_i^2\, h_i) + \varepsilon_i
</latex>
e
<latex>
\ln( b_i ) = \beta_0 + \beta_1 \ln(d_i) + \beta_2 \ln(h_i) + \varepsilon_i
</latex>
onde:
- <latex>b_i</latex> é biomassa do tronco;
- <latex>d_i</latex> é o DAP da árvore;
- <latex>h_i</latex> é a altura toral da árvore;
</box>
Funções que Atuam sobre Objetos 'lm'
O objeto produzido pela função 'lm' tem classe 'lm' (linear model), ou seja é um modelo linear. Como modelo linear, esse objeto receberá tratamento particular se utilizarmos algumas funções básicas sobre ele.
- summary: a função
'summary' apresenta um resumo do modelo linear com:- estatísticas descritivas dos resíduos;
- teste t dos coeficientes de regressão;
- erro padrão da estimativa;
- coeficiente de determinação e coef. de det. ajustado;
- teste F geral do modelo.
> summary( hipso1 )
Call:
lm(formula = ht ~ dap, data = egr)
Residuals:
Min 1Q Median 3Q Max
-12.9306 -2.1109 -0.5408 1.6642 20.9390
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.79604 0.12120 6.568 5.63e-11 ***
dap 1.27232 0.01006 126.459 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.093 on 4800 degrees of freedom
Multiple R-Squared: 0.7691, Adjusted R-squared: 0.7691
F-statistic: 1.599e+04 on 1 and 4800 DF, p-value: < 2.2e-16
- anova: a função
'anova' apresenta a Tabela de análise de variância, tendo as variáveis preditoras como fatores:
> anova( hipso1 )
Analysis of Variance Table
Response: ht
Df Sum Sq Mean Sq F value Pr(>F)
dap 1 153020 153020 15992 < 2.2e-16 ***
Residuals 4800 45929 10
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
- plot: a função
'plot' apresenta uma série de gráficos para análise do modelo. Ela possui o argumento'which' que define quais dos seis gráficos pré-definidos se deseja ver:
| which | O que a função faz | Verificação do modelo |
|---|---|---|
which=1 | gráfico de dispersão resíduo versus valor ajustado | Linearidade na relação x-y |
which=2 | gráfico quantil-quantil normal dos resíduos | Normalidade |
which=3 | gráfico de dispersão da raiz quadrada do valor absoluto do resíduo padronizado versus valor ajustado | Homogeneidade de variâncias |
which=4 | distância de Cook por observação | Observações influentes |
which=5 | gráfico de dispersão do resíduo padronizado versus leverage (medida de influência) , com a distância de Cook | Observações influentes |
which=6 | gráfico de dispersão da distância de Cook versus leverage (medida de influência) | Observações influentes |
O valor default do argumento which é 'which = c(1:3, 5)'.
> plot( hipso1 ) Hit <Return> to see next plot: Hit <Return> to see next plot: Hit <Return> to see next plot: Hit <Return> to see next plot: >
- coef: a função
'coef' retorna os coeficientes de regressão do modelo linear:
> coef( hipso1 ) (Intercept) dap 0.7960402 1.2723242 >
* residuals: a função 'residuals' (também pode ser evocada por 'resid') retorna os resíduos do modelo linear.
* fitted: a função 'fitted' (também pode ser evocada por 'fitted.values') retorna os valores ajustados do modelo linear.
> plot( resid( hipso1 ), fitted( hipso1 ) )
* predict: a função 'predict' retorna os valores preditos para novas observações:
> predict( hipso1, data.frame( dap=c(10,50,100) ) )
1 2 3
13.51928 64.41225 128.02846
>
> predict( hipso1, data.frame( dap=range(egr$dap) ) )
1 2
6.060955 38.055431
>
Exercícios
<box 100% left red | Exercício: Analisando os Modelos de Regressão > Utilizando as funções apresentadas acima analise os modelos de regressão construídos nos exercícios anteriores com relação a:
- adequação das pressuposições dos modelos lineares;
- significância das estimativas dos coeficientes de regressão;
- qualidade dos modelos para uso em predições.
</box>
<box 100% left red | Exercício: Realizando Predições > Considere as árvores da tabela abaixo:
| Árvore | DAP | Altura |
|---|---|---|
| 1 | 10 cm | 12 m |
| 2 | 20 cm | 25 m |
| 3 | 30 cm | 40 m |
Faça a predição da biomassa do tronco das árvores com base nos dois modelos de equação de biomassa ajustados. </box>
Regressão Ponderada
A regressão ponderada é utilizada para corrigir o problema de heterogeneidade de variâncias.
Consideremos o exercício do modelo de equação de biomassa do tronco em função do diâmetro e altura. O modelo original apresenta claramente problemas com a pressuposição de homogeneidade de variâncias:
> esa = read.csv("esaligna.csv",header=T)
> plot( lm( tronco ~ I(dap^2 * ht), data=esa ) , which=c(1,3) )
Hit <Return> to see next plot:
Hit <Return> to see next plot:
>
Se o modelo for ponderado por uma potência do inverso da variável preditora ( 1/(dap^2 * ht) ), talvez se torne um modelo com variância homogênea.
> plot( lm( tronco ~ I(dap^2*ht), data=esa, weights=1/(dap^2*ht)^0.5 ), which=3 ) > plot( lm( tronco ~ I(dap^2*ht), data=esa, weights=1/(dap^2*ht)^0 ), which=3 ) > plot( lm( tronco ~ I(dap^2*ht), data=esa, weights=1/(dap^2*ht)^1 ), which=3 ) > plot( lm( tronco ~ I(dap^2*ht), data=esa, weights=1/(dap^2*ht)^2 ), which=3 ) > plot( lm( tronco ~ I(dap^2*ht), data=esa, weights=1/(dap^2*ht)^3 ), which=3 ) >
Qual dos valores de potência (0.5; 0; 1; 2; 3) lhe parece mais adequado?
Exercícios
<box left red | Exercício: Modelos de Biomassa para Eucalyptus saligna > Utilizando o mesmo modelo do exemplo acima, ajuste modelos de equação de biomassa para
- biomassa total (
total) e - biomassa de ramos (
sobra),
de modo que os modelos não possuam problema de heterogeneidade de variância. </box>
Variável Factor como Variável Indicadora (dummy)
Uma forma de incluirmos variáveis categóricas em modelos de regressão é através do uso de variáveis indicadoras. Para isso, as variáveis categóricas no R devem ser vistas como uma variável 'factor'.
A variável 'factor' indica uma variável que possui níveis (levels) sendo, portanto, uma variável categórica típica dos modelos estatísticos.
Esse tipo de variável existe no R para tornar mais fácil a modelagem estatística. Assim, quando o R lê um conjunto de dados e encontra uma
variável alfa-numérica, ele automaticamente assume que se trata de uma variável 'factor'.
Vejamos como exemplo os dados de inventário floresta em floresta plantada:
> egr = read.csv("egrandis.csv",header=T)
>
> names(egr)
[1] "especie" "rot" "regiao" "inv" "faz" "proj" "talhao"
[8] "parcela" "arv" "fuste" "cap" "ht" "hdom" "idade"
[15] "carac" "dap"
>
> class( egr$regiao )
[1] "factor"
> class( egr$especie )
[1] "factor"
> class( egr$rot )
[1] "integer"
> class( egr$faz )
[1] "integer"
>
Note que as variáveis 'regiao e 'especie' foram assumias como 'factor'.
Note também que as variáveis 'rot' (rotação) e 'faz' (fazenda) embora também sejam variáveis categóricas, elas foram codificadas por números inteiros e, consequentemente, o R assumiu tratar-se de variáveis quantitativas.
Nos modelos lineares de regressão, as variáveis 'factor' podem ser assumidas automaticamente como variáveis indicadoras (variáveis dummy).
> hipso2 = lm( ht ~ dap + regiao, data=egr )
> summary( hipso2 )
Call:
lm(formula = ht ~ dap + regiao, data = egr)
Residuals:
Min 1Q Median 3Q Max
-10.6196 -1.6235 -0.3575 1.2476 19.5109
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.079650 0.145714 34.86 <2e-16 ***
dap 1.116119 0.009403 118.70 <2e-16 ***
regiaoBotucatu -3.627353 0.100221 -36.19 <2e-16 ***
regiaoItatinga -3.827592 0.100715 -38.00 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.647 on 4798 degrees of freedom
Multiple R-Squared: 0.831, Adjusted R-squared: 0.8309
F-statistic: 7866 on 3 and 4798 DF, p-value: < 2.2e-16
Nesse caso ('ht ~ dap + regiao') a variável região entrou alterando o intercepto da regressão entre altura (ht) e diâmetro (dap).
Note que além do coeficiente de inclinação para variável 'dap' aparecem coeficientes de regressão associados às variáveis 'regiaoBotucatu' e 'regiaoItatinga'. O que significa isso?
O modelo ajustado pela fórmula 'ht ~ dap + regiao' é:
<latex>
h_i = \beta_0 + \beta_1 d_i + \beta_2 I_{\textrm{Botucatu}} + \beta_3 I_{\text{Itatinga}} + \varepsilon_i
</latex>
onde:
- <latex>h_i</latex> é a altura das árvores;
- <latex>d_i</latex> é o DAP das árvores;
- <latex>I_{\textrm{Botucatu}}</latex> é a variável indicadora para região Botucatu, isto é, ela tem valor 1 se a região for Botucatu e valor 0 (zero) se a região não for Botucatu;
- <latex>I_{\textrm{Itatinga}}</latex> é a variável indicadora para região Itatinga.
A variável região tem três níveis (levels)
> levels(egr$regiao) [1] "Bofete" "Botucatu" "Itatinga" >
O R cria automaticamente 2 variáveis indicadoras, uma para Botucatu e outra para Itatinga, pois a região de Bofete (primeiro nível do fator) é assumida como o default.
Como se utiliza o modelo para predição?
- Para Bofete a predição é: <latex> \widehat{h}_i = \beta_0 + \beta_2 d_i </latex>
- Para Botucatu a predição é: <latex> \widehat{h}_i = (\beta_0 + \beta_3) + \beta_2 d_i </latex>
- Para Itatinga a predição é: <latex> \widehat{h}_i = (\beta_0 + \beta_4) + \beta_2 d_i </latex>
É possível ajustar um modelo de interação completo do diâmetro com a variável região, alterando o intercepto e a inclinação do modelo em cada regiões:
>
> hipso3 = lm( ht ~ dap * regiao, data=egr )
> summary( hipso3 )
Call:
lm(formula = ht ~ dap * regiao, data = egr)
Residuals:
Min 1Q Median 3Q Max
-12.8439 -1.5492 -0.2357 1.2582 19.3736
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.99813 0.20736 38.570 < 2e-16 ***
dap 0.90370 0.01436 62.935 < 2e-16 ***
regiaoBotucatu -9.03699 0.25969 -34.799 < 2e-16 ***
regiaoItatinga -5.74018 0.29200 -19.658 < 2e-16 ***
dap:regiaoBotucatu 0.45060 0.01981 22.750 < 2e-16 ***
dap:regiaoItatinga 0.10746 0.02503 4.293 1.80e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.508 on 4796 degrees of freedom
Multiple R-Squared: 0.8484, Adjusted R-squared: 0.8483
F-statistic: 5369 on 5 and 4796 DF, p-value: < 2.2e-16
Note que se quisermos usar uma variável como indicadora, mas ela foi codificada como variável numérica, teremos que forçar sua transformação em
variável 'factor':
coef( lm( ht ~ dap * rot, data = egr ) )
(Intercept) dap rot dap:rot
3.790676759 1.206524873 -1.556650365 0.004740839
>
>
> coef( lm( ht ~ dap * as.factor(rot) , data = egr ) )
(Intercept) dap as.factor(rot)2 dap:as.factor(rot)2
2.234026394 1.211265712 -1.556650365 0.004740839
Exercícios
<box 100% left red | Exercício: Altura das Árvores Dominantes em Floresta Plantada > Considere o seguinte modelo (modelo de Schumacher):
<latex>
\ln( y_i ) = \beta_0 + \beta_1 (1/x_i) + \varepsilon_i
</latex>
Ajuste esse modelo de regressão à altura das árvores dominantes (hdom) em função da idade (idade) das árvores da floresta plantada (dados-egrandis).
Compare um modelo geral (ajustado a todos os dados) com um modelo ajustado por região.
Compare os resíduos do modelo geral com os resíduos do modelo por região, analisando a distribuição do resíduo por região.
</box>
<box 100% left red | Exercício: Relação Altura-Diâmetro de Árvores de Caixeta >
Ajuste modelos de regressão linear da altura ('h') em função do diâmetro ('dap') somente para árvores de caixeta (Tabebuia cassinoides) nos diferentes caixetais ('local').
Considere nessa tarefa os seguintes modelos:
<latex> \begin{array}{ll}
\textrm{Modelo A:}\quad & h_i = \beta_0 + \beta_1 d_i + \varepsilon_i \\
\textrm{Modelo B:}\quad & \ln( h_i ) = \beta_0 + \beta_1 \ln(d_i) + \varepsilon_i \\
\textrm{Modelo C:}\quad & h_i = \beta_0 + \beta_1 d_i + \beta_2 d_i^2 + \varepsilon_i \\
\end{array} </latex>
</box>
Análise de Variância
Os objetivos dos modelos lineares de análise de variância são bem diferentes dos modelos lineares de regressão. Nos modelos de regressão a questão central é estimar parâmetros, seja para explicar relações, seja para fazer predições.
Nos modelos de análise de variância a questão é comparar a importância de fatores sobre o comportamento da variável resposta.
Experimento em Blocos Casualizados
Tomemos como exemplo os dados do experimento de mudas no viveiro (dados-mudas). Nesse experimento temos os seguintes fatores:
- Espécie (
'especie'), - Bloco (
'bloco'), e - Substrtato (
'substrato').
O experimento deseja saber se existe diferença entre os substratos no crescimento em altura ('altura') das mudas. O delineamento foi em blocos casualizados ('bloco').
Para visualizar esse experimento podemos ler os dados do arquivo altura-mudas.csv, através da função 'plot':
>
> mudas = read.csv("dados/altura-mudas.csv",header=T)
> summary(mudas)
especie bloco substrato altura
paineira:60 Min. :1.0 Min. : 1.0 Min. : 15.40
tamboril:60 1st Qu.:2.0 1st Qu.: 3.0 1st Qu.: 32.21
Median :3.5 Median : 5.5 Median : 46.00
Mean :3.5 Mean : 5.5 Mean : 49.20
3rd Qu.:5.0 3rd Qu.: 8.0 3rd Qu.: 65.00
Max. :6.0 Max. :10.0 Max. :105.12
>
>
> plot( altura ~ bloco + substrato , data=mudas , subset=especie=="paineira")
Hit <Return> to see next plot:
Hit <Return> to see next plot:
>
> plot( altura ~ bloco + substrato , data=mudas , subset=especie=="tamboril")
Hit <Return> to see next plot:
Hit <Return> to see next plot:
>
Para ajustar um modelo linear num experimento, podemos utilizar a função 'lm' como no caso da regressão linear:
> muda.pai = lm( altura ~ as.factor(bloco) + as.factor(substrato), data=mudas, subset= especie=="paineira" ) > class(muda.pai) [1] "lm" > > muda.tam = lm( altura ~ as.factor(bloco) + as.factor(substrato), data=mudas, subset= especie=="tamboril" ) > class(muda.tam) [1] "lm" >
Para analisar as pressuposições do modelo utilizamos a função 'plot', da mesma forma que se faz na regressão linear.
Sendo um experimento, o interesse principal é verificar a importância dos fatores: os tratamentos ('substrato') e os blocos ('bloco'). Para isso utilizamos a função 'anova':
> anova( muda.pai )
Analysis of Variance Table
Response: altura
Df Sum Sq Mean Sq F value Pr(>F)
as.factor(bloco) 5 3822.1 764.4 13.664 4.016e-08 ***
as.factor(substrato) 9 27204.4 3022.7 54.030 < 2.2e-16 ***
Residuals 45 2517.5 55.9
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
> anova( muda.tam )
Analysis of Variance Table
Response: altura
Df Sum Sq Mean Sq F value Pr(>F)
as.factor(bloco) 5 2582.6 516.5 5.1933 0.0007594 ***
as.factor(substrato) 9 9181.3 1020.1 10.2570 2.177e-08 ***
Residuals 45 4475.6 99.5
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
Exercícios
<box 100% left red | Exercício: Altura dos Caixetais > Verifique se existe diferenças estatísticamente significativas na altura média dos caixetais (caxieta.csv).
Será que os caixetais diferem em termos de altura máxima ou área basal? </box>
Outros Delineamentos Experimentais
Considere o experimento de mudas de espécies arbóreas. Se ao invés de trabalhar com a espécie em duas análises separadas, houvesse interesse em fazer uma análise conjunta das duas espécies, verificando a interação entre espécie e substrato.
Nesse caso, o experimento se torna um experimento fatorial 2 x 10:
>
> muda.sp = lm( altura ~ as.factor(bloco) + especie * as.factor(substrato), data=mudas )
> anova(muda.sp)
Analysis of Variance Table
Response: altura
Df Sum Sq Mean Sq F value Pr(>F)
as.factor(bloco) 5 3956 791 7.9598 2.673e-06 ***
especie 1 3183 3183 32.0265 1.606e-07 ***
as.factor(substrato) 9 32910 3657 36.7909 < 2.2e-16 ***
especie:as.factor(substrato) 9 3476 386 3.8853 0.0003163 ***
Residuals 95 9442 99
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
No que a fórmula para o experimento é apresentada de modo diferente:
altura ~ as.factor(bloco) + especie * as.factor(substrato)
O elemento especie * as.factor(substrato) inclui todos os efeitos ligados a interação entre espécie e substrato, e que aparecem na tabela de análise de variância:
- especie (com 1 grau de liberdade) se refere ao efeito principal da espécie;
- as.factor(substrato) (com 9 graus de liberdade) se refere ao efeito principal do susbstrato;
- especie:as.factor(substrato) (com 9 graus de liberdade) se refere à interação espécie
xsubstrato.
O elemento chave nessa fórmula é o asterísco ( * ) que representa todos os efeitos ligados a interação entre dois fatores. Como foi dito, na fórmula estatística os sinais convencionais de operações matemáticas tem outro significado. A tabela abaixo detalha os símbolos utilizados para definir diferentes delineamentos experimentais.
<box 45% center orange | Símbolos utilizados nas Fórmulas Estatísticas para definir diferentes Delineamentos Experimentais>
| Expressão | Significado |
|---|---|
| Y ~ X | Modele Y como função estatística de X |
| A + B | inclui ambos os fatores A e B |
| A - B | inclui todos os efeitos em A, exceto os que estão em B |
| A * B | A + B + A:B |
| A / B | A + B %in% (A) modelos hierárquicos |
| A:B | efeito da interação entre os fatores A e B |
| B %in% A | efeitos de B dentro dos níveis de A |
| A^m | todos os termos de A cruzados até à ordem m |
</box>
Aliadas a esses símbolos, o R possui uma série de funções que permitem a análise de virtualmente qualquer delineamento experimental. Esse tópico requer, no entanto, um curso específico de análise experimental utilizando o R, e vai muito além do objetivo desse curso introdutório.
Exercícios
<box 100% left red | Exercício: Fatores que Influência a Altura em Florestas Plantadas I >
Utilizando os dados de árvores de floresta plantada (dados-egrandis), tome a altura média das árvores dominantes (média de 'hdom' por 'parcela') como variável resposta e verifique a influência dos fatores: região ('regiao') e rotação ('rot').
Para discussão: a relação entre esses fatores deve ser de interação ou hierárquica? </box>
<box 100% left red | Exercício: Fatores que Influência a Altura em Florestas Plantadas II >
Utilizando os dados de árvores de floresta plantada (dados-egrandis), tome a altura média das árvores dominantes (média de 'hdom' por 'parcela') como variável resposta e verifique a influência dos fatores: região ('regiao') e projeto ('proj').
Para discussão: a relação entre esses fatores deve ser de interação ou hierárquica? </box>
Explorando a Interação entre Fatores
Freqüentemente, a interpretação da interação entre dois ou mais fatores é espinhosa e chegar a conclusões baseado apenas na tabela de análise de variância pode gerar equívocos. Uma análise gráfica de interações é sempre instrutiva.
Existe no R a função 'interaction.plot' que permite construir gráficos de interação entre fatores que facilitam a interpretação dos resultados estatístico. Seus argumentos principais são:
function (x.factor, trace.factor, response, fun = mean )
- x.factor é o fator que ficará nas abscissas (eixo-x);
- trace.factor é o fator que será usado para distinguir diferentes linhas no gráfico;
- response é a variável resposta que será grafada nas ordenadas (eixo-y);
- fun é a função da estatística a ser utilizada.
Vejamos a interação entre espécies e substrato no experimento do crescimento de mudas de espécies arbóreas:
> interaction.plot( mudas$substrato, mudas$especie, mudas$altura , col=c("red","blue"))
Exercícios
<box 100% left red | Exercício: Fatores que Influência a Altura em Florestas Plantadas III >
Tomando a altura média das árvores dominantes (média de 'hdom por 'parcela') como variável resposta (dados de árvores de floresta plantada — dados-egrandis), verifique graficamente a interação entre região ('regiao') e rotação ('rot').
</box>
<box 100% left red | Exercício: Variabilidade de Caixetais > Considere os dados do levantamento em três caixetais (dados-caixeta).
Pergunta-se: em qual dos caixetais ('local'), o diâmetro das árvores ('dap') é mais variável entre as parcelas ('parcela') quando se considera:
- diâmetro médio;
- diâmetro mediano;
- diâmetro máximo?
Responda com base numa análise gráfica. </box>
Comparação de Modelos
Função "anova": mais do que ANOVA
Um aspecto essencial à construção de modelos lineares é a comparação entre modelos.
A função “anova”, apesar do nome, é uma função muito utilizada para comparar modelos lineares que pertençam a uma certa hierarquia de modelos.
Vejamos o exemplo de construção de uma equação de biomassa com o seguinte forma:
<box 100% center green> <latex>
b_i = \beta_0 + \beta_1 d_i + \beta_ d_i^2 + \beta_3 h_i + \beta_4 (d_i\, h_i) + \beta_5 (d_i^2\, h_i) + \beta_6 (d_i\, h_i^2) + \varepsilon_i
</latex> </box>
Embora esse seja um modelo muito problemático, ele serve para ilustrar o problema de seleção de modelos. Vejamos o que acontece utilizando os dados de árvores de E. saligna (dados-esaligna):
> biom = lm( total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 * ht) + I(dap * ht^2), data=esa )
> summary(biom)
Call:
lm(formula = total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 *
ht) + I(dap * ht^2), data = esa)
Residuals:
Min 1Q Median 3Q Max
-38.670 -7.688 -1.022 8.561 45.191
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -51.60332 65.40689 -0.789 0.437
dap 7.68140 11.24405 0.683 0.500
I(dap^2) 0.35420 0.53985 0.656 0.517
ht 7.48430 5.55867 1.346 0.189
I(dap * ht) -1.42975 0.82821 -1.726 0.095 .
I(dap^2 * ht) 0.03763 0.03461 1.087 0.286
I(dap * ht^2) 0.01105 0.01593 0.694 0.493
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 15.13 on 29 degrees of freedom
Multiple R-Squared: 0.9728, Adjusted R-squared: 0.9672
F-statistic: 172.9 on 6 and 29 DF, p-value: < 2.2e-16
>
Veja que nenhuma das variáveis preditoras se mostrou significativa (nível de probabilidade de 5%) para estimar a biomassa total das árvores. Mas esse resultado é razoável?
Vejamos o que a função “anova” nos mostra:
> anova(biom)
Analysis of Variance Table
Response: total
Df Sum Sq Mean Sq F value Pr(>F)
dap 1 218121 218121 952.7442 < 2.2e-16 ***
I(dap^2) 1 17791 17791 77.7108 1.063e-09 ***
ht 1 352 352 1.5375 0.22493
I(dap * ht) 1 312 312 1.3648 0.25222
I(dap^2 * ht) 1 816 816 3.5633 0.06911 .
I(dap * ht^2) 1 110 110 0.4811 0.49343
Residuals 29 6639 229
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
Nesse caso parece que o diâmetro e o diâmetro ao quadrado são significativos, mas os demais termos não. Por que os testes geram resultados diferentes?
As funções “summary” e “anova” realizam testes de forma distinta:
- O teste t da função summary testa cada variável preditora assumindo que todas as demais variáveis já estâo presentes no modelo.
- O teste F da função anova testa as variáveis preditoras na seqüência apresentada no modelo, assumindo que as variáveis anteriores já estavam no modelo.
Desta forma, a função anova realiza teste de um modelo contra outro numa seqüência definida. O mesmo resultado se obtem partindo o modelo original numa série de modelos:
<box 100% green>Modelo 0: <latex> b_i = \beta_0 + \varepsilon_i </latex></box>
<box 100% green>Modelo 1: <latex> b_i = \beta_0 + \beta_1 d_i + \varepsilon_i </latex></box>
<box 100% green>Modelo 2: <latex> b_i = \beta_0 + \beta_1 d_i + \beta_ d_i^2 + \varepsilon_i </latex></box>
<box 100% green>Modelo 3: <latex> b_i = \beta_0 + \beta_1 d_i + \beta_ d_i^2 + \beta_3 h_i + \varepsilon_i </latex></box>
<box 100% green>Modelo 4: <latex> b_i = \beta_0 + \beta_1 d_i + \beta_ d_i^2 + \beta_3 h_i + \beta_4 (d_i\, h_i) + \varepsilon_i </latex></box>
<box 100% green>Modelo 5: <latex> b_i = \beta_0 + \beta_1 d_i + \beta_ d_i^2 + \beta_3 h_i + \beta_4 (d_i\, h_i) + \beta_5 (d_i^2\, h_i) + \varepsilon_i </latex></box>
<box 100% green>Modelo 6: <latex> b_i = \beta_0 + \beta_1 d_i + \beta_ d_i^2 + \beta_3 h_i + \beta_4 (d_i\, h_i) + \beta_5 (d_i^2\, h_i) + \beta_6 (d_i\, h_i^2) + \varepsilon_i </latex></box>
Podemos ajustar esses modelos e utilizar a função anova para testá-los numa seqüência:
> m0 = lm( total ~ 1 , data=esa )
> m1 = lm( total ~ dap , data=esa )
> m2 = lm( total ~ dap + I(dap^2) , data=esa )
> m3 = lm( total ~ dap + I(dap^2) + ht , data=esa )
> m4 = lm( total ~ dap + I(dap^2) + ht + I(dap * ht), data=esa )
> m5 = lm( total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 * ht), data=esa )
> m6 = lm( total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 * ht) + I(dap * ht^2), data=esa )
>
>
> anova(m0, m1, m2, m3, m4, m5, m6)
Analysis of Variance Table
Model 1: total ~ 1
Model 2: total ~ dap
Model 3: total ~ dap + I(dap^2)
Model 4: total ~ dap + I(dap^2) + ht
Model 5: total ~ dap + I(dap^2) + ht + I(dap * ht)
Model 6: total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 * ht)
Model 7: total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 * ht) + I(dap *
ht^2)
Res.Df RSS Df Sum of Sq F Pr(>F)
1 35 244142
2 34 26021 1 218121 952.7442 < 2.2e-16 ***
3 33 8230 1 17791 77.7108 1.063e-09 ***
4 32 7878 1 352 1.5375 0.22493
5 31 7565 1 312 1.3648 0.25222
6 30 6749 1 816 3.5633 0.06911 .
7 29 6639 1 110 0.4811 0.49343
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
É importante lembrar que a função anova realiza o teste na ordem que os modelos são apresentados, e que isso pode ter forte influência nos resultados obtidos.
> anova( m0, lm(total ~ I(dap^2*ht),data=esa), lm( total ~ I(dap^2*ht) + dap, data=esa) ) Analysis of Variance Table Model 1: total ~ 1 Model 2: total ~ I(dap^2 * ht) Model 3: total ~ I(dap^2 * ht) + dap Res.Df RSS Df Sum of Sq F Pr(>F) 1 35 244142 2 34 22160 1 221982 473.534 < 2.2e-16 *** 3 33 15470 1 6690 14.272 0.0006292 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 >
Exercícios
<box 100% left red | Exercício: Biomassa do Tronco de Árvores de E. saligna >
Com base nos modelos apresentados acima, construa vários modelos para biomassa do tronco ('tronco') de E. salgina (dados-esaligna).
</box>
<box 100% left red | Exercício: Modelo Polinomial >
Construa um modelo polinomial (até quarto grau) da altura ('ht') em função do diâmetro ('dap') de árvores em caixetais (dados-caixeta). Verifique os termos significativos.
</box>
Algumas Funções para Comparação de Modelos
Existem várias outras funções para auxiliar na construção e comparação de modelos.
As funções 'add1' e 'drop1' permitem adicionar ou retirar um-a-um os termos dos modelos lineares:
> add1( object = m1, scope = . ~ dap + ht + I(dap*ht) + I(dap^2*ht) , test="F" )
Single term additions
Model:
total ~ dap
Df Sum of Sq RSS AIC F value Pr(F)
<none> 26020.8 241.0
ht 1 1.0 26019.7 243.0 0.0013 0.97162
I(dap * ht) 1 2507.0 23513.8 239.3 3.5184 0.06956 .
I(dap^2 * ht) 1 10551.1 15469.6 224.3 22.5077 3.912e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
> drop1( object = m6, scope = . ~ ., test="F" )
Single term deletions
Model:
total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 * ht) + I(dap *
ht^2)
Df Sum of Sq RSS AIC F value Pr(F)
<none> 6639.3 201.8
dap 1 106.8 6746.1 200.4 0.4667 0.49993
I(dap^2) 1 98.6 6737.8 200.4 0.4305 0.51693
ht 1 415.0 7054.3 202.0 1.8128 0.18860
I(dap * ht) 1 682.3 7321.5 203.3 2.9801 0.09493 .
I(dap^2 * ht) 1 270.7 6910.0 201.3 1.1824 0.28582
I(dap * ht^2) 1 110.2 6749.4 200.4 0.4811 0.49343
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>
>
> drop1( object = m6, scope = . ~ dap + ht, test="F" )
Single term deletions
Model:
total ~ dap + I(dap^2) + ht + I(dap * ht) + I(dap^2 * ht) + I(dap *
ht^2)
Df Sum of Sq RSS AIC F value Pr(F)
<none> 6639.3 201.8
dap 1 106.8 6746.1 200.4 0.4667 0.4999
ht 1 415.0 7054.3 202.0 1.8128 0.1886
>
Nessas duas funções, o ponto (“.”) na fórmula significa todos os termos do modelo. Ou seja, para um dado modelo, o 'scope' igual a “ . ~ . “ significa todos os termos da fórmula do modelo.
Outras funções úteis para construção e comparação de modelos são:
- “step” que realiza regressão stepwise; e
- “AIC” que calcula o Akaike Information Criterion.
> aic.tab = AIC( m0, m1, m2, m3, m4, m5, m6 ) > aic.tab$AIC.d = abs( c(0, diff(aic.tab$AIC)) ) > aic.tab df AIC AIC.d m0 2 423.7551 0.0000000 m1 3 345.1563 78.5987781 m2 4 305.7148 39.4414506 m3 5 306.1411 0.4262982 m4 6 306.6842 0.5430302 m5 7 304.5765 2.1077173 m6 8 305.9841 1.4076291 >
Exercícios
<box 100% left red | Exercício: Biomassa do Tronco de Árvores de E. saligna II >
Utilizando os modelos para biomassa do tronco ('tronco') de E. salgina construidos no exercício acima, utilize as funções drop1 e add1 para analisar a importância dos termos individuais do modelo.
</box>
<box 100% left red | Exercício: Relação Altura-Diâmetro em Florestas Plantadas> Utilize a função AIC para analisar a importância das variáveis indicadoras nos modelos de relação altura-diâmetro ajustados para florestas de E. grandis. </box>