Estatística Não-Paramétrica

Autor

Paulo Manoel da Silva Junior

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
banco <- sm::nile
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 pacote DescTools para 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 gam do pacote mgcv
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