Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
| 02_tutoriais:tutorial7:start [2020/10/02 21:09] – adalardo | 02_tutoriais:tutorial7:start [2025/10/27 11:35] (atual) – [As Lagartas] adalardo | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | <WRAP tabs> | ||
| + | * [[02_tutoriais: | ||
| + | * [[01_curso_atual: | ||
| + | * [[03_apostila: | ||
| + | </ | ||
| + | ====== 7a. Regressão Linear Simples | ||
| + | |||
| + | A primeira parte desse tutorial é baseado no [[http:// | ||
| + | <WRAP center round tip 60%> | ||
| + | A videoaula gravada no google meet no dia 02 de outubro de 2020 está ao final do tutorial. Dê preferência para as videoaulas do curso de **Principios de Planejamento e Análise de Dados** que estão colocadas ao longo do tutorial. Eles tratam o tema de modelos lineares de forma mais sucinta e tiveram alguma edição. Desconsiderem nesses vídeos as referências à disciplina. | ||
| + | </ | ||
| + | |||
| + | ===== Modelos Lineares ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Os modelos lineares são uma generalização dos testes de hipótese clássicos mais simples. Uma regressão linear, por exemplo, só pode ser aplicada para dados em que tanto a variável preditora quanto a resposta são contínuas, enquanto uma análise de variância é utilizada quando a variável preditora é categórica. Os modelos lineares não têm essa limitação, | ||
| + | <WRAP center round box 80%> | ||
| + | __**Videoaula Modelo Linear I**__ | ||
| + | O vídeo é proveniente de outra disciplina, desconsidere qualquer referência a ela. | ||
| + | <WRAP center round tip 80%> | ||
| + | {{youtube> | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | No quadro abaixo estão listados alguns dos testes clássicos frequentistas. Estes testes foram criados para diferentes naturezas de variáveis respostas e preditoras. Você já refletiu sobre a natureza das variáveis do seu estudo? Esse é um passo importante na tomada de decisão da análise adequada, assim como seu acoplamento com a hipótese de trabalho é fundamental! | ||
| + | |||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | O modelo linear é uma unificação que incorpora os testes da tabela acima que tem a __** variável resposta contínua**__. Portanto, já não há mais necessidade dos nomes: // | ||
| + | Isso não livra o bom usuário de estatística de entender a natureza das variáveis que está utilizando. Isso continua sendo imprescindível para tomar boas decisões ao longo do processo de análise dados e interpretação dos resultados. | ||
| + | |||
| + | |||
| + | ===== Simulando dados ===== | ||
| + | | ||
| + | Vamos começar com um exemplo simples de regressão, mas de forma diferente da usual. Vamos inverter o procedimento para entender bem o que os modelos estatísticos nos dizem e como interpretar os resultados produzidos. Para isso, vamos inicialmente gerar dados fictícios a partir de um universo conhecido. Esses dados terão dois componentes: | ||
| + | |||
| + | |||
| + | $$ y = {\alpha} + {\beta} x$$ | ||
| + | |||
| + | O componente aleatório é expresso por uma variável probabilística Gaussiana da seguinte forma: | ||
| + | |||
| + | $$ \epsilon = N(0, \sigma) $$ | ||
| + | |||
| + | Portanto, nossos dados serão uma amostra de uma população com a seguinte estrutura: | ||
| + | |||
| + | $$ y = {\alpha} + {\beta} x + \epsilon$$ | ||
| + | |||
| + | |||
| + | Parece complicado, mas é simples gerar dados aleatórios com essa estrutura do R. Vamos definir primeiro quais são os parâmetros que estão na nossa população, | ||
| + | |||
| + | $$ y = 10.3 + 0.12 x + N(0, 5) $$ | ||
| + | |||
| + | |||
| + | Antes de gerar os dados aleatórios, | ||
| + | |||
| + | <code rsplus> | ||
| + | set.seed(1) | ||
| + | x1 <- round(seq(12, | ||
| + | y0 <- 10.3 + 0.12 * x1 | ||
| + | res <- rnorm(length(x1), | ||
| + | y1 <- y0 + res | ||
| + | xm <- mean(x1) | ||
| + | ym <- mean(y1) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Vamos olhar esses valores em um gráfico utilizando o procedimento que aprendemos no tutorial [[02_tutoriais: | ||
| + | |||
| + | <code rsplus> | ||
| + | par(mar = c(4, 4, 2, 2), cex.lab = 1.5, cex.axis = 1.5, las = 1, bty = " | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | cores <- c(rgb(1, 0, 0, 0.3), rgb(0, 0, 1, 0.3)) | ||
| + | points(x1, y0, pch = 16, cex = 0.8, col = cores[1] ) | ||
| + | points(x1, y1, pch = 19, col = cores[2]) | ||
| + | legend(" | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | ==== Estimando os parâmetros ==== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Os valores em '' | ||
| + | |||
| + | Com esses dados em mãos precisamos estimar os parâmetros que definem, se é que existe, a relação '' | ||
| + | |||
| + | Vamos ilustrar aqui como esses métodos funcionam de forma intuitiva, usando a solução numérica, também chamada de //força bruta//. Apesar de existir solução algébrica, esse método é muito útil em casos mais complexos e bastante intuitivo. Tudo começa com o ponto de fulcro, o centro de massa dos nossos dados, as medias de '' | ||
| + | Em seguida, podemos testar diferentes inclinações, | ||
| + | |||
| + | Um modelo possível é a inclinação '' | ||
| + | |||
| + | <code rsplus> | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | points(x1, y1, pch = 19, col = cores[2], cex = 1.5) | ||
| + | points(xm, ym, pch=19) | ||
| + | points(xm, ym, cex = 2.5) | ||
| + | text(xm, ym-2 , labels= " | ||
| + | abline(mean(y1), | ||
| + | segments(x0 = x1, y0 = y1, x1= x1, y1= mean(y1) , lty=2) | ||
| + | text(70, 40, paste(" | ||
| + | points(xm, ym, pch=19) | ||
| + | points(xm, ym, cex = 2.5) | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | |||
| + | Agora, precisamos encontrar entre as muitas possibilidades de inclinação, | ||
| + | Por sorte já sabemos fazer iterações e gráficos no R! Vamos utilizar o gráfico anterior como base e fazer muitos gráficos com diferentes inclinações e ao mesmo tempo calcular a soma dos desvios ao quadrado. Antes vamos calcular os valores para diferentes inclinações: | ||
| + | |||
| + | <code rsplus> | ||
| + | bsim <- seq(-0.05, 0.29, 0.005) | ||
| + | asim <- ym - bsim * xm | ||
| + | nsim <- length(bsim) | ||
| + | ML <- rep(NA, nsim) | ||
| + | MQ <- rep(NA, nsim) | ||
| + | for (i in 1:nsim) | ||
| + | { | ||
| + | spred <- asim[i] + bsim[i] * x1 | ||
| + | MQ[i] <- sum((spred - y1)^2) | ||
| + | ML[i] <- prod(dnorm(y1, | ||
| + | } | ||
| + | estima <- data.frame(alfa = asim, beta = bsim, ML = ML, MQ = MQ, logML = log10(ML)) | ||
| + | </ | ||
| + | |||
| + | Acima, criamos uma sequencia de valores para representar diferentes inclinações '' | ||
| + | |||
| + | |||
| + | Abaixo um gráfico animado. A única função que ainda não conhecemos é '' | ||
| + | |||
| + | <code rsplus> | ||
| + | graphics.off() | ||
| + | x11(width = 12, heigh = 6) | ||
| + | par(mfrow = c(1,2),mar= c(5, 5, 2, 2), las=1, cex.axis= 1.2, cex.lab=1.2, | ||
| + | for (i in 1: length(bsim)) | ||
| + | { | ||
| + | spred = asim[i] + bsim[i] * x1 | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | points(x1, y1, pch = 19, col = cores[2], cex = 1.75) | ||
| + | points(xm, ym, pch=19) | ||
| + | points(xm, ym, cex = 2.5) | ||
| + | abline(asim[i], | ||
| + | segments(x0 = x1, y0 = y1, x1= x1, y1= spred, lty=2) | ||
| + | points(xm, ym, pch=19) | ||
| + | points(xm, ym, cex = 2.5) | ||
| + | plot(NULL, NULL, type=" | ||
| + | rect(par()$usr[1], | ||
| + | points(bsim[1: | ||
| + | axis(1) | ||
| + | axis(2) | ||
| + | mtext(" | ||
| + | mtext(" | ||
| + | Sys.sleep(0.2) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round box 100%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | Com o resultado dessa simulação podemos buscar o valor de inclinação que melhor representa a relação: | ||
| + | |||
| + | <code rsplus> | ||
| + | (bEst <- bsim[which.min(estima$MQ)]) | ||
| + | |||
| + | </ | ||
| + | |||
| + | Como temos um ponto que conhecemos do nosso modelo, o fulcro, podemos calcular o intercepto a partir dele: | ||
| + | |||
| + | $$ym = aEst + bEst * xm$$ | ||
| + | |||
| + | $$aEst = ym - (bEst * xm)$$ | ||
| + | |||
| + | <code rsplus> | ||
| + | (aEst <- ym - (bEst * xm)) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Nossas estimativas parecem muito boas! | ||
| + | Quando construímos modelos, não precisamos fazer a simulação para fazer estimativas, | ||
| + | |||
| + | ===== Modelos Lineares ===== | ||
| + | |||
| + | Para definir o modelo linear na função '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | Onde '' | ||
| + | |||
| + | <code rsplus> | ||
| + | lmxy01 <- lm(y1 ~ x1) | ||
| + | class(lmxy01) | ||
| + | str(lmxy01) | ||
| + | </ | ||
| + | |||
| + | | ||
| + | O objeto de modelo é bastante complexo. Para acessar as informações utilizamos as funções extratoras que retiram do objeto as informações solicitadas, | ||
| + | |||
| + | |||
| + | ==== Coeficientes do Modelo ==== | ||
| + | |||
| + | Os coeficientes estimados pelo modelo podem ser obtidos pela função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | coef(lmxy01) | ||
| + | confint(lmxy01) | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Predito pelo Modelo ==== | ||
| + | |||
| + | O predito pelo modelo, ou sua esperança, é o valor que a reta do modelo prevê para cada observação em '' | ||
| + | |||
| + | <code rsplus> | ||
| + | (predxy01 <- coef(lmxy01)[1] + coef(lmxy01)[2] * x1) | ||
| + | predict(lmxy01) | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== Resíduos do Modelo ==== | ||
| + | |||
| + | Os resíduos do modelo são o quanto cada observação se afasta do predito pelo modelo. Ou seja, o observado em '' | ||
| + | |||
| + | < | ||
| + | (resxy01 <- y1 - predxy01) | ||
| + | residuals(lmxy01) | ||
| + | </ | ||
| + | |||
| + | ==== Resumo do Modelo ==== | ||
| + | |||
| + | O '' | ||
| + | |||
| + | <code rsplus> | ||
| + | summary(lmxy01) | ||
| + | </ | ||
| + | |||
| + | Abaixo a saída do '' | ||
| + | |||
| + | < | ||
| + | Call: | ||
| + | lm(formula = y1 ~ x1) | ||
| + | |||
| + | Residuals: | ||
| + | Min 1Q Median | ||
| + | -11.449 | ||
| + | |||
| + | Coefficients: | ||
| + | Estimate Std. Error t value Pr(> | ||
| + | (Intercept) 10.97202 | ||
| + | x1 | ||
| + | --- | ||
| + | Signif. codes: | ||
| + | |||
| + | Residual standard error: 5.28 on 13 degrees of freedom | ||
| + | Multiple R-squared: | ||
| + | F-statistic: | ||
| + | </ | ||
| + | |||
| + | |||
| + | Após a fórmula do modelo são apresentados os quartis associados aos resíduos e as estimativas dos coeficientes na coluna '' | ||
| + | |||
| + | <code rsplus> | ||
| + | quantile(resxy01) | ||
| + | coef(lmxy01) | ||
| + | </ | ||
| + | |||
| + | Para entender o que são os outros valores que aparecem na tabela '' | ||
| + | |||
| + | |||
| + | ===== Múltiplos Experimentos ===== | ||
| + | |||
| + | |||
| + | Uma das bases da teoria da estatística frequentista é que uma amostra e seus resultados são apenas uma realização dentre os possíveis resultados provenientes de uma população real, a qual não temos acesso. Esta abstração da realização de múltiplos experimentos nos ajuda a entender as estimativas dos modelos. Vamos verificar o que acontece com nossas estimativas ao realizar muitas vezes amostras similares provenientes da mesma população, | ||
| + | |||
| + | <code rsplus> | ||
| + | nSimula <- 1000 | ||
| + | aEst <- rep(NA, nSimula) | ||
| + | bEst <- rep(NA, nSimula) | ||
| + | desQuad <- rep(NA, nSimula) | ||
| + | </ | ||
| + | |||
| + | Vamos resgatar((esse vetores foram construídos logo no início do tutorial!)) a relação determinística do nossa população: | ||
| + | |||
| + | < | ||
| + | x1 <- round(seq(12, | ||
| + | y0 <- 10.3 + 0.12 * x1 | ||
| + | </ | ||
| + | |||
| + | Agora criamos a iteraçao com '' | ||
| + | |||
| + | *1. Cria valores aleatórios de uma normal com média zero e desvio padrão igual a 5; | ||
| + | *2. Soma esses valores ao valor '' | ||
| + | *3. Cria o modelo com o '' | ||
| + | *4. Guarda os coeficientes do modelo em '' | ||
| + | *5. Armazena as estimativas dos coeficientes nos respectivos vetores, '' | ||
| + | *6. Calcula e armazena a soma dos desvios quadráticos do modelo em '' | ||
| + | |||
| + | <code rsplus> | ||
| + | for(i in 1:nSimula) | ||
| + | { | ||
| + | rSim <- rnorm(length(x1), | ||
| + | ySim <- y0 + rSim | ||
| + | lmSim <- lm(ySim ~ x1) | ||
| + | cSim <- coef(lmSim) | ||
| + | aEst[i] <- cSim[1] | ||
| + | bEst[i] <- cSim[2] | ||
| + | desQuad[i] <- sum(residuals(lmSim)^2) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | Vamos olhar agora as médias e a distribuição dos valores estimados em um histograma: | ||
| + | |||
| + | <code rsplus> | ||
| + | (med_aEst <- mean(aEst)) | ||
| + | (med_bEst <- mean(bEst)) | ||
| + | ## | ||
| + | hist(aEst, main = " | ||
| + | abline(v = med_aEst, col = " | ||
| + | mtext(" | ||
| + | ## | ||
| + | hist(bEst, main = " | ||
| + | abline(v = med_bEst, col = " | ||
| + | mtext(" | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round box 100%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | |||
| + | Apesar de nossa primeira estimativa dos parâmetros ter sido muito boa, poderíamos ter feito uma amostra com valores mais diferentes. Não é desprezível a chance de nossa amostra gerar valores de intercepto menores que '' | ||
| + | |||
| + | Vamos calcular o desvio padrão dos múltiplos experimentos: | ||
| + | |||
| + | <code rsplus> | ||
| + | (med_aEst <- mean(aEst)) | ||
| + | (med_bEst <- mean(bEst)) | ||
| + | </ | ||
| + | |||
| + | Quando só temos um experimento, | ||
| + | |||
| + | <WRAP center round box 60%> | ||
| + | |||
| + | $$\beta_{se} = \sqrt{\frac{\frac{1}{n-2}\sum_{i=1}^{n}\hat{\epsilon}_{i}^{2}}{\sum_{n=1}^{n}(x_i - \bar{x})}} $$ | ||
| + | |||
| + | </ | ||
| + | |||
| + | O valor calculado a partir dessa formula é apresentado no tabela do '' | ||
| + | |||
| + | Agora que já sabemos o que é o <wrap em>erro padrão</ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Este último valor está relacionada à probabilidade de incorremos em erro ao afirmar que a estimativa do coeficiente em questão é diferente de zero. | ||
| + | |||
| + | ===== Erro Padrão do Modelo ===== | ||
| + | |||
| + | O próximo valor temos no '' | ||
| + | |||
| + | |||
| + | Nesse ponto já deve estar capacitado para fazer a leitura de grande parte do '' | ||
| + | |||
| + | <code rsplus> | ||
| + | summary(lmxy01) | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | < | ||
| + | Call: | ||
| + | lm(formula = y1 ~ x1) | ||
| + | |||
| + | Residuals: | ||
| + | Min 1Q Median | ||
| + | -11.449 | ||
| + | |||
| + | Coefficients: | ||
| + | Estimate Std. Error t value Pr(> | ||
| + | (Intercept) 10.97202 | ||
| + | x1 | ||
| + | --- | ||
| + | Signif. codes: | ||
| + | |||
| + | Residual standard error: 5.28 on 13 degrees of freedom | ||
| + | Multiple R-squared: | ||
| + | F-statistic: | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== Tabela de Anova de uma Regressão ===== | ||
| + | |||
| + | <WRAP center round box 100%> | ||
| + | <WRAP center round tip 80%> | ||
| + | Video na disciplina de Princípios de Planejamento e Análise de Dados. Desconsidere qualquer referência à disciplina. O tema tratado é a partição de variação dos dados. | ||
| + | {{youtube> | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Os modelos, independente da natureza da variável preditora, podem ser analisados através do método de partição de variância que aprendemos no roteiro de [[02_tutoriais: | ||
| + | |||
| + | Veja o que acontece quando a função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | anova(lmxy01) | ||
| + | </ | ||
| + | |||
| + | O resultado é uma tabela de anova com a partição da variância dos dados do modelo: | ||
| + | |||
| + | < | ||
| + | Analysis of Variance Table | ||
| + | |||
| + | Response: y1 | ||
| + | Df Sum Sq Mean Sq F value Pr(> | ||
| + | x1 1 868.51 | ||
| + | Residuals 13 362.37 | ||
| + | --- | ||
| + | Signif. codes: | ||
| + | </ | ||
| + | |||
| + | Nessa tabela temos todos os componentes da partição da variabilidade dos dados, da maneira clássica apresentada no roteiro de [[02_tutoriais: | ||
| + | Vamos representar os gráficos associados a representação dessas duas variações nos dados: | ||
| + | |||
| + | <code rsplus> | ||
| + | cores <- c(rgb(1, 0, 0, 0.3), rgb(0, 0, 1, 0.3)) | ||
| + | x11(width = 12, height = 14) | ||
| + | par(mar = c(4, 5, 2, 2), las = 1, cex = 1.5, cex.lab = 1.3, cex.axis = 1.3) | ||
| + | layout(matrix(c(1, | ||
| + | layout.show(3) | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | segments(x0 = x1, y0 = mean(y1), y1 = y1, col = " | ||
| + | points(x1, y1, pch = 19, col = cores[2], cex = 1.5) | ||
| + | abline(h = mean(y1), lty = 2, lwd = 3) | ||
| + | ## | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | segments(x0 = x1, y0 = y1, y1 = predict(lmxy01), | ||
| + | points(x1, y1, pch = 19, col = cores[2], cex = 1.5) | ||
| + | abline( lmxy01, lty = 1, lwd = 3, col = cores[1]) | ||
| + | ## | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | segments(x0 = x1, y0 = y1, y1 = predict(lmxy01), | ||
| + | points(x1, y1, pch = 19, col = cores[2], cex = 2.5) | ||
| + | abline( lmxy01, lty = 1, lwd = 5, col = cores[1]) | ||
| + | abline(h = mean(y1), lty = 2, lwd = 3)#, col = cores[1]) | ||
| + | predxy <- predict(lmxy01) | ||
| + | devExp < | ||
| + | devExp[c(1, 3, 6, 8, 9, 11, 12, 15)] <- predxy[c(1, 3, 6, 8, 9, 11, 12, 15)] | ||
| + | devExp[c(2, 4, 5, 7, 10, 13, 14)] <- y1[c(2, 4, 5, 7, 10, 13, 14)] | ||
| + | segments(x0 = x1, y0 = mean(y1), y1 = devExp, col = rgb(0, 1, 0, 0.7), lty = 2, lwd = 3.5) | ||
| + | legend(x = 170, y = 20, legend = c(" | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | ==== Coeficiente de Determinação (R²) ==== | ||
| + | |||
| + | Assim como na **análise de variância** podemos utilizar a partição da variação dos dados para calcular a proporção da variação explicada. Vamos calcular esse valor: | ||
| + | |||
| + | <code rsplus> | ||
| + | dqTotal <- sum((y1 - mean(y1))^2) | ||
| + | dqRes <- sum(residuals(lmxy01)^2) | ||
| + | R2 <- (dqTotal - dqRes)/ | ||
| + | R2 | ||
| + | </ | ||
| + | |||
| + | ==== R² Ajustado ==== | ||
| + | |||
| + | O R² ajustado está relacionado a uma maior precisão na estimativa do R², que depende do tamanho amostral. Existem vários tipos de ajustes, no caso do '' | ||
| + | |||
| + | $$R^{2}_{adj} = 1 - (1- R^2) \frac{n - 1}{n - p - 1}$$ | ||
| + | |||
| + | <code rsplus> | ||
| + | R2adj <- 1 - (1- R2) * ((length(y1) - 1)/ | ||
| + | R2adj | ||
| + | </ | ||
| + | |||
| + | Com os R², R² ajustado e o teste da partição da variação da tabela da função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | summary(lmxy01) | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Call: | ||
| + | lm(formula = y1 ~ x1) | ||
| + | |||
| + | Residuals: | ||
| + | Min 1Q Median | ||
| + | -11.449 | ||
| + | |||
| + | Coefficients: | ||
| + | Estimate Std. Error t value Pr(> | ||
| + | (Intercept) 10.97202 | ||
| + | x1 | ||
| + | --- | ||
| + | Signif. codes: | ||
| + | |||
| + | Residual standard error: 5.28 on 13 degrees of freedom | ||
| + | Multiple R-squared: | ||
| + | F-statistic: | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Comparando Modelos ===== | ||
| + | |||
| + | A partição da variância é uma ferramenta poderosa para compararmos modelos aninhados. Ou seja, no caso do modelo mais simples estar contido no modelo mais complexo. De fato, a '' | ||
| + | utilizamos a partição da variação acima. Vamos montar dois modelos: um com e um sem a variável preditora '' | ||
| + | |||
| + | <code rsplus> | ||
| + | lmxy01 <- lm(y1 ~ x1) | ||
| + | lmNull <- lm(y1 ~ 1) | ||
| + | </ | ||
| + | |||
| + | Acima, montamos novamente o modelo '' | ||
| + | |||
| + | No caso estamos comparando as seguintes representações gráficas: | ||
| + | |||
| + | <code rsplus> | ||
| + | cores <- c(rgb(1, 0, 0, 0.3), rgb(0, 0, 1, 0.3)) | ||
| + | x11(width = 12, height = 6, xpos = 1100) | ||
| + | par(mfrow = c(1, 2), mar = c(4, 5, 2, 2), las = 1, cex = 1.5, cex.lab = 1.3, cex.axis = 1) | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | segments(x0 = x1, y0 = mean(y1), y1 = y1, col = " | ||
| + | points(x1, y1, pch = 19, col = cores[2], cex = 1.5) | ||
| + | abline(h = mean(y1), lty = 1, lwd = 3, col = cores[1]) | ||
| + | text(100, 42, " | ||
| + | ## | ||
| + | plot(x1, y1, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | segments(x0 = x1, y0 = y1, y1 = predict(lmxy01), | ||
| + | points(x1, y1, pch = 19, col = cores[2], cex = 1.5) | ||
| + | abline( lmxy01, lty = 1, lwd = 3, col = cores[1]) | ||
| + | text(100, 42, " | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | ==== Comparando Modelos com Partição da Variação ==== | ||
| + | |||
| + | Para fazer a comparação com esse método é necessário que os modelos sejam <wrap em> | ||
| + | Veja como funciona com os dois modelos que criamos: | ||
| + | |||
| + | <code rsplus> | ||
| + | anova(lmNull, | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Analysis of Variance Table | ||
| + | |||
| + | Model 1: y1 ~ 1 | ||
| + | Model 2: y1 ~ x1 | ||
| + | Res.Df | ||
| + | 1 14 1230.87 | ||
| + | 2 | ||
| + | --- | ||
| + | Signif. codes: | ||
| + | </ | ||
| + | |||
| + | |||
| + | Como no nosso caso, o modelo mais simples é o modelo onde a variação de '' | ||
| + | |||
| + | Nesse ponto, é desejável que tenha entendido que a partição da variância de um modelo é correspondente a compará-lo com o modelo nulo, ou seja, quanta variância o modelo é capaz de explicar em relação ao modelo nulo. Esse modelo nulo representa o modelo mais simples representado pelos dados, com a variação total no resíduo, e é representado por apenas um parâmetro, a média da variável resposta. | ||
| + | |||
| + | |||
| + | ===== As Lagartas ===== | ||
| + | |||
| + | <WRAP center round box 60%> | ||
| + | **__Dieta de Lagarta__** | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | O nosso próximo exemplo usa os {{ : | ||
| + | |||
| + | </ | ||
| + | |||
| + | Neste caso temos dois modelos plausíveis, | ||
| + | |||
| + | <code rsplus> | ||
| + | lag <- read.table(" | ||
| + | str(lag) | ||
| + | summary(lag) | ||
| + | lmlag00 <- lm(growth ~ 1, data = lag) | ||
| + | summary(lmlag00) | ||
| + | lmlag01 <- lm(growth ~ tannin, data = lag) | ||
| + | summary(lmlag01) | ||
| + | </ | ||
| + | |||
| + | Sempre é bom visualizar os modelos em um gráfico, vamos fazê-los: | ||
| + | |||
| + | <code rsplus> | ||
| + | par(mfrow = c(1, 2), mar = c(4, 4, 2, 1), las = 1, cex = 1.5, cex.lab = 1.3, cex.axis = 1) | ||
| + | plot(NULL, NULL, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | segments(x0 = lag$tannin, y0 = lag$growth, y1 = predict(lmlag00), | ||
| + | points(lag$tannin, | ||
| + | abline(lmlag00, | ||
| + | ## | ||
| + | plot(NULL, NULL, type = " | ||
| + | rect(par()$usr[1], | ||
| + | axis(1) | ||
| + | mtext(text = " | ||
| + | axis(2) | ||
| + | mtext(text = " | ||
| + | segments(x0 = lag$tannin, y0 = lag$growth, y1 = predict(lmlag01), | ||
| + | points(lag$tannin, | ||
| + | abline(lmlag01, | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Comparando Modelos de Dieta de Lagartas ==== | ||
| + | |||
| + | Com a anova podemos comparar os dois modelos para ver qual o mais plausível: | ||
| + | |||
| + | <code rsplus> | ||
| + | anova(lmlag00, | ||
| + | </ | ||
| + | |||
| + | O teste '' | ||
| + | |||
| + | Nesse caso, podemos partir para a interpretação do modelo selecionado: | ||
| + | |||
| + | <code rsplus> | ||
| + | summary(lmlag01) | ||
| + | </ | ||
| + | |||
| + | E novamente, percebam que a partição do modelo isoladamente é a mesma partição de variância da comparação com o modelo nulo, ou aquele que é representado apenas pela média da variável resposta: | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | anova(lmlag01) | ||
| + | </ | ||
| + | |||
| + | ==== Diagnóstico do Modelo ==== | ||
| + | |||
| + | Ao encontrar um modelo adequado para representar os dados, antes de interpretá-lo, | ||
| + | |||
| + | <code rsplus> | ||
| + | par(mfrow = c(2, 2)) | ||
| + | plot(lmlag01) | ||
| + | </ | ||
| + | |||
| + | Não está no escopo deste curso ensinar esses gráficos diagnósticos. Para isso veja o tutorial de [[http:// | ||
| + | ===== Variável Indicadora ===== | ||
| + | |||
| + | Nos modelos lineares as variáveis contínuas e categóricas são colocadas como preditoras, indistintamente. Entretanto, no modelo elas são tratadas diferentemente. As variáveis categóricas são transformadas em <wrap em> | ||
| + | |||
| + | <code rsplus> | ||
| + | are <- c(6, | ||
| + | arg <- c(17, 15, 3, 11, 14, 12, 12, 8, 10, 13) | ||
| + | hum <- c(13, 16, 9, 12, 15, 16, 17, 13, 18, 14) | ||
| + | solo <- rep(c(" | ||
| + | cultivar <- data.frame(producao = c(are, arg, hum), solo = solo) | ||
| + | str(cultivar) | ||
| + | </ | ||
| + | |||
| + | Vamos fazer uma inspeção nos dados na forma de um '' | ||
| + | |||
| + | < | ||
| + | cols <- c(rgb(0, 0, 0, 0.1), rgb(1, 0,0, 0.3), rgb(0,0,1, 0.3)) | ||
| + | par(mar = c(4,4,2,1), las = 1, cex = 1.5) | ||
| + | boxplot(producao ~ solo, data = cultivar, col = cols, xlab = "Tipo de solos", | ||
| + | points(x = jitter(rep(1: | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 70%> | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | Podemos construir o modelo com esses dados da maneira convencional no '' | ||
| + | |||
| + | <code rsplus> | ||
| + | lmcult <- lm(producao ~ solo, data = cultivar) | ||
| + | summary(lmcult) | ||
| + | </ | ||
| + | |||
| + | O primeiro passo é reconhecer no resumo do modelo os mesmos resultados do teste de **análise de variáncia** que fizemos no tutorial anterior. Apenas com um pouco mais de informação associado aos coeficientes do modelo e as imprecisões nas suas estimativas. | ||
| + | |||
| + | < | ||
| + | Call: | ||
| + | lm(formula = producao ~ solo, data = cultivar) | ||
| + | |||
| + | Residuals: | ||
| + | | ||
| + | -8.5 | ||
| + | |||
| + | Coefficients: | ||
| + | | ||
| + | (Intercept) | ||
| + | soloargiloso | ||
| + | solohumico | ||
| + | --- | ||
| + | Signif. codes: | ||
| + | |||
| + | Residual standard error: 3.418 on 27 degrees of freedom | ||
| + | Multiple R-squared: | ||
| + | F-statistic: | ||
| + | </ | ||
| + | |||
| + | Outro ponto interessante no resumo é que, apesar de termos apenas uma variável preditora, tipo de '' | ||
| + | |||
| + | Qual o significado desses coeficientes? | ||
| + | |||
| + | <code rsplus> | ||
| + | mSolos <- tapply(cultivar$producao, | ||
| + | mSolosVetor <- rep(mSolos, each = 10) | ||
| + | colvector <- rep(cols, each = 10) | ||
| + | par(mar = c(4,4,2,1), las = 1, cex = 1.5) | ||
| + | plot(x = 1:30, y = cultivar$producao , ylim = c(0,20), xlim = c(0, 30), pch=(rep(c(15, | ||
| + | segments(x0 = 1:30, y0 = cultivar$producao, | ||
| + | segments(x0 = c(1,11, 21), y0 = mSolos, x1 = c(10, 20, 30), col = cols, lwd =1.5) | ||
| + | legend(" | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | |||
| + | Nessa representação, | ||
| + | |||
| + | <code rsplus> | ||
| + | tapply(cultivar$producao, | ||
| + | coef(lmcult) | ||
| + | </ | ||
| + | |||
| + | Os coeficientes são a diferenças entres as médias do nível em relação ao '' | ||
| + | |||
| + | Veja as soma dos coeficientes com o intercepto: | ||
| + | |||
| + | <code rsplus> | ||
| + | tapply(cultivar$producao, | ||
| + | coef(lmcult) | ||
| + | coef(lmcult)[1] + coef(lmcult)[2: | ||
| + | </ | ||
| + | |||
| + | Vamos demonstrar o que acontece dentro do modelo fazendo a transformação de variável indicadora, antes de criar o modelo. A partir da variável solo criamos duas outras, '' | ||
| + | |||
| + | <code rsplus> | ||
| + | cultivar$arg <- rep(0, 30) | ||
| + | cultivar$hum <- rep(0, 30) | ||
| + | cultivar$arg[cultivar$solo == " | ||
| + | cultivar$arg | ||
| + | cultivar$hum[cultivar$solo == " | ||
| + | cultivar$hum | ||
| + | head(cultivar) | ||
| + | cultivar[11: | ||
| + | tail(cultivar) | ||
| + | </ | ||
| + | |||
| + | Agora, vamos construir nosso modelo com as variáveis indicadoras: | ||
| + | |||
| + | <code rsplus> | ||
| + | lmcultInd <- lm(producao ~ arg + hum, data = cultivar) | ||
| + | summary(lmcultInd) | ||
| + | </ | ||
| + | |||
| + | Reconheça o resultado idêntico dos modelos, | ||
| + | |||
| + | <code rsplus> | ||
| + | anova(lmcultInd, | ||
| + | </ | ||
| + | |||
| + | <WRAP center round box 90%> | ||
| + | **__O que devo ter entendido até aqui:__** | ||
| + | <WRAP center round tip 100%> | ||
| + | |||
| + | * 1. Todos os valores apresentados no '' | ||
| + | * 2. A partição da variação no '' | ||
| + | * 3. O que a '' | ||
| + | * 4. Como as variáveis categóricas são tratadas nos modelos no '' | ||
| + | </ | ||
| + | |||
| + | São muitos conceitos não triviais. Em um primeiro momento, busque alguma compreensão, | ||
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP center round box 100%> | ||
| + | Aula síncrona da disciplina no google meet, gravada em 01 de outubro de 2020. Nela abordo a construção e interpretação de modelos lineares simples no ambiente de programação R, focando no resumo ('' | ||
| + | http:// | ||
| + | <WRAP center round tip 80%> | ||
| + | {{youtube> | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | <WRAP center round box 50%> | ||
| + | Siga para: | ||
| + | * Capítulo da apostila [[03_apostila: | ||
| + | * Exercícios [[01_curso_atual: | ||
| + | </ | ||