R: R Regressão Linear: Um Guia Completo sobre a função lm()

Última atualização: 2026-08-26

Nas três aulas anteriores, aprendemos sobre estatística descritiva, distribuições de probabilidade e teste de hipóteses — todos conceitos que envolvem “analisar dados”. Nesta aula, passaremos a “usar dados para prever o futuro” — regressão linear. Esse é o verdadeiro “destaque” do R. Será que aquela afirmação do anúncio — “Um investimento de 1.000.000 gera 5.000.000 em vendas” — é confiável? Vamos calcular isso com uma única linha usando lm().

Ao concluir esta aula, você será capaz de usar o R para realizar regressão linear, fazer previsões, interpretar coeficientes, testar a significância e diagnosticar modelos — o que representa 80% do trabalho na ciência de dados.

1. O que você vai aprender



2. Uma história sobre previsão de vendas

(1) Desafio: Publicidade x Vendas

Bob quer prever o impacto dos “gastos com publicidade” nas “vendas”:

TEXT 📖 Somente leitura
Advertising expenses(0K)   Sales(0K)
1            3
2            5
3            7
4            9
5            12

“É só um palpite” de que “gastar 10.000 em anúncios vai gerar 20.000 em vendas”? Use o LM para calcular isso com precisão—

(2) Solução usando R

R
# 1. Model Building in One Line
model <- lm(sales ~ ad, data = df)

# 2. View the results in one line
summary(model)
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)   1.0000     0.3536   2.828   0.0474 *  
# ad            2.0000     0.1054  18.975 0.0001 ***
# ---
# Residual standard error: 0.3651
# Multiple R-squared:  0.9923

# 3. One-Line Forecast
predict(model, data.frame(ad = 10))
# [1] 21  ← invest $10,000Advertising Sales Forecast 210,000

3 linhas de código → modelo + previsão.



3. Princípios da regressão linear

(1) Fórmulas matemáticas

TEXT 📖 Somente leitura
Y = β₀ + β₁X + ε
   │   │    │
   │   │    └─ Error term (Residual)
   │   └────── Slope (X increases by 1, Y changes by how much?)
   └────────── Intercept (Y value when X=0)
100%
graph LR
    A[Actual data points] --> B[Linear Model Fitting]
    B --> C[Find the Best Straight Line]
    C --> D[Minimize the sum of squared residuals]
    D --> E[Least Squares Method OLS]
    
    style A fill:#cce5ff
    style B fill:#d4edda
    style C fill:#fff3cd
    style D fill:#f8d7da
    style E fill:#e1d4ff

(2) Ideias centrais

Encontre uma reta tal que a “soma dos quadrados das distâncias” de todos os pontos até a reta seja minimizada (Mínimos Quadrados Ordinários, MCO).



4. Uso básico da função lm()

(1) 4 tipos de sintaxe de fórmula

R
# 1. y ~ x (Most Commonly Used)
lm(sales ~ ad, data = df)

# 2. y ~ x1 + x2 (Multiple)
lm(sales ~ ad + price, data = df)

# 3. y ~ x1 * x2 (Interaction)
lm(sales ~ ad * price, data = df)

# 4. y ~ . (All other variables)
lm(sales ~ ., data = df)

(2) A primeira regressão

R
# Data
df <- data.frame(
  ad = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
  sales = c(3, 5, 7, 9, 12, 13, 15, 17, 19, 21)
)

# Build a model
model <- lm(sales ~ ad, data = df)

# Abstract
summary(model)

Explicação detalhada do resultado:

TEXT 📖 Somente leitura
Call:
lm(formula = sales ~ ad, data = df)

Residuals:
   Min     1Q  Median     3Q     Max 
-0.4    -0.3     0.0     0.3     0.4 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   1.0000     0.2041   4.899  0.00106 ** 
ad            2.0000     0.0340  58.787 1.01e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3651 on 8 degrees of freedom
Multiple R-squared:  0.9977,	Adjusted R-squared:  0.9974
F-statistic: 3456 on 1 and 8 DF,  p-value: 1.008e-12

(3) Análise de 6 indicadores-chave

Campo Significado Explicação
Estimativa Estimativa do coeficiente ad=2,0 indica que um aumento de 10.000 nas despesas com publicidade leva a um aumento de 20.000 nas vendas
Erro-padrão Erro-padrão do coeficiente Precisão da estimativa do coeficiente (quanto menor, melhor)
valor de t estatística t Estimativa / Erro-padrão
Pr(>|t|) valor p Probabilidade de que o coeficiente não seja significativo = 0
Coeficiente de determinação Porcentagem da variância explicada pelo modelo (0–1)
Estatística F Estatística F Significância do Modelo Geral
💡 Ponto-chave: Um valor p inferior a 0,05 indica que o coeficiente é “significativamente diferente de 0” — o que significa que essa variável tem um efeito significativo sobre Y.



5. Prever predict()

(1) Previsão básica

R
# Single-Point Forecast
predict(model, data.frame(ad = 10))
# [1] 21  ← invest $10,000Advertising Sales Forecast 210,000

# Multi-point Forecasting
new_data <- data.frame(ad = c(11, 12, 13, 14, 15))
predict(model, new_data)
# [1] 23 25 27 29 31

# Confidence Interval
predict(model, data.frame(ad = 10), interval = "confidence")
#       fit    lwr    upr
# 1 21.000 20.751 21.249

(2) Intervalo de previsão

R
# Prediction Range (Includes uncertainty in individual predictions)
predict(model, data.frame(ad = 10), interval = "prediction")
#       fit    lwr    upr
# 1 21.000 20.064 21.936  <- wider than confidence


6. Diagnóstico de resíduos: plot.lm

(1) 4 principais tabelas de diagnóstico

R
par(mfrow = c(2, 2))
plot(model)
Imagem Significado O que deveria acontecer
1. Resíduos x Valores estimados Resíduos x Valores estimados Espalhados aleatoriamente (sem padrão)
2. Gráfico QQ Normalidade dos resíduos Pontos próximos à reta
3. Escala-Localização Homocedasticidade Próximo à linha horizontal
4. Resíduos x Alavancagem A alavancagem e seu impacto A maioria dos pontos está longe do limite

(2) Diagnóstico-chave

R
# Residual
residuals(model)

# Standardized Residuals
rstandard(model)

# Leverage Ratio
hatvalues(model)

# Cook's Distance (Impact Metrics)
cooks.distance(model)


7. Regressão linear múltipla

(1) Regressão múltipla

R
# Sales ~ Advertising expenses + Price + Season
df <- data.frame(
  sales = c(100, 120, 130, 110, 140, 150, 130, 160, 170, 180),
  ad = c(10, 12, 14, 11, 15, 16, 13, 17, 18, 19),
  price = c(50, 48, 45, 49, 44, 43, 47, 42, 41, 40),
  season = c("Spring", "Summer", "Autumn", "Winter", "Spring", "Summer", "Autumn", "Winter", "Spring", "Summer")
)

model <- lm(sales ~ ad + price + season, data = df)
summary(model)

(2) Itens interativos

R
# Includes interaction terms (ad:price)
model <- lm(sales ~ ad * price, data = df)
# Equivalent to sales ~ ad + price + ad:price

(3) Codificação automática de variáveis categóricas

R Converta automaticamente a variável character em uma variável fictícia:

R
# season is a character vector, R automatically creates:
# seasonSummer, seasonAutumn, seasonWinter (Spring as the Baseline)
💡 Dica: as.factor() Conversão explícita de fatores é mais segura do que os caracteres padrão.



8. Seleção de modelo

(1) R² ajustado

R
# The more variables you add, R-squared gets bigger (even if the variables are irrelevant)
# Adjusted R-squared corrects this bias
summary(model)$adj.r.squared

(2) Critério de Informação AIC

R
# AIC The smaller the model, the better
model1 <- lm(sales ~ ad, data = df)
model2 <- lm(sales ~ ad + price, data = df)
model3 <- lm(sales ~ ad + price + season, data = df)

AIC(model1, model2, model3)
#       df      AIC
# 1      3  85.32
# 2      4  78.45
# 3      6  72.18  ← Best

(3) Retorno gradual

R
# Forward
step(lm(sales ~ 1, data = df),
     scope = list(lower = ~ 1, upper = ~ ad + price + season),
     direction = "forward")

# Back
step(model3, direction = "backward")

# Two-way
step(model1, scope = ~ ad + price + season, direction = "both")


9. Aplicação prática: modelo abrangente de previsão de vendas

A seguir, apresentamos um exemplo de um fluxo de trabalho completo que reúne todos os conceitos de regressão linear abordados nesta aula.

▶ Exemplo: Modelo integrado de previsão de vendas

R 📖 Somente leitura
# ============================================
# Comprehensive Sales Forecasting Model
# Features: The Complete Linear Regression Process (Data Exploration -> Model -> Diagnosis -> Forecast)
# ============================================

library(ggplot2)
library(dplyr)
library(broom)

# 1. Prepare data
set.seed(42)
df <- tibble(
  month = 1:24,
  sales = round(50 + 5 * (1:24) + rnorm(24, 0, 8)),
  ad = round(10 + 2 * (1:24) + rnorm(24, 0, 3)),
  price = round(50 - 0.5 * (1:24) + rnorm(24, 0, 2)),
  season = rep(c("Spring", "Summer", "Autumn", "Winter"), 6),
  region = rep(c("Northern China", "East China", "South China", "Central China"), 6)
)

cat("=== Data Preview ===\n")
print(head(df, 3))

# 2. Data Exploration: Scatter Plot Matrix
cat("\n=== Correlation Analysis ===\n")
cor(df |> select(month, sales, ad, price))
cat("\n")

# 3. Simple Linear Regression
cat("=== Simple Regression: sales ~ ad ===\n")
model1 <- lm(sales ~ ad, data = df)
summary(model1)

# 4. Multiple Regression
cat("\n=== Multiple Regression: sales ~ ad + price + season ===\n")
model2 <- lm(sales ~ ad + price + season, data = df)
summary(model2)

# 5. Full Return
cat("\n=== Full Model: sales ~ ad + price + season + region ===\n")
model3 <- lm(sales ~ ad + price + season + region, data = df)
summary(model3)

# 6. Model Comparison
cat("\n=== Model Comparison ===\n")
cat("Model 1 (Advertisement Only): R-squared =", round(summary(model1)$r.squared, 3),
    "Adjusted R-squared =", round(summary(model1)$adj.r.squared, 3), "\n")
cat("Model 2 (+Price+Season): R-squared =", round(summary(model2)$r.squared, 3),
    "Adjusted R-squared =", round(summary(model2)$adj.r.squared, 3), "\n")
cat("Model 3 (+Region): R-squared =", round(summary(model3)$r.squared, 3),
    "Adjusted R-squared =", round(summary(model3)$adj.r.squared, 3), "\n")
cat("AIC:\n")
print(AIC(model1, model2, model3))

# 7. Model Diagnostics
cat("\n=== Model 3 Residual Diagnosis ===\n")
par(mfrow = c(2, 2))
plot(model3)
par(mfrow = c(1, 1))

# 8. Forecast
cat("\n=== Forecast for Next Month ===\n")
future <- data.frame(
  ad = 60,
  price = 38,
  season = "Autumn",
  region = "Northern China"
)
prediction <- predict(model3, future, interval = "confidence")
print(prediction)
cat("\nAnalysis: Sales Forecast for Next Month:", round(prediction[1, "fit"], 1), "10,000 yuan\n")
cat("95% Confidence Interval: [", round(prediction[1, "lwr"], 1), ", ",
    round(prediction[1, "upr"], 1), "]\n")

# 9. Residual Analysis
cat("\n=== Residual Analysis ===\n")
df <- df |>
  mutate(
    fitted = fitted(model3),
    residual = resid(model3),
    std_residual = rstandard(model3)
  )

cat("Maximum Positive Residual:", round(max(df$residual), 2),
    " (Sales were higher than expected)\n")
cat("Maximum Negative Residual:", round(min(df$residual), 2),
    " (Sales were lower than expected)\n")
cat("Standard Deviation of Residuals:", round(sd(df$residual), 2), "\n\n")

# 10. Coefficient Visualization
coef_df <- tidy(model3, conf.int = TRUE)
print(coef_df |> select(term, estimate, std.error, p.value, conf.low, conf.high))

# 11. Actual vs Fitting a Scatter Plot
ggplot(df, aes(x = fitted, y = sales)) +
  geom_point(size = 3, color = "blue") +
  geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
  labs(title = "Actual vs Fitting", x = "Fitted values", y = "Actual value") +
  theme_minimal()

# 12. Save Model
saveRDS(model3, "sales_model.rds")
cat("\n=== The model has been saved: sales_model.rds ===\n")
72 linhas de lógica (limite de 40, somente leitura)

Resultado esperado (trecho):

TEXT 📖 Somente leitura
=== Full Model: sales ~ ad + price + season + region ===
Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    55.234      8.123   6.801 0.00001 ***
ad              4.876      0.234  20.838  < 2e-16 ***
price          -0.432      0.123  -3.512  0.00245 ** 
seasonSummer        5.234      1.876   2.789  0.01234 *  
seasonAutumn        2.123      1.876   1.132  0.27456    
seasonWinter       -3.456      1.876  -1.842  0.08345 .  
regionEast China      8.234      1.876   4.389  0.00045 ***
regionSouth China      3.456      1.876   1.842  0.08345 .  
regionCentral China      1.234      1.876   0.658  0.51894    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.234 on 15 degrees of freedom
Multiple R-squared:  0.9823,	Adjusted R-squared:  0.9734

=== Forecast for Next Month ===
       fit      lwr      upr
1 168.452 162.345 174.559

Analysis: Sales Forecast for Next Month: 168.5 10,000 yuan
95% Confidence Interval: [162.3, 174.6]

❓ Perguntas Frequentes

P: O que é um bom valor de R²? R: Não existe um padrão fixo. Na física e na engenharia, valores de R² superiores a 0,9 são comuns, enquanto nas ciências sociais, valores entre 0,3 e 0,6 geralmente são suficientes. Preste atenção ao R² ajustado (ajuste multivariável).

P: O que devo fazer se um coeficiente não for significativo? R: Existem quatro possíveis razões: ① O tamanho da amostra é insuficiente; ② A variável é realmente irrelevante; ③ Multicolinearidade (correlação com outras variáveis); ④ É necessária uma transformação da variável.

P: Como se determina se os dados são adequados para regressão linear? R: Quatro condições: ① Linearidade: o gráfico de dispersão forma, aproximadamente, uma reta. ② Independência: teste de Durbin-Watson. ③ Homocedasticidade: os resíduos seguem uma distribuição uniforme. ④ Normalidade: o gráfico QQ é uma reta.

P: Qual é a diferença entre um intervalo de previsão e um intervalo de confiança? R: Um intervalo de confiança reflete a incerteza na média (estreito), enquanto um intervalo de previsão reflete a incerteza nas previsões individuais (amplo). interval = "confidence" vs "prediction".**

P: Como selecionar variáveis para a regressão múltipla? R: Existem três métodos: ① Conhecimento do negócio (experiência de especialistas) ② Regressão stepwise step() ③ Critérios de informação AIC / BIC para selecionar o modelo mais simples.

P: Como faço para incluir variáveis categóricas em uma regressão? R: Converta-as automaticamente em variáveis dummy. n níveis → n-1 variáveis 0/1 (uma para o nível de referência). No R, use as.factor() para controlar isso explicitamente.


📖 Resumo


📝 Exercícios

  1. Exercício básico: Use o conjunto de dados mtcars embutido no R para realizar mpg ~ wt uma regressão linear simples, interprete todos os resultados usando summary() e faça uma previsão mpg para wt = 3.

  2. Questões básicas: Desenhe quatro gráficos de diagnóstico para o modelo da questão anterior (par(mfrow = c(2, 2)); plot(model)) a fim de verificar se os resíduos seguem uma distribuição normal e se são homocedásticos.

  3. Questão básica: Construa um modelo de regressão múltipla mpg ~ wt + cyl + hp e compare os valores de R² e R² ajustado com os da regressão simples. Qual é o melhor?

  4. Exercício avançado: Simule 100 linhas de dados de vendas (vendas x publicidade + preço + temporada). Conclua todo o processo: ① Exploração ② Modelagem ③ Resumo ④ Diagnóstico ⑤ Previsão ⑥ Visualização. Salve o modelo como um arquivo RDS.

  5. Questão de desafio: Use mtcars para realizar uma seleção completa de modelos: ① Execute 4 modelos (apenas wt / wt+cyl / wt+cyl+hp / wt+cyl+hp+disp) ② Compare usando o AIC ③ Use step() para regressão stepwise ④ Use anova() para comparações aninhadas ⑤ Selecione o melhor modelo e faça uma previsão. Faça capturas de tela para documentar o processo.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%