Regresión OLS en R

Ejemplo con mtcars & easytable

2026-03-03

Objetivo de la sesión

  • Entender los componentes básicos de un modelo OLS.
  • Calcular e interpretar coefficientes \(\beta\).
  • Entender por qué importan los controles (regresión múltiple).
  • Leer tablas de regresión con resultados reales en mtcars.

Datos de trabajo: mtcars

mtcars proviene de la revista Motor Trend (EE. UU., 1974) y contiene información sobre el consumo de combustible y diez características de diseño y desempeño de 32 automóviles de los modelos 1973–74. Tiene 32 observaciones y 11 variables numéricas, ampliamente utilizado en análisis estadístico y ejemplos en R.


data(mtcars)

Variables mtcars


Variable Descripción
mpg Millas por galón (EE. UU.)
cyl Número de cilindros
disp Cilindrada (pulgadas cúbicas)
hp Caballos de fuerza brutos
drat Relación del eje trasero
wt Peso (miles de libras)
qsec Tiempo en 1/4 de milla
vs Motor (0 = en V, 1 = en línea)
am Transmisión (0 = automática, 1 = manual)
gear Número de marchas hacia adelante
carb Número de carburadores

mtcars


mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.9 2.6 16.5 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.9 2.9 17.0 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.9 2.3 18.6 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.1 3.2 19.4 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.1 3.4 17.0 0 0 3 2
Valiant 18.1 6 225.0 105 2.8 3.5 20.2 1 0 3 1
Duster 360 14.3 8 360.0 245 3.2 3.6 15.8 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.7 3.2 20.0 1 0 4 2
Merc 230 22.8 4 140.8 95 3.9 3.1 22.9 1 0 4 2
Merc 280 19.2 6 167.6 123 3.9 3.4 18.3 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.9 3.4 18.9 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.1 4.1 17.4 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.1 3.7 17.6 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.1 3.8 18.0 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.9 5.2 18.0 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.0 5.4 17.8 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.2 5.3 17.4 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.1 2.2 19.5 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.9 1.6 18.5 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.2 1.8 19.9 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.7 2.5 20.0 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.8 3.5 16.9 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.1 3.4 17.3 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.7 3.8 15.4 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.1 3.8 17.0 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.1 1.9 18.9 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.4 2.1 16.7 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.8 1.5 16.9 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.2 3.2 14.5 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.6 2.8 15.5 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.5 3.6 14.6 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.1 2.8 18.6 1 1 4 2

Regresión lineal simple

\[ mpg_i = \beta_0 + \beta_1 wt_i + \epsilon_i \]

  • Variable dependiente: mpg.
  • Variable independiente: wt (peso del auto).
  • Interpretación esperada: a mayor peso, menor rendimiento.

Resultados del modelo simple



Call:
lm(formula = mpg ~ wt, data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.5432 -2.3647 -0.1252  1.4096  6.8727 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  37.2851     1.8776  19.858  < 2e-16 ***
wt           -5.3445     0.5591  -9.559 1.29e-10 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.046 on 30 degrees of freedom
Multiple R-squared:  0.7528,    Adjusted R-squared:  0.7446 
F-statistic: 91.38 on 1 and 30 DF,  p-value: 1.294e-10

¿Qué son los residuales?

El residual es la diferencia entre el valor observado y el valor predicho por el modelo:

\[ e_i = y_i - \hat{y}_i \]

  • Residual positivo: el modelo subestimó.
  • Residual negativo: el modelo sobreestimó.

Sesgo por variable omitida


  • Ocurre cuando excluimos una variable relevante para mpg.
  • Dos condiciones clásicas:
    • La variable omitida afecta mpg.
    • La variable omitida está correlacionada con un predictor incluido.
  • Consecuencia: coeficientes sesgados e inferencias engañosas.

Supuestos de OLS


  • Relación lineal entre predictores y variable dependiente.
  • Errores con media cero.
  • Independencia de errores.
  • Homocedasticidad.
  • Ausencia de colinealidad severa (en modelos múltiples).

Regresión múltiple


\[ mpg_i = \beta_0 + \beta_1 wt_i + \beta_2 hp_i + \beta_3 cyl_i + \beta_4 am_i + \epsilon_i \]

  • Ahora controlamos simultáneamente por potencia, cilindros y transmisión.
  • Cada coeficiente se interpreta ceteris paribus.

Interpretación de coeficientes


Con el modelo múltiple:

  • Efecto de wt: -2.606 unidades de mpg por cada unidad adicional de peso, manteniendo lo demás constante.
  • Efecto de hp: -0.025 sobre mpg, ceteris paribus.
  • Efecto de am (manual=1): 1.478 frente a automática.

Resultados del modelo múltiple



Call:
lm(formula = mpg ~ wt + hp + cyl + am, data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.4765 -1.8471 -0.5544  1.2758  5.6608 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 36.14654    3.10478  11.642 4.94e-12 ***
wt          -2.60648    0.91984  -2.834   0.0086 ** 
hp          -0.02495    0.01365  -1.828   0.0786 .  
cyl         -0.74516    0.58279  -1.279   0.2119    
am           1.47805    1.44115   1.026   0.3142    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.509 on 27 degrees of freedom
Multiple R-squared:  0.849, Adjusted R-squared:  0.8267 
F-statistic: 37.96 on 4 and 27 DF,  p-value: 1.025e-10

Sintaxis Básica en R


# Modelo simple
m1 <- lm(mpg ~ wt, 
         data = mtcars)

# Modelo múltiple 
m2 <- lm(mpg ~ wt + hp, data = mtcars)

# Modelo múltiple 
m3 <- lm(mpg ~ wt + hp + cyl + am, data = mtcars)

Tablas con easytable

Instalar easytable


# Instalacion de un paquete de apoyo (dependencia)
install.packages("devtools")

# Instalacion de easytable
devtools::install_github("alfredo-hs/easytable")

# Activar easytable
library(easytable)

easytable() vs summary()

# Activar la función summary() sobre el objecto m1
summary(m1)

Call:
lm(formula = mpg ~ wt, data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.5432 -2.3647 -0.1252  1.4096  6.8727 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  37.2851     1.8776  19.858  < 2e-16 ***
wt           -5.3445     0.5591  -9.559 1.29e-10 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.046 on 30 degrees of freedom
Multiple R-squared:  0.7528,    Adjusted R-squared:  0.7446 
F-statistic: 91.38 on 1 and 30 DF,  p-value: 1.294e-10
# Activar la función easytable() sobre el objecto m1
easytable(m1)

term

Model 1

(Intercept)

37.29 ***
(1.88)

wt

-5.34 ***
(0.56)

N

32

R sq.

0.75

Adj. R sq.

0.74

Significance: ***p < .01; **p < .05; *p < .1

Comparar modelos con easytable()


# Activar la función easytable() sobre los objectos m1 y m2
easytable(m1, m2)

term

Model 1

Model 2

(Intercept)

37.29 ***
(1.88)

37.23 ***
(1.6)

wt

-5.34 ***
(0.56)

-3.88 ***
(0.63)

hp

-0.03 ***
(0.01)

N

32

32

R sq.

0.75

0.83

Adj. R sq.

0.74

0.81

Significance: ***p < .01; **p < .05; *p < .1

Otras funciones de easytable()

Otras funciones de easytable()

# Resaltar coeficientes significativos
easytable(m1, m2, m3,
          highlight = TRUE)

term

Model 1

Model 2

Model 3

(Intercept)

37.29 ***
(1.88)

37.23 ***
(1.6)

36.15 ***
(3.1)

wt

-5.34 ***
(0.56)

-3.88 ***
(0.63)

-2.61 ***
(0.92)

hp

-0.03 ***
(0.01)

-0.02 *
(0.01)

cyl

-0.75
(0.58)

am

1.48
(1.44)

N

32

32

32

R sq.

0.75

0.83

0.85

Adj. R sq.

0.74

0.81

0.83

Significance: ***p < .01; **p < .05; *p < .1

# Nombrar modelos
easytable(m1, m2, m3,
          model.names = c("A", "B", "C"),
          highlight = TRUE)

term

A

B

C

(Intercept)

37.29 ***
(1.88)

37.23 ***
(1.6)

36.15 ***
(3.1)

wt

-5.34 ***
(0.56)

-3.88 ***
(0.63)

-2.61 ***
(0.92)

hp

-0.03 ***
(0.01)

-0.02 *
(0.01)

cyl

-0.75
(0.58)

am

1.48
(1.44)

N

32

32

32

R sq.

0.75

0.83

0.85

Adj. R sq.

0.74

0.81

0.83

Significance: ***p < .01; **p < .05; *p < .1

Exportar a word


# Variables de control
easytable(m1, m2, m3,
          control.var = c("cyl", "am"),
          highlight = TRUE)

term

Model 1

Model 2

Model 3

(Intercept)

37.29 ***
(1.88)

37.23 ***
(1.6)

36.15 ***
(3.1)

wt

-5.34 ***
(0.56)

-3.88 ***
(0.63)

-2.61 ***
(0.92)

hp

-0.03 ***
(0.01)

-0.02 *
(0.01)

cyl

Y

am

Y

N

32

32

32

R sq.

0.75

0.83

0.85

Adj. R sq.

0.74

0.81

0.83

Significance: ***p < .01; **p < .05; *p < .1

# Exportar a word y csv
easytable(m1, m2, m3,
          control.var = c("cyl", "am"),
          model.names = c("A", "B", "C"),
          export.word = "tabla.docx",
          export.csv = "tabla.csv",
          highlight = TRUE)

Resumen


library(easytable)

# Modelos
m1 <- lm(mpg ~ wt, data = mtcars)
m2 <- lm(mpg ~ wt + hp, data = mtcars)
m3 <- lm(mpg ~ wt + hp + cyl + am, data = mtcars)

# Table
easytable(m1, m2, m3,
          control.var = c("cyl", "am"),
          model.names = c("A", "B", "C"),
          export.word = "tabla.docx",
          export.csv = "tabla.csv",
          highlight = TRUE)

Gracias por su atención

About Me

I am a computational social scientist examining how ideas and narratives shape political and financial systems. Alongside research, I have taught several courses on data science for social scientists and regularly share and review open-source tools.

For information more visit my personal website.

Logo