<- sm::nile banco
Estatística Não-Paramétrica
Regressão Não-paramétrica
Uma aplicação da regressão não-paramétrica para a disciplina de Estatística Não-paramétrica.
O banco de dados que vamos trabalhar é sobre o volume de água anual do Rio Nilo o banco é nilo
e encontra-se no pacote sm
.
Um pouco da descrição do banco de dados:
Esses dados registram dados históricos sobre o nível da água do rio Nilo.
As variáveis são:
Volume:
Volume anual do rio Nilo (descarga em Aswan, \(10^8\) \(m^3\)).
Ano:
1871-1970
- Carregando o banco de dados
library(dplyr)
glimpse(banco)
Rows: 100
Columns: 2
$ Volume <int> 1120, 1160, 963, 1210, 1160, 1160, 813, 1230, 1370, 1140, 995, …
$ Year <int> 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 188…
names(banco) <- c("Volume", "Ano")
- Visualizando algumas linhas do banco de dados
%>%
banco slice_head(n=10) %>%
::gt() gt
Volume | Ano |
---|---|
1120 | 1871 |
1160 | 1872 |
963 | 1873 |
1210 | 1874 |
1160 | 1875 |
1160 | 1876 |
813 | 1877 |
1230 | 1878 |
1370 | 1879 |
1140 | 1880 |
Estatística Descritiva
- De maneira mais geral, utilizando a função
Desc
do pacoteDescTools
para visualizar a estatística Descritiva do Volume de Água no Rio Nilo, no período compreendido do estudo.
::Desc(banco$Volume, digits = 3, main = "Volume de Água no Rio Nilo") DescTools
------------------------------------------------------------------------------
Volume de Água no Rio Nilo
length n NAs unique 0s mean meanCI'
100 100 0 85 0 919.350 885.772
100.0% 0.0% 0.0% 952.928
.05 .10 .25 median .75 .90 .95
697.800 725.200 798.500 893.500 1'032.500 1'160.000 1'210.500
range sd vcoef mad IQR skew kurt
914.000 169.228 0.184 179.395 234.000 0.318 -0.359
lowest : 456, 649, 676, 692, 694
highest: 1'220, 1'230, 1'250, 1'260, 1'370
' 95%-CI (classic)
Visualizando o gráfico de dispersão do ano e volume
::ggplot(banco, ggplot2::aes(x = Ano, y = Volume)) +
ggplot2::geom_point()+
ggplot2::xlab("Ano") + ggplot2::ylab("Volume")+
ggplot2::labs(title = "Gráfico de dispersão entre o ano e o volume de água no Rio Nilo") ggplot2
Conforme observado na análise gráfica, os dados podem se ajustar muito bem com a aplicação da regressão não-paramétrica
Aplicação da Regressão Não-Paramétrica
<- sm::sm.regression(banco$Ano, banco$Volume, xlab = "Ano", ylab = "Volume", main = "Kernel Regression") fit
summary(fit)
Length Class Mode
eval.points 50 -none- numeric
estimate 50 -none- numeric
model.y 50 -none- numeric
se 50 -none- numeric
sigma 1 -none- numeric
h 1 -none- numeric
hweights 100 -none- numeric
weights 100 -none- numeric
data 4 -none- list
call 6 -none- call
plot(banco$Ano, banco$Volume, cex = .5, main = "Kernel Regression", xlab = "Ano", ylab = "Volume"); sm::sm.regression(banco$Ano, banco$Volume, add = T)
plot(banco$Ano, banco$Volume, main = "Smoothing Splines", cex = .5, xlab = "Ano", ylab = "Volume"); lines(smooth.spline(banco$Ano, banco$Volume))
Comentário:
Podemos observar que a utilização da suavização, trouxe um ajuste mais sensível a mudança nos dados, enquanto o kernel ficou mais inflexível a alterações nos dados.
Propondo modelos
Modelo não-paramétrico
Vamos estar propondo um modelo não-paramétrico, ajustando através da função gam
do pacote mgcv
, utilizando o parâmetro de suavização s
.
<- mgcv::gam(Volume~s(Ano), data = banco) fit2
Observando o modelo ajustado
summary(fit2)
Family: gaussian
Link function: identity
Formula:
Volume ~ s(Ano)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 919.35 13.34 68.91 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(Ano) 7.391 8.368 7.613 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
R-sq.(adj) = 0.378 Deviance explained = 42.5%
GCV = 19430 Scale est. = 17800 n = 100
Resposta:
Obtivemos um \(R^2\) ajustado de 0.3785, um valor extremamente baixo.
Modelo Semi-paramétrico
- Utilizando ainda a função
gam
do pacotemgcv
<- mgcv::gam(Volume~Ano, data = banco) fit3
summary(fit3)
Family: gaussian
Link function: identity
Formula:
Volume ~ Ano
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6132.1736 1001.7578 6.121 1.92e-08 ***
Ano -2.7143 0.5216 -5.204 1.07e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
R-sq.(adj) = 0.209 Deviance explained = 21.7%
GCV = 23129 Scale est. = 22666 n = 100
Resposta:
Podemos observar que o modelo não-paramétrico proposto acima é melhor do que esse, o \(R^2\) ajustado de 0.2085, um valor extremamente baixo.
Modelo de Regressão Linear
<- lm(Volume~Ano, data = banco)
fit4 summary(fit4)
Call:
lm(formula = Volume ~ Ano, data = banco)
Residuals:
Min 1Q Median 3Q Max
-483.71 -98.17 -23.21 111.40 368.72
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6132.1736 1001.7578 6.121 1.92e-08 ***
Ano -2.7143 0.5216 -5.204 1.07e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 150.6 on 98 degrees of freedom
Multiple R-squared: 0.2165, Adjusted R-squared: 0.2085
F-statistic: 27.08 on 1 and 98 DF, p-value: 1.072e-06
- Conclusão
Conforme os resultados obtidos, o modelo melhor ajustado aos meus dados, foi o modelo não-paramétrico com a suavização splines, sendo assim passaremos para uma verificação residual.
plot(fit2)
Através da função gam.check do pacote mgcv
par(mfrow=c(2,2))
::gam.check(fit2) mgcv
Method: GCV Optimizer: magic
Smoothing parameter selection converged after 7 iterations.
The RMS GCV score gradient at convergence was 0.1009212 .
The Hessian was positive definite.
Model rank = 10 / 10
Basis dimension (k) checking results. Low p-value (k-index<1) may
indicate that k is too low, especially if edf is close to k'.
k' edf k-index p-value
s(Ano) 9.00 7.39 0.85 0.03 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1