banco <- sm::nileEstatí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
Descdo pacoteDescToolspara visualizar a estatística Descritiva do Volume de Água no Rio Nilo, no período compreendido do estudo.
DescTools::Desc(banco$Volume, digits = 3, main = "Volume de Água no Rio Nilo")------------------------------------------------------------------------------
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
ggplot2::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")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
fit <- sm::sm.regression(banco$Ano, banco$Volume, xlab = "Ano", ylab = "Volume", main = "Kernel Regression")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.
fit2 <- mgcv::gam(Volume~s(Ano), data = banco)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
gamdo pacotemgcv
fit3 <- mgcv::gam(Volume~Ano, data = banco)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
fit4 <- lm(Volume~Ano, data = banco)
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))
mgcv::gam.check(fit2)
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