Modelo Normal com média e variância constantes
Uma fábrica de peças automotivas busca garantir a padronização do diâmetro de um componente essencial para o funcionamento dos motores. O diâmetro ideal desse componente é de aproximadamente 40 mm, porém, pequenas variações são inevitáveis no processo de fabricação. Estima-se que um desvio padrão de 3 mm seja aceitável. Para monitorar a qualidade da produção, foram coletadas medidas de 1000 peças selecionadas aleatoriamente, com o objetivo de verificar se o processo está operando dentro dos padrões esperados.
Para modelar essas medições, assumimos que o diâmetro das peças segue a distribuição normal com média \(\theta = 40\)mm e variância \(\sigma^2 = 3^2 = 9\). Dessa forma, cada medida pode ser expressa como:
\[ Y_i = \theta + e_i, \quad e_i \stackrel{iid}{\sim} N(0,\sigma^2), \quad i = 1, \dots, n=1000, \]
onde
Simule um conjunto de dados para o problema descrito acima.
#Simulando dados
n = 1000 #tamanho da amostra
theta = 40 #media populacional
sigma2 = 9 #variancia
e = rnorm(n, 0, sqrt(sigma2)) #efeito aleatorio
y = theta + e #variavel resposta
Realize uma análise exploratória da variável resposta \(Y\) e dos erros aleatórios \(e\).
Calcule medidas descritivas como média, mediana, variância e desvio padrão.
# Medidas descritivas
mean(y) # Média
## [1] 39.99922
median(y) # Mediana
## [1] 39.9236
var(y) # Variância
## [1] 8.9281
sd(y) # Desvio padrão
## [1] 2.987993
Visualize a distribuição da variável resposta e do erro aleatório por meio de histogramas e curvas de densidade ajustadas.
#analisando as densidades de Y e de e
par(mfrow=c(1,2))
hist(y, freq=F, main="", cex.lab=1.4, cex.axis=1.4, ylab="densidade", xlab="Y")
curve(dnorm(x, mean(y), sd(y)), col="red", add=T, lwd=2)
#analisando a densidade do erro aleatorio
hist(e, freq=F, main="", cex.lab=1.4, cex.axis=1.4, ylab="densidade", xlab="erro aleatorio")
curve(dnorm(x, mean(e), sd(e)), col="red", add=T, lwd=2)
abline(v=0, lwd=2, lty=3, col="red")
Verifique a normalidade da variável resposta e do erro aleatório utilizando QQ Plots.
#outra forma de verificar normalidade
par(mfrow=c(1,2))
qqnorm(y, bty="n", xlab="quantis teóricos", ylab="quantis amostrais",
cex.lab=1.4, cex.axis=1.4, main="QQ Plot da variável resposta")
qqline(y, col="red", lwd=2)
qqnorm(e, bty="n", xlab="quantis teóricos", ylab="quantis amostrais",
cex.lab=1.4, cex.axis=1.4, main="QQ Plot dos erros aleatórios")
qqline(e, col="red", lwd=2)
Teste a normalidade da variável resposta e do erro aleatório usando os testes de Shapiro-Wilk e Kolmogorov-Smirnov.
#testando normalidade
shapiro.test(y)
##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.9975, p-value = 0.1306
ks.test(y, "pnorm", mean(y), sd(y))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: y
## D = 0.021047, p-value = 0.7675
## alternative hypothesis: two-sided
shapiro.test(e)
##
## Shapiro-Wilk normality test
##
## data: e
## W = 0.9975, p-value = 0.1306
ks.test(e, "pnorm", mean(e), sd(e))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: e
## D = 0.021047, p-value = 0.7675
## alternative hypothesis: two-sided
Faça um gráfico de dispersão para a variável resposta e outro para os erros aleatórios. Analise os gráficos.
#analisando a dispersao
par(mfrow=c(1,2))
plot(y, cex.lab=1.4, cex.axis=1.4, xlab="unidades", ylab="Y")
plot(e, cex.lab=1.4, cex.axis=1.4, xlab="unidades", ylab="e")
Avalie a simetria com boxplots.
#verificando a simetria
par(mfrow=c(1,2))
boxplot(y, main="Boxplot dos diâmetros", ylab="Diâmetro (mm)")
boxplot(e, main="Boxplot dos erros aleatórios", ylab="e (mm)")
Considere \(\sigma^2\) conhecido.
Forneça uma estimativa pontual para o parâmetro \(\theta\).
#Estimativa pontual para theta
mean(y)
## [1] 39.99922
Construa um intervalo de confiança para \(\theta\) assumindo \(\sigma^2\) conhecido e um nível de confiança de 97%.
#Estimativa intervalar para theta
gama = 0.97
alfa = 1-gama
z_critico = qnorm(1-alfa/2)
#z_critico = qnorm(alfa/2, lower.tail=F)
erro_padrao_theta = sqrt(sigma2/ n)
round(c(mean(y) - z_critico*erro_padrao_theta,
mean(y) + z_critico*erro_padrao_theta),3)
## [1] 39.793 40.205
Represente graficamente a função de log-verossimilhança de \(\theta\).
#função de log-verossimilhança
funcao_log_vero = function(y, theta, sigma2){
sum(dnorm(y, theta, sqrt(sigma2), log=T))
}
#aplicando a funcao
theta_val = seq(10,70, l=1000)
log_vero = NULL
for(j in 1:length(theta_val)){
log_vero[j] = funcao_log_vero(y, theta_val[j], sigma2)
}
plot(theta_val, log_vero, type="l", bty="n", xlab=expression(theta), ylab="log verossimilhança", lwd=2)
abline(v=theta, lwd=2, col="blue")
abline(v=mean(y), lwd=2, col="red", lty=3)
legend("topright", legend=c(expression("Verdadeiro "*theta), "Estimativa da média amostral"),
col=c("blue", "red"), lty=c(1, 3), lwd=2, bty="n")
Encontre as estimativas pontuais dos erros aleatórios e compare com os verdadeiros.
#Estimando os erros aleatorios
echapeu = y - mean(y)
plot(e, echapeu, lwd=2, bty="n")
lines(e,e, col="red", lwd=2)
Considere \(\sigma^2\) desconhecido.
Forneça uma estimativa pontual para o parâmetro \(\theta\) e uma para \(\sigma^2\).
# Estimativas pontuais de theta e sigma^2
theta_chapeu = mean(y) # Estimador pontual de theta
c(theta_chapeu, theta)
## [1] 39.99922 40.00000
sigma2_chapeu = var(y) # Estimador pontual de sigma^2
c(sigma2_chapeu, sigma2)
## [1] 8.9281 9.0000
Construa um intervalo de confiança para \(\theta\) e outro para \(\sigma^2\) considerando um nível de confiança de 97%.
# Intervalos de confiança (97%)
gama = 0.97
alfa = 1-gama # Nível de significância
# IC para theta (usando distribuição t de Student)
t_critico = qt(1 - alfa/2, df = n - 1)
erro_padrao_theta = sqrt(sigma2_chapeu / n)
IC_theta = c(theta_chapeu - t_critico * erro_padrao_theta,
theta_chapeu + t_critico * erro_padrao_theta)
IC_theta
## [1] 39.79388 40.20456
# IC para sigma^2 (usando distribuição qui-quadrado)
chi_inf = qchisq(alfa/2, df=n-1)
chi_sup = qchisq(1 - alfa/2, df=n-1)
IC_sigma2 = c((n-1) * sigma2_chapeu / chi_sup, (n-1) * sigma2_chapeu / chi_inf)
IC_sigma2
## [1] 8.119698 9.861061
Represente graficamente a função de log-verossimilhança de \(\theta\) considerando a estimativa pontual de \(\sigma^2\). E depois represente graficamente a função de log-verossimilhança de \(\sigma^2\) considerando a estimativa pontual de \(\theta\).
#função de log-verossimilhança
funcao_log_vero = function(y, theta, sigma2){
sum(dnorm(y, theta, sqrt(sigma2), log=T))
}
#função de log-verossimilhança perfilada I
theta_seq = seq(30,50, l=250)
log_vero = NULL
for(j in 1:length(theta_seq)){
log_vero[j] = funcao_log_vero(y, theta_seq[j], sigma2_chapeu)
}
plot(theta_seq, log_vero, type="l", bty="n", xlab=expression(theta), ylab="log verossimilhança", lwd=2)
abline(v=theta, lwd=2, col="blue")
abline(v=theta_chapeu, lwd=2, col="red", lty=3)
legend("topright", legend=c(expression("Verdadeiro "*theta), "Estimativa da média amostral"),
col=c("blue", "red"), lty=c(1, 3), lwd=2, bty="n")
#função de log-verossimilhança perfilada II
sigma2_seq = seq(7,12, l=250)
log_vero = NULL
for(j in 1:length(sigma2_seq)){
log_vero[j] = funcao_log_vero(y, theta_chapeu, sigma2_seq[j])
}
plot(sigma2_seq, log_vero, type="l", bty="n", xlab=expression(sigma^2), ylab="log verossimilhança", lwd=2)
abline(v=sigma2, lwd=2, col="blue")
abline(v=sigma2_chapeu, lwd=2, col="red", lty=3)
legend("topright", legend=c(expression("Verdadeiro "*sigma), "Estimativa da média amostral"),
col=c("blue", "red"), lty=c(1, 3), lwd=2, bty="n")
Represente graficamente a função de log-verossimilhança de \(\theta\) e \(\sigma^2\).
#criando valores para os parametros desconhecidos
#theta_seq = seq(20, 60, length = 100)
#sigma2_seq = seq(5,25, length = 100)
#Combina todos os valores de theta_seq com os de sigma2_seq
#Exemplo: se theta_seq tem os valores 1 e 2 e sigma2_seq tem os valores 3 e 4
#os pares de pontos são (1,3), (1,4), (2,3), (2,4)
#e depois calcula a log-verossimilhanca para cada par de pontos
#log_vero_matrix = outer(theta_seq, sigma2_seq, Vectorize(funcao_log_vero))
log_vero_matrix = matrix(NA, length(theta_seq),length(sigma2_seq))
for(ind1 in 1:length(theta_seq)){
for(ind2 in 1:length(sigma2_seq)){
log_vero_matrix[ind1,ind2] = funcao_log_vero(y, theta_seq[ind1], sigma2_seq[ind2])
}
}
#procurando pelo ponto de máximo
ind = which(log_vero_matrix==max(log_vero_matrix), arr.ind = T)
c(theta_seq[ind[1]], sigma2_seq[ind[2]])
## [1] 39.959839 8.927711
c(theta_chapeu, sigma2_chapeu)
## [1] 39.99922 8.92810
c(theta, sigma2)
## [1] 40 9
#Criando o gráfico 3D
persp_plot = persp(theta_seq, sigma2_seq, log_vero_matrix, theta=30, phi=30,
xlab=expression(theta), ylab=expression(sigma^2),
zlab="Log-Verossimilhança", col="lightblue", border="blue")
#Encontrando o ponto de maximo (espera-se que a funcao de log-verossimilhanca atinja seu valor maximo quando theta e sigma2 assumirem os seus respectivos valores verdadeiros)
max_log_vero = funcao_log_vero(y, theta, sigma2)
true_point = trans3d(theta, sigma2, max_log_vero, persp_plot)
points(true_point$x, true_point$y, pch=19, col="red", cex=1.5)
# Criando o gráfico interativo de superfície
# install.packages("plotly") # Instalar e carregar o pacote plotly, se necessário
library(plotly)
fig <- plot_ly(
x = theta_seq,
y = sigma2_seq,
z = t(log_vero_matrix),
type = "surface"
)
# Adicionando o ponto verdadeiro (red point)
fig <- fig %>% add_trace(
x = theta,
y = sigma2,
z = max_log_vero,
type = "scatter3d",
mode = "markers",
marker = list(color = "red", size = 5)
)
# Ajustando o layout para os eixos
fig <- fig %>% layout(
title = "Função de Log-Verossimilhança",
scene = list(
xaxis = list(title = "theta"),
yaxis = list(title = "sigma2"),
zaxis = list(title = "Log-Verossimilhança")
)
)
# Exibindo o gráfico interativo
fig
Encontre as estimativas pontuais dos erros aleatórios e compare com os verdadeiros.
#Estimando os erros aleatorios
echapeu = y - mean(y)
plot(e, echapeu, lwd=2, bty="n")
lines(e,e, col="red", lwd=2)