Cálculo do Mínimos Quadrados Ordinários (MQO) em uma regressão linear univariada.

Passo 0 - Limpando o ambiente R

rm(list = ls())

Passo 1 - Criando o dataframe de dados

# Cria o dataframe 
Xi <- c( 2,  3, 4, 5, 6)
Yi <- c(60, 70, 80, 90, 95)
dados <- data.frame(Xi, Yi)
head(dados,5) # Exibe as cinco primeiras linhas de dados, neste caso, todas!
##   Xi Yi
## 1  2 60
## 2  3 70
## 3  4 80
## 4  5 90
## 5  6 95
plot(dados$Xi, dados$Yi, main = "Gráfico de dispersão", xlab = "horas de estudo", ylab = "notas obtidas") # Código alternativo para visualizar o gráfico de dispersão do dataframe dados

Passo 2 - calculando a média das variáveis observadas Xi e Yi

MediaY <- mean(Yi) # (2 + 3 + 4 + 5 + 6) / 5 = 4
MediaX <- mean(Xi) # (60 + 70 + 80 + 90 + 95) / 5 = 79
# mean() é o método utilizado para computar a média

Passo 3 - Calculado os desvios médios x̄ᵢ = Xi - x̄ (3) e ŷᵢ = Yi - ȳ (4)

DesvioX <- Xi - MediaX # Desvios médios das horas de estudo
DesvioY <- Yi - MediaY  # Desvios médios das notas obtidas na prova

Passo 4 - Adicionar os desvios ao dataframe dados

dados <- cbind(dados, DesvioX, DesvioY)
head(dados, 5) # Visualiza dataframe dados atualizado
##   Xi Yi DesvioX DesvioY
## 1  2 60      -2     -19
## 2  3 70      -1      -9
## 3  4 80       0       1
## 4  5 90       1      11
## 5  6 95       2      16

Passo 5 - Obtendo o produto dos desvios médios e otendo seu somatório:

numerador = Σ((Xi - x̄) x (Yi - ȳ))

xiyi <- DesvioY * DesvioX
dados <- cbind(dados, xiyi)
numerador <- sum(xiyi)

Passo 5 - Obtendo o desvio médio de Xi quadrado e seu somatório:

denominador = Σ((Xi - x̄)²)

xiq <- DesvioX * DesvioX # ou DesvioX^2
dados <- cbind(dados, xiq)
denominador  <- sum(xiq)

Passo 6 - Calculando β1=(Σ((Xi - x̄) x (Yi - ȳ)) )/(Σ((Xi - x̄)²)) (6)

β1 <- numerador / denominador 
# código alternativo que pula os passos exemplificados# neste tutorial
Beta1 <- beta1 <- sum(DesvioY *DesvioX)/sum(DesvioX^2)

Passo 7 - Calculando β₀ = ȳ - β₁ x̄ (5

β0 <- MediaY - β1 * MediaX

Passo 8 - Escrevendo a equação da reta y = β₀ + β₁x + ε (1)

Ye <- β0 + β1*Xi # equação de previsão para cada Xi existente no dataframe dados
dados <- cbind(dados, Ye) # adicionado Y previstos para o dataframe dados
plot(Xi, Yi, main = "Gráfico de dispersão", xlab = "horas de estudo", ylab = "notas obtidas")
abline(a=β0, b = β1, col = "red", lwd = 2) # Código para plotar um gráfico de dispersão com a reta de ajuste para Ye previsto. Adotou-se Ye como variável Y esperada para escrita do código  no R

Passo 9 - Fazendo a regressão nativamente pelo R

# em uma única linha fazemos todo o tutorial acima. 
reta_vermelha <-lm(Yi ~ Xi, data = dados)

# com a função summary percebemos o intercepto β0 = 43 e β1 = 9  
summary(reta_vermelha)
## 
## Call:
## lm(formula = Yi ~ Xi, data = dados)
## 
## Residuals:
##          1          2          3          4          5 
## -1.000e+00 -4.441e-15  1.000e+00  2.000e+00 -2.000e+00 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  43.0000     2.4495   17.55 0.000403 ***
## Xi            9.0000     0.5774   15.59 0.000574 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.826 on 3 degrees of freedom
## Multiple R-squared:  0.9878, Adjusted R-squared:  0.9837 
## F-statistic:   243 on 1 and 3 DF,  p-value: 0.0005737