Trabalho IV - Análise de Dados Categóricos
Vitor Nickhorn Kroeff
GRR20195798
Questão 1
a)
Stormchaser = read.csv(file = "http://leg.ufpr.br/~lucambio/ADC/Stormchaser.csv")
rel.freq <- table(Stormchaser$tornadoes) / length(Stormchaser$tornadoes)
rel.freq2 <- c(rel.freq, rep(0, times = 2))
x.bar <- mean(Stormchaser$tornadoes) ; y <- 0:7
prob <- round(dpois(x=y, lambda = x.bar), 4)
data.frame(y, prob, rel.freq = rel.freq2)## y prob rel.freq
## 1 0 0.6569 0.78260870
## 2 1 0.2761 0.13043478
## 3 2 0.0580 0.04347826
## 4 3 0.0081 0.01449275
## 5 4 0.0009 0.01449275
## 6 5 0.0001 0.01449275
## 7 6 0.0000 0.00000000
## 8 7 0.0000 0.00000000
plot(x = y - 0.1, y = prob, type = 'h',
xlab = 'Tornadoes', ylab = 'Prob',
lwd = 2, xaxt = 'n', ylim = c(0,1), col = 'steelblue4')
axis(side = 1, at = 0:8)
lines(x = y + 0.1, y = rel.freq2, type = 'h',
lwd = 2, lty = 'solid', col = 'indianred')
grid()
legend("topright", legend = c("Poisson", "Valores Observados"),
col = c("steelblue4", "indianred"), pch = c(1, 16))Com base no gráfico apresentado, é possível notar que os valores observados da variável “Tornadoes” exibem uma frequência significativa de ocorrências igual a zero. Esse padrão sugere a possibilidade de explorar um modelo com suporte para inflação de zeros, o que pode ser considerado como uma alternativa.
b)
O modelo Hurdle pressupõe dois processos distintos,onde um determina a presença ou ausência de zeros e o outro gera valores positivos. O ZIP assume que zeros podem surgir de duas maneiras dentro do mesmo ajuste (zeros estruturais e zeros aleatórios).
c)
O parâmetro buscaria quantificar a probabilidade de não observarmos nenhum tornados, mesmo que as condições climaticas estiverem adequadas para um.
d)
Abaixo ajustaremos os dois modelos.
require(pscl)
#Ajustando os modelos
ajuste_zip <- zeroinfl(tornadoes~1|1, dist = 'poisson', data = Stormchaser)
ajuste_hurdle <- hurdle(tornadoes~1, dist = 'poisson', data=Stormchaser)Agora iremos calcular as estimativas e IC de \(\hat\mu\) e \(\hat\pi\) do ajuste ZIP.
## count_(Intercept)
## 0.41
## 2.5 % 97.5 %
## -0.07 0.89
## zero_(Intercept)
## 0.95
## 2.5 % 97.5 %
## 0.26 1.63
Agora faremos a mesma coisa para o ajuste Hurdle.
## count_(Intercept)
## 0.41
## 2.5 % 97.5 %
## -0.07 0.89
## zero_(Intercept)
## -1.28
## 2.5 % 97.5 %
## -1.85 -0.71
Podemos observar que para ambos os modelos ajustados, o IC para \(\hat\mu\) inclui o valor zero, sendo um indicativo de que o parâmetro pode ser não significativo.
Questão 2
a)
O número de clientes que esperam na fila na loja do Starbucks. Com base na amostra coletada na loja de Lincoln, NE, entre às 08:00 e 08:30 da manhã
b)
starbucks <- read.csv( file = "http://leg.ufpr.br/~lucambio/ADC/starbucks.csv" )
starbucks$Day <- factor(starbucks$Day,
levels = c('Monday','Tuesday','Wednesday','Thursday','Friday'))
boxplot(starbucks$Count~starbucks$Day, col = 'indianred4', xlab= "Dia da Semana", ylab = "Número de Clientes",
main = "Boxplot Clientes por Dia da Semana")
points(starbucks$Count, col = 'royalblue1')Com base no gráfico apresentado, não parece plausível assumir que o número médio de clientes é igual todos os dias da semana. Segunda-feira (Monday) aparece como o dia mais discrepante dentre os demais.
c)
Abaixo ajustamos um modelo com um termo offset que considera o número de vezes em que cada dia da semana ocorreu na base.
#Definindo o termo offset.
starbucks$t <- as.numeric(table(starbucks$Day))
ajuste <- glm(Count~Day, family = poisson(link = 'log'), offset = log(t),data = starbucks)
summary(ajuste)##
## Call:
## glm(formula = Count ~ Day, family = poisson(link = "log"), data = starbucks,
## offset = log(t))
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -3.4641 -0.8832 -0.5099 0.9392 3.2908
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.1394 0.3536 -3.223 0.001269 **
## DayTuesday 0.9651 0.4155 2.323 0.020188 *
## DayWednesday 1.0986 0.4082 2.691 0.007123 **
## DayThursday 1.3218 0.3979 3.322 0.000895 ***
## DayFriday 1.1394 0.4062 2.805 0.005030 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 87.432 on 24 degrees of freedom
## Residual deviance: 72.431 on 20 degrees of freedom
## AIC: 150.9
##
## Number of Fisher Scoring iterations: 5
Realizando o LRT
## Analysis of Deviance Table (Type II tests)
##
## Response: Count
## LR Chisq Df Pr(>Chisq)
## Day 15.002 4 0.004698 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Com base nesse resultado, podemos observar que o dia há evidências significativas, a um um nível de confiança de 95%, que o dia da semana é significativo.
Questão 3
Faremos uma breve análise exploratória dos dados.
BladderCancer = read.csv( file = "http://leg.ufpr.br/~lucambio/ADC/BladderCancer.csv" )
BladderCancer$Size <- as.factor(BladderCancer$Size)
summary(BladderCancer)## Size Tumors Time
## 0:22 Min. :1.000 Min. : 1.00
## 1: 9 1st Qu.:1.000 1st Qu.: 8.50
## Median :1.000 Median :15.00
## Mean :1.548 Mean :14.65
## 3rd Qu.:2.000 3rd Qu.:21.50
## Max. :4.000 Max. :27.00
Uma análise gráfica dos dados.
require(GGally)
par(mfrow=c(1,2))
hist(BladderCancer$Tumors, main = 'Histograma de Tomors', col = 'steelblue4')
plot(BladderCancer$Size, BladderCancer$Tumors, xlab = 'Size', ylab = 'Tumors',
main = "Boxplox dos Size x Tumors", col='royalblue4')Ajustando o modelo
ajuste <- glm(Tumors~Size, family = poisson(link = 'log'), offset = log(Time), data = BladderCancer)
summary(ajuste)##
## Call:
## glm(formula = Tumors ~ Size, family = poisson(link = "log"),
## data = BladderCancer, offset = log(Time))
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.47733 -0.78021 0.03659 0.66352 2.34770
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.3394 0.1768 -13.234 <2e-16 ***
## Size1 0.3080 0.3062 1.006 0.315
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 29.850 on 30 degrees of freedom
## Residual deviance: 28.876 on 29 degrees of freedom
## AIC: 103.69
##
## Number of Fisher Scoring iterations: 5
Com sabe no resultado do summary do ajuste do nosso modelo, a variável Size não aparenta ser significativa.
Questão 4
Abaixo ajustaremos o modelo como sendo:
## ofp hosp numchron gender school privins health_excellent health_poor
## 1 5 1 2 1 6 1 0 0
## 2 1 0 2 0 10 1 0 0
## 3 13 3 4 0 10 0 0 1
## 4 16 1 2 1 3 1 0 1
## 5 3 0 2 0 6 1 0 0
## 6 17 0 5 0 7 0 0 1
xx <- as.matrix(dt[, c("hosp", "numchron", "gender", "school", "health_excellent", "health_poor")])
yy <- dt$privins
ajuste_lasso <- glmnet(y=yy, x=xx, family = 'binomial')lambda <- ajuste_lasso$lambda
las.coefs <- Matrix(rbind(as.matrix(coef(ajuste_lasso)), lambda), sparse = TRUE)
round(las.coefs[,c(1:5)], digits = 4)## 8 x 5 sparse Matrix of class "dgCMatrix"
## s0 s1 s2 s3 s4
## (Intercept) 1.245 1.0535 0.8832 0.7307 0.5933
## hosp . . . . .
## numchron . . . . .
## gender . . . . .
## school . 0.0187 0.0356 0.0510 0.0649
## health_excellent . . . . .
## health_poor . . . . .
## lambda 0.138 0.1257 0.1146 0.1044 0.0951
set.seed (27498272)
cv.lasso.fit <- cv.glmnet (y = yy , x = xx , family = "binomial")
plot (cv.lasso.fit)
grid()