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
- Princípios da regressão linear (Y = β0 + β1X + ε)
- Sintaxe da fórmula lm(): y ~ x
- Interpretação dos coeficientes da função summary() (Estimativa / Erro-padrão / Valor p)
- Prever predict()
- Diagnóstico de resíduos: plot.lm
- Regressão múltipla
- Tratamento de variáveis categóricas
- Aplicação prática: Modelos de previsão de vendas
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”:
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
# 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
Y = β₀ + β₁X + ε
│ │ │
│ │ └─ Error term (Residual)
│ └────── Slope (X increases by 1, Y changes by how much?)
└────────── Intercept (Y value when X=0)
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
# 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
# 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:
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 |
| R² | Coeficiente de determinação | Porcentagem da variância explicada pelo modelo (0–1) |
| Estatística F | Estatística F | Significância do Modelo Geral |
5. Prever predict()
(1) Previsão básica
# 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
# 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
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
# 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
# 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
# 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:
# season is a character vector, R automatically creates:
# seasonSummer, seasonAutumn, seasonWinter (Spring as the Baseline)
as.factor() Conversão explícita de fatores é mais segura do que os caracteres padrão.
8. Seleção de modelo
(1) R² ajustado
# 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
# 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
# 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
# ============================================
# 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")
Resultado esperado (trecho):
=== 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çãoAIC/BICpara 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
- Regressão linear: Y = β₀ + β₁X + ε, ajustada pelo método dos mínimos quadrados ordinários (OLS)
lm(y ~ x, data)Sintaxe da fórmula:y ~ x1 + x2Multivariável /y ~ x1 * x2Com interações /y ~ .Todassummary(model)6 resultados principais: Estimativa (coeficiente) / Erro-padrão / t / Pr(>|t|) / R² / Fpredict(model, new, interval = "confidence" | "prediction")Previsão- 4 gráficos de diagnóstico: Resíduos vs. Dados ajustados / QQ / Escala-Localização / Alavancagem
- Regressão múltipla: múltiplas variáveis independentes; as variáveis categóricas são automaticamente convertidas em variáveis fictícias
- Seleção de modelo: Ajuste de R² / AIC /
step()Regressão por etapas - Coeficiente: β indica que um aumento de 1 unidade em X resulta em um aumento médio de β em Y (mantendo as demais variáveis constantes)
- p < 0,05 indica um coeficiente significativo; quanto maior o R², melhor é o modelo (mas cuidado com o sobreajuste)
📝 Exercícios
-
Exercício básico: Use o conjunto de dados
mtcarsembutido no R para realizarmpg ~ wtuma regressão linear simples, interprete todos os resultados usandosummary()e faça uma previsãompgparawt = 3. -
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. -
Questão básica: Construa um modelo de regressão múltipla
mpg ~ wt + cyl + hpe compare os valores de R² e R² ajustado com os da regressão simples. Qual é o melhor? -
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.
-
Questão de desafio: Use
mtcarspara 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 ③ Usestep()para regressão stepwise ④ Useanova()para comparações aninhadas ⑤ Selecione o melhor modelo e faça uma previsão. Faça capturas de tela para documentar o processo.