Regressão Polinomial. Este procedimento ajusta até 10 diferentes modelos de regressão para duas variáveis, sendo uma dependente e uma independente. A variável independente é expandida num polinômio até o décimo grau com geração de novas variáveis.Vou dar dois exemplos de como utilizar a Regressão Polimonial no R
library(readr)
data <- read_delim("Bases/poly.csv", ";",
escape_double = FALSE, col_types = cols(Area = col_number(),
Price = col_number()), trim_ws = TRUE)
x = data $ Area
y = data $ Price
Para comparar os resultados da regressão linear e polinomial, primeiramente ajustamos a regressão linear
model1 = lm (y ~ x)
model1 $ fit
## 1 2 3 4 5 6 7 8
## 169.0995 178.9081 188.7167 218.1424 223.0467 266.6949 291.7068 296.6111
## 9 10
## 316.2282 335.8454
model1 $ coeff
## (Intercept) x
## 120.05663769 0.09808581
Criando um dataframe onde a nova variável é x e x square.
new_x = cbind (x, x ^ 2)
new_x
## x
## [1,] 500 250000
## [2,] 600 360000
## [3,] 700 490000
## [4,] 1000 1000000
## [5,] 1050 1102500
## [6,] 1495 2235025
## [7,] 1750 3062500
## [8,] 1800 3240000
## [9,] 2000 4000000
## [10,] 2200 4840000
model2 = lm (y ~ new_x)
model2 $ fit
## 1 2 3 4 5 6 7 8
## 122.5388 153.9997 182.6550 251.7872 260.8543 310.6514 314.1467 312.6928
## 9 10
## 299.8631 275.8110
model2 $ coeff
## (Intercept) new_xx new_x
## -7.684980e+01 4.689175e-01 -1.402805e-04
Usando o pacote ggplot2, criei um gráfico para comparar as curvas por regressão linear e polinomial.
library (ggplot2)
ggplot (dados = data) + geom_point(aes(x = data $ Area, y = data $ Price),size = 3)+
(aes (x = data $ Area, y = data$Price)) +
geom_line (aes (x = data $ Area, y = model1 $ fit), color = "red") +
geom_line (aes (x = data $ Area, y = model2 $ fit), color = "blue")
Criei uma base de dados aleatória, para o novo exemplo
tratamentos=rep(c(0,2,4,8,16,32,64,128,256),e=4)
resposta=c(0,1,2,4,
8,7,9,10,
15,17,18,20,
25,26,24,28,
36,39,38,40,
60,68,65,70,
100,110,104,107,
150,155,156,159,
120,130,126,124)
Dose=c(0,2,4,8,16,32,64,128,256)
media=tapply(resposta,tratamentos, mean)
desvio=tapply(resposta,tratamentos,sd)
Comando basico para graficos de regressão
plot(media~Dose)
Simples edição do gráfico de regressão
plot(media~Dose,
las=1,
ylab="Resposta",
xlab="Dose")
Colocando o desvio padrão em cada dado
reg=plot(media~Dose,
las=1,
ylab="Resposta",
xlab="Dose")
arrows(Dose,media+desvio,Dose,media-desvio,length = 0.02,angle=90,code=3)
modelo=lm(media~Dose+I(Dose^2))
summary(modelo)
##
## Call:
## lm(formula = media ~ Dose + I(Dose^2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.0101 -2.3298 0.5233 2.3045 3.4953
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.7601301 1.7653406 4.396 0.00459 **
## Dose 1.8811023 0.0566083 33.230 4.94e-08 ***
## I(Dose^2) -0.0055671 0.0002241 -24.847 2.80e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.709 on 6 degrees of freedom
## Multiple R-squared: 0.9967, Adjusted R-squared: 0.9956
## F-statistic: 899.4 on 2 and 6 DF, p-value: 3.674e-08
plot(media~Dose,
las=1,ylim=c(0,200),col="black",pch=16,
ylab="Resposta",
xlab="Dose")
Para encontrar o ponto de máximo ou mínimo em uma equaçãoo quadrática, fazer derivada
Y=0
(x=-modelo$coefficients[2]/(2*modelo$coefficients[3]))
## Dose
## 168.9481
Fórmula de Bhaskara para encontrar o vértice
(y=modelo$coefficients[1]+modelo$coefficients[2]*x+modelo$coefficients[3]*x^2)
## (Intercept)
## 166.6644
plot(media~Dose,
las=1,ylim=c(0,200),col="black",pch=16,
ylab="Resposta",
xlab="Dose")
arrows(Dose,media+desvio,Dose,media-desvio,length = 0.02,angle=90,code=3)
curve(modelo$coefficients[1]+modelo$coefficients[2]*x+modelo$coefficients[3]*x^2, add=T,col="blue")
abline(h=y,col="red",lty=2)
abline(v=x,col="red",lty=2)
points(x,y,pch=8,col="black")