Usaremos o conjunto de pacotes "tidyverse" para realizar algumas operações, sobretudo utilizando recursos gráficos.
library("knitr")
## Warning: package 'knitr' was built under R version 4.0.5
#Tratamento dos Dados
n_alunos <- c(23,19,30,22,23,29,35,36,33,25)
pont_med <- c(430,430,333,410,390,377,325,310,328,375)
library("tidyverse")
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3 v purrr 0.3.4
## v tibble 3.0.4 v dplyr 1.0.2
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## Warning: package 'ggplot2' was built under R version 4.0.5
## Warning: package 'readr' was built under R version 4.0.4
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
df <- tibble("Num_de_Alunos" = c(23,19,30,22,23,29,35,36,33,25),
"Pont_Media" = c(430,430,333,410,390,377,325,310,328,375),
)
Criação de um gráfico de dispersão que relaciona os dois vetores previamente declarados.
grafico_1 <- ggplot(df, aes(x = Num_de_Alunos , y = Pont_Media)) +
geom_point() +
ggtitle("Gráfico 1") +
xlab("Número de Alunos") +
ylab("Pontuação Média") +
xlim(10, 40) +
ylim(200, 450)
print(grafico_1)
Cálculo da média, variância e desvio-padrão da pontuação média dos alunos.
media <- df$Pont_Media %>% mean
print(paste("A média das pontuações é de", media, "pontos"))
## [1] "A média das pontuações é de 370.8 pontos"
variancia <- df$Pont_Media %>% var
print(paste("A variância das pontuações é de", variancia, "pontos"))
## [1] "A variância das pontuações é de 2002.84444444444 pontos"
desvio_p <- df$Pont_Media %>% sd
print(paste("O desvio-padrão das pontuações é de", desvio_p, "pontos"))
## [1] "O desvio-padrão das pontuações é de 44.753150106383 pontos"
Cálculo da correlação e covariância entre o número de alunos por turma e sua pontuação média.
cova <- cov(df$Num_de_Alunos, df$Pont_Media)
print(paste("A covariância entre o número de alunos por turma e sua pontuação média é de", cova))
## [1] "A covariância entre o número de alunos por turma e sua pontuação média é de -251.444444444444"
corr <- cor(df$Num_de_Alunos, df$Pont_Media)
print(paste("A correlação entre o número de alunos por turma e sua pontuação média é de", corr))
## [1] "A correlação entre o número de alunos por turma e sua pontuação média é de -0.947442434033449"
Atribuição de uma regressão linear que tenha o número de alunos da turma como variável explicativa de sua pontuação média.
reg <- lm(df$Pont_Media ~ df$Num_de_Alunos)
summary(reg)
##
## Call:
## lm(formula = df$Pont_Media ~ df$Num_de_Alunos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.9248 -10.6002 -0.8506 5.8631 27.0246
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 567.4272 23.9606 23.682 1.08e-08 ***
## df$Num_de_Alunos -7.1501 0.8536 -8.376 3.13e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.19 on 8 degrees of freedom
## Multiple R-squared: 0.8976, Adjusted R-squared: 0.8849
## F-statistic: 70.16 on 1 and 8 DF, p-value: 3.132e-05
Criação de um segundo gráfico, que contenha a reta de regressão estipulada no modelo acima.
grafico_2 <- ggplot(df, aes(x = Num_de_Alunos , y = Pont_Media)) +
geom_point() +
ggtitle("Gráfico 2") +
geom_line() +
xlab("Número de Alunos") +
ylab("Pontuação Média") +
xlim(10, 40) +
ylim(200, 450) +
geom_smooth(method = "lm")
print(grafico_2)
## `geom_smooth()` using formula 'y ~ x'
Trazer o dado do r-quadrado da regressão.
r_quadrado <- summary(reg)$r.squared
print(paste("O R-quadrado é igual a", round(r_quadrado, 2)))
## [1] "O R-quadrado é igual a 0.9"
Criação de uma tabela com os coeficientes estimados (intercepto e coeficiente angular), erros padrão, estatísticas t, e p-valores da variável explicativa e do intercepto do modelo.
estatisticas_da_reg <- summary(reg)
coef_estimados <- tibble("Coeficientes" = c("Intercepto", "Var.Explicativa"),
"Valor dos Coef" = estatisticas_da_reg$coefficients[c(1:2)],
"R-quadrado" = estatisticas_da_reg$r.squared,
"Erro-padrão" = estatisticas_da_reg$coefficients[c(3:4)],
"Estatística-t" = estatisticas_da_reg$coefficients[c(5:6)],
"P-Valor" = estatisticas_da_reg$coefficients[c(7:8)],
)
print(coef_estimados)
## # A tibble: 2 x 6
## Coeficientes `Valor dos Coef` `R-quadrado` `Erro-padrão` `Estatística-t`
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Intercepto 567. 0.898 24.0 23.7
## 2 Var.Explicativa -7.15 0.898 0.854 -8.38
## # ... with 1 more variable: P-Valor <dbl>
Apresentar a matriz de variâncias e covariâncias dos coeficientes
matriz_cov <- estatisticas_da_reg$cov.unscaled
print(matriz_cov)
## (Intercept) df$Num_de_Alunos
## (Intercept) 2.48941548 -0.086887836
## df$Num_de_Alunos -0.08688784 0.003159558
O erro-padrão é a medida de incerteza ao se estimar um parâmetro, e a estatística-t é a medida da distância entre a estimativa e uma distribuição com média zero. Quanto menor o erro-padrão, maior deverá ser o valor da estatística-t, o que reflete em um aumento do poder explicativo do nosso modelo.
As estatísticas da regressão fornecem o dado de que o p-valor do intercepto é menor do que 0.05. Isso significa que, por ser menor do que o valor do teste de significância (5%), a hipótese nula pode ser rejeitada e dizemos que o intercepto é estatisticamente diferente de zero.
A função summary também realiza o teste de significância a partir da seção Signif. codes:, que por ser avaliado em três asteriscos, reflete que a probablidade de não se rejeitar a hipótese nula é bem próxima de zero, estando de acordo com a conclusão obtida.
summary(reg)
##
## Call:
## lm(formula = df$Pont_Media ~ df$Num_de_Alunos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.9248 -10.6002 -0.8506 5.8631 27.0246
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 567.4272 23.9606 23.682 1.08e-08 ***
## df$Num_de_Alunos -7.1501 0.8536 -8.376 3.13e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.19 on 8 degrees of freedom
## Multiple R-squared: 0.8976, Adjusted R-squared: 0.8849
## F-statistic: 70.16 on 1 and 8 DF, p-value: 3.132e-05
coef_estimados[1,6]
## # A tibble: 1 x 1
## `P-Valor`
## <dbl>
## 1 0.0000000108
As estatísticas da regressão fornecem o dado de que o p-valor da variável explicativa é menor do que 0.05. Isso significa que, por ser menor do que o valor do teste de significância (5%), a hipótese nula pode ser rejeitada.
coef_estimados[2,6]
## # A tibble: 1 x 1
## `P-Valor`
## <dbl>
## 1 0.0000313
Utilizando o termo implícito y ~ 0 + x na fórmula geradora de regressões lineares no R, podemos encontrar uma regressão sem intercepto (a = 0), ou seja, partindo da origem.
reg_sem_intercepto <- lm(df$Pont_Media ~ 0 + df$Num_de_Alunos)
print(summary(reg_sem_intercepto))
##
## Call:
## lm(formula = df$Pont_Media ~ 0 + df$Num_de_Alunos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -145.57 -78.87 34.32 123.43 189.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## df$Num_de_Alunos 12.65 1.36 9.304 6.5e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 120.7 on 9 degrees of freedom
## Multiple R-squared: 0.9058, Adjusted R-squared: 0.8954
## F-statistic: 86.57 on 1 and 9 DF, p-value: 6.501e-06
Aplicando a reta de regressão sem intercepto na regressão antiga, obtemos:
est_coef_estimados2 <- summary(reg_sem_intercepto)
coef_estimados2 <- tibble("Coeficientes" = "Var. Explicativa",
"Valor do Coef" = est_coef_estimados2$coefficients[1],
"R-quadrado" = est_coef_estimados2$r.squared,
"Erro-padrão" = est_coef_estimados2$coefficients[2],
"Estatística-t" = est_coef_estimados2$coefficients[3],
"P-Valor" = est_coef_estimados2$coefficients[4]
)
grafico_2 <- ggplot(df, aes(x = Num_de_Alunos , y = Pont_Media)) +
geom_point() +
ggtitle("Gráfico 2") +
geom_line() +
xlab("Número de Alunos") +
ylab("Pontuação Média") +
xlim(0, 40) +
ylim(0, 450) +
geom_smooth(method = "lm") +
geom_abline(slope = est_coef_estimados2$coefficients[1] , intercept = 0, color = "red")
print(grafico_2)
## `geom_smooth()` using formula 'y ~ x'
A inclusão de um intercepto na origem do modelo propõe maior abrangência na análise dos dados. O ponto (0,0) representa a nota média de uma turma que contém zero alunos, ou seja, deve ser zero para que a interpretação do intercepto faça sentido. Dessa forma, é possível estimar o relacionamento entre as variáveis que estão fora do intervalo amostral.
Estatisticamente, podemos demonstrar que o modelo sem intercepto possui R-quadrado ligeiramente maior em relação ao modelo inicial (o que representa que a sua ESS (Expected Sum of Squares) é proporcionalmente maior em relação à sua TSS (Total Sum of Squares). Além disso, pode-se observar que o erro-padrão da variável explicativa no modelo sem intercepto é maior do que o erro-padrão da variável explicativa no modelo inicial, o que representa uma perda proporcionalmente significativa na capacidade preditiva do modelo sem intercepto.
Pode-se observar claro enviesamento do modelo sem intercepto ao realizar uma avaliação visual da regressão. Isso demonstra que ainda que seja lógico, não é viável utilizar uma análise puramente centrada no valor do intercepto como forma de definir a validade da regressão, pois o viés de interpretação pode se alterar completamente, ao ponto de não se explicar de maneira correta o relacionamento entre as variáveis de interesse obtidas na amostra.
O enviesamento é explicado pelo coeficiente de correlação entre as variáveis amostrais, que por ser próximo de -1 (no modelo inicial), representa uma dependência linear inversamente proporcional entre a quantidade de alunos da turma e a sua pontuação média. O modelo sem intercepto apresenta uma regressão de inclinação positiva e um coeficiente de correlação maior do que zero, o que propõe uma possível dependência linear proporcional entre as variáveis, o que não condiz com os resultados obtidos na amostra.
print(coef_estimados)
## # A tibble: 2 x 6
## Coeficientes `Valor dos Coef` `R-quadrado` `Erro-padrão` `Estatística-t`
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Intercepto 567. 0.898 24.0 23.7
## 2 Var.Explicativa -7.15 0.898 0.854 -8.38
## # ... with 1 more variable: P-Valor <dbl>
print(coef_estimados2)
## # A tibble: 1 x 6
## Coeficientes `Valor do Coef` `R-quadrado` `Erro-padrão` `Estatística-t`
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Var. Explicativa 12.7 0.906 1.36 9.30
## # ... with 1 more variable: P-Valor <dbl>
print(paste("O P-valor da regressão sem intercepto é", est_coef_estimados2$coefficients[4]))
## [1] "O P-valor da regressão sem intercepto é 6.50055982248613e-06"
corr <- cor(df$Num_de_Alunos, df$Pont_Media)
print(paste("A correlação entre o número de alunos por turma e sua pontuação média é de", corr))
## [1] "A correlação entre o número de alunos por turma e sua pontuação média é de -0.947442434033449"