Um modelo gamma bayesiano

1 Introdução

A base proposta, Advertising, apresenta variáveis referentes a vendas associadas a veiculações de marteking. Tem como característica variáveis contínuas estritamente positivas. É de interesse avaliar se é possível ajustar um modelo bayesiano gamma através da covariável jornal. Por fim, comparar os resultados com uma árvore de decisão.

2 Modelo proposto

O modelo ajustado será um Modelo Linear Generalizado através da abordagem bayesiana, com a seguinte equação \(Y_i = \beta_0+\beta_1x_i+\beta_2x_i+\beta_3x_i + e_i\) ; \(e_i \sim N(0,\sigma^2)\)

3 Verossimilhança

Posto que a distribuiçãoo da variável resposta não pode ser assumida como normal, o conceito de subjetividade da filosofia Bayesiana nos permite atribuir uma distribuição para verossimilhan?a \(Y|\phi, \beta_0,\beta_1,\beta_2, \sigma^2\), onde todos os parâmetros mencionados são desconhecidos.

Logo, será assumida para a mesma uma distribuiçao Gamma reparametrizada, com parâmetro de escala \(\phi\) e parâmetro de dispersão \(\cfrac{\phi}{\mu}\)

De modo que \(\mu = e^{\beta_0+\beta_1x_i+\beta_2x_i+\beta_3x_i}\), isto é, o preditor linear de uma regressão linear gama usual supondo a inclusão na família exponencial para garantia das propriedades de convergência.

4 Prioris hierárquicas

Em inferência bayesiana, quantidades desconhecidas são atribuídas com distribuição em probabilidade, chamadas de priori.

Para os casos estudados:

\(\phi \sim Gamma(1;0,1)\)

\(\beta_0 \sim Gamma(1;0,1)\)

\(\beta_1 \sim Gamma(1;0,1)\)

\(\beta_2 \sim Gamma(1;0,1)\)

\(\beta_3 \sim Gamma(1;0,1)\)

\(\sigma^2 \sim Gamma(1;0,1)\)

Atribui-se os seguintes parâmetros de forma a obter-se média 10 e variãncia 100, garantindo o que é chamado de priori não informativa, utilizada quando não há informação sob a base trabalhada, o que é o caso.

5 Aproximação de Laplace

Segue do Teorema de Bayes que

\(\pi(\theta|x) = \cfrac{\pi(x|\theta)\pi(\theta)}{\pi(x)}\)

\(\propto\)

\(\pi(x|\theta)\pi(\theta)\)

Onde

\(\pi(\theta|x)\) é um vetor paramétrico de distribuição a posteriori, desconhecida

\(\pi(x|\theta)\) é a verossimilhançaa dos dados, observado

\(\pi(x)\) é um vetor paramétrico de distribuições à priori

Em geral, não é possível a obtenção direta da distribuição a posteriori, que é o grande interesse. Para estas situações, a metodologia de Aproximação de Laplace oferece uma convergência garantida via ajuste uma normal multivariada que assemelha-se a posteriori estudada, de tal forma que:

\(\pi(\theta_p|x) \sim N_p(\theta^*,\sum)\)

Onde a média desta normal multivariada é obtida através da moda de cada parâmetro e a matriz de variância e covariância é estimada a partir da função escore.

6 Advertising

rm(list=ls())
base <- read.csv("C:\\Users\\raphael.fernandez\\Downloads\\Advertising.csv")
base$X = NULL
y=base$sales
x=base$newspaper

7 Ajuste do modelo

set.seed(2019)
model <- function(p,y,x) {
    log_lik <- sum(dgamma(y,p["beta0"]+p["beta1"]*x,sqrt(p["sigma2"]), log = T))
    log_post <- log_lik + dgamma(p["beta0"], 1, 0.1, log = T) + dgamma(p["beta1"], 1, 0.1, log = T)       + dgamma(p["sigma2"],1,0.01, log = T) 
    log_post
}

#Valores iniciais
inits <- c(beta0 = 1, beta1 = 1, sigma2 = 1)

#Ajuste baseado na otimização 
#control = list(fnscale = -1) para maximizar ao invés de minimizar
#hessian = T para retornar a matriz hessiana
fit <- optim(inits, model, control = list(fnscale = -1), hessian = TRUE, y = y,x = x)

#Valores que precisaremos para obter
#Fit$par é o máximo da distribuição de interesse e logo a média da distribuição normal que será utilizada para aproximar
param_mean <- fit$par
#A inversa da negativa da hessiana retorna a matriz de covariância (tem a ver com função score)
param_cov_mat <- solve(-fit$hessian)

round(param_mean, 2)
##  beta0  beta1 sigma2 
##   6.16   0.03   0.25
round(param_cov_mat, 3)
##         beta0  beta1 sigma2
## beta0   0.423 -0.001  0.029
## beta1  -0.001  0.000  0.000
## sigma2  0.029  0.000  0.003
#Gerando amostras da distribuição a posteriori
samples <- rmvnorm(10000, param_mean, param_cov_mat)
beta0    = samples[,1]
beta1    = samples[,2]
sigma2   = samples[,3]

samples = as.mcmc(samples)
summary(samples)
## 
## Iterations = 1:10000
## Thinning interval = 1 
## Number of chains = 1 
## Sample size per chain = 10000 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##           Mean       SD  Naive SE Time-series SE
## beta0  6.15174 0.651095 6.511e-03      6.511e-03
## beta1  0.02707 0.008972 8.972e-05      8.972e-05
## sigma2 0.24747 0.050631 5.063e-04      5.063e-04
## 
## 2. Quantiles for each variable:
## 
##           2.5%     25%     50%     75%   97.5%
## beta0  4.87027 5.71505 6.14398 6.59526 7.44012
## beta1  0.00912 0.02099 0.02713 0.03311 0.04449
## sigma2 0.14979 0.21352 0.24667 0.28112 0.34813
plot(beta0,type="l")
abline(-2,0,col="red")

plot(beta1,type="l")
abline(2,0,col="red")

plot(sigma2,type="l")
abline(5,0,col="red")

plot(density(beta0))

plot(density(beta1))

plot(density(sigma2))

8 Modelo final

\(Y_i = 6,15 + 0,03x_i\)

Interpreta-se que um acréscimo na veiculação por jornal, aumeneta na média das vendas em \(e^{6,15 + 0,03}\)

9 Medida de erro para o modelo Gamma

train = sample(1:nrow(base), nrow(base)/1.25)

yhat = 6.15 + 0.03*base$newspaper[-train] 
avrt = base[-train,"sales"]

mean((yhat-avrt)^2)
## [1] 80.99163

10 Árvore de decisão

10.1 Treino

Tamanho amostral de 160 para o treino

attach(base)
avr=tree(sales~.,base,subset = train)
summary(avr)
## 
## Regression tree:
## tree(formula = sales ~ ., data = base, subset = train)
## Variables actually used in tree construction:
## [1] "TV"    "radio"
## Number of terminal nodes:  9 
## Residual mean deviance:  1.737 = 262.3 / 151 
## Distribution of residuals:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -3.08900 -0.90190 -0.01872  0.00000  0.88860  3.66500
plot(avr)
text(avr,pretty=0)

cv.avr=cv.tree(avr)
plot(cv.avr$size,cv.avr$dev,type='b')

10.2 Poda

prune.avr=prune.tree(avr,best=3)
plot(prune.avr)
text(prune.avr,pretty=0)

Verifica-se que a melhor predição está associada ao grupo onde os valores da televisão estão acima de 26.85

11 Medições

yhat=predict(avr,newdata=base[-train,])
  
avrt = base[-train,"sales"]

plot(yhat,avrt)
abline(0,1)

mean((yhat-avrt)^2)
## [1] 2.537941

12 Random Forest

set.seed(02042019)
train = sample(1: nrow(base ), nrow(base )/2)
test=base[-train ,"sales"]  

bag=randomForest(sales~.,data=base ,subset=train, importance =TRUE) 
bag
## 
## Call:
##  randomForest(formula = sales ~ ., data = base, importance = TRUE,      subset = train) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 1
## 
##           Mean of squared residuals: 3.697536
##                     % Var explained: 84.55
yhat.bag = predict(bag,newdata =base[-train ,])
plot(yhat.bag , test)
abline(0,1)

mean(( yhat.bag - test)^2)
## [1] 4.426138

13 Boosting

set.seed(02042019)
boost=gbm(sales~.,data=base[train ,], distribution="gaussian",n.trees =5000 , interaction.depth =4)
summary(boost)

##                 var   rel.inf
## TV               TV 51.003209
## radio         radio 43.415780
## newspaper newspaper  5.581011
plot(boost)

yhat.boost=predict(boost,newdata = base[-train ,],n.trees =5000)
mean((yhat.boost-test)^2)
## [1] 2.151508

14 Bagging manual

#Criando uma lista que contenha todos os valores para treino
train = list()
for (i in 1:10000){
train[[i]]       = sample(1:nrow(base), nrow(base)/2,replace = T)
}

#Criando uma lista que contenha todos os ajustes da árvore baseado no treino
avr = list()
for (i in 1:10000){
avr[[i]]=tree(sales~.,base,subset = train[[i]])
}

#Média para cada árvore
yhat = list()
for (i in 1:10000){
yhat[[i]]=predict(avr[[i]],newdata=base[-train[[i]],])  
}

#Observado para cada árvore
avrt = list()
for (i in 1:10000){
avrt[[i]] = base[-train[[i]],"sales"]
}

#Visualização das 9 iniciais
par(mfrow=c(3,3))
for (i in 1:9){
plot(yhat[[i]],avrt[[i]])
abline(0,1)}

#Medição individual
rss = vector()
for (i in 1:10000){
rss[i] = mean((yhat[[i]]-avrt[[i]])^2)
}

#Medição final 
mean(rss)
## [1] 3.964381

A idéia foi criar um bootstrap manual, que fosse capaz de ralizar uma amostragem com reposição. Logo após, ajustar uma árvore de regressão para cada amostra sorteada. Cada árvore irá gerar uma medida e por fim, a média das medidas será considerada a medida final.

Tem-se que esta medida é equivalente a 3,95. Menor que a obtida pela árvore de regressão, no entando maior que a alcançada pelo método boosting.

Rafael Cabral Fernandez

2019-04-03