El objetivo: minimizar los errores al cuadrado
Asumimos que el error es una variable aleatoria con distribución normal
La ecuación de arriba se lee como que $\varepsilon$ se distribuye normalmente con una media $0$ y desviación estándar constante. Si esto es verdad, entonces el valor esperado de $\varepsilon$ es $0$ y los valores por encima de la línea cancelan a los valores por abajo de ella. Por este motivo, no podemos tener como objetivo minimizar la suma de los errores.
Un truco es elevar los errores al cuadrado y así buscar la línea que los minimice. Si tomamos la ecuación inicial y despejamos $\varepsilon_i$ tenemos
Entonces nuestro objetivo es minimizar la suma de todos los errores al cuadrado, o bien
Este es un problema clásico de optimización. Hay varios métodos para resolverlo, pero el más ilustrativo es usar las condiciones de primer orden. Para esto, el primer paso es combinar las dos ecuaciones de arriba para obtener
Ahora sólo tenemos que igualar la primera derivada con respecto a cada uno de los parámetros con cero. Haciendo esto, obtenemos dos ecuaciones, una para $\beta_0$ y otra para $\beta_1$, que son las ecuaciones normales.
Estas ecuaciones son sistemas lineales de ecuaciones que se pueden resolver mediante diversos métodos, como la eliminación gaussiana o la inversión de matrices. Una vez resueltas estas ecuaciones, obtendremos los valores óptimos de los parámetros $\beta_0$ y $\beta_1$ que minimizan la suma de los errores al cuadrado.
y
Donde $\bar x$ y $\bar y$ representan la media de las respectivas columnas.
¿Es verdad que este es el cálculo? Veamos con un ejemplo de una simulación en python. En primer lugar generamos una base de datos en pandas con los parámetros que nosotros deseamos y generamos el numerador y el denominador que usaremos para calcular $\hat\beta_1$.
import pandas as pd
import numpy as np
n = 1000
np.random.seed()
df = pd.DataFrame({'x': np.random.normal(0,1,n)})
df['y'] = 1.5 + 2 * df['x'] + np.random.normal(0,1,n)
df['xi - barx'] = df['x'] - df['x'].mean()
df['yi - bary'] = df['y'] - df['y'].mean()
df['(xi-barx)(yi-bary)'] = df['xi - barx'] * df['yi - bary']
df['(xi - barx)^2'] = df['xi - barx']**2
print(df)
Ahora sólo queda calcular los parámetros
beta1 = df['(xi-barx)(yi-bary)'].sum()/df['(xi - barx)^2'].sum()
beta0 = df['y'].mean() - beta1 * df['x'].mean()
print(beta1)
# 2.0321031515496335
print(beta0)
# 1.4751020302599238
Las estimaciones que nos generan estos cálculos son muy cercanos al número real que generamos por métodos de simulación. Puedes jugar con los números que se generan al definir df['y']
y generar nuevos valores de la regresión.
Cómo se usa la regresión para cerrar puertas traseras
Una de las razones que hacen más atractiva a la regresión es lo fácil que hace enfrentar a los problemas de selección. Siempre que nos enfrentamos a la situación en que una variable $X$ causa tanto $D$ como $Y$, basta incluir la variable en la regresión para solucionar el problema.
A este proceso se le llama controlar y las variables que se incluyen con esta intención se llaman variables de control. Entonces una regresión de
ya registra el efecto de $D$ en $Y$ considerando a $X$. También se puede decir que se deja a $X$ constante y que la regresión controla $X$.
Un ejemplo podría ser el estudio del impacto del ingreso familiar y la educación de los padres en el rendimiento académico de los estudiantes. Supongamos que queremos medir el impacto del ingreso familiar en el rendimiento académico de los estudiantes y controlar el efecto de la educación de sus padres. Podemos utilizar la regresión lineal para modelar el rendimiento académico (Y) en función del ingreso familiar (X) y la educación de los padres(D).
import pandas as pd
import statsmodels.formula.api as smf
# Crear un ejemplo de datos
df = pd.DataFrame({'Rendimiento': [80, 85, 90, 95, 100],
'Ingreso': [50000, 60000, 70000, 80000, 90000],
'Educacion': ['Primaria', 'Secundaria', 'Bachillerato', 'Licenciatura', 'Maestria']})
# Crear la regresión
model1 = smf.ols(formula='Rendimiento ~ Ingreso + Educacion', data=df)
model2 = smf.ols(formula='Rendimiento ~ Ingreso', data=df)
# Ajustar el modelo y ver los resultados
results1 = model1.fit()
results2 = model2.fit()
print(results1.summary())
print(results2.summary())
Los resultados de estas dos regresiones son muy reveladores. En primer lugar, nota que la variable educación genera muchos coeficientes. Este aspecto lo vamos a tocar más a fondo más adelante, pero de momento observa cómo el coeficiente de los ingresos cambia cuando se incluye la educación. ¿Por qué sucede esto?
Read Marionomics: Economía y Ciencia de Datos in the Substack appAvailable for iOS and AndroidGet the app
En este modelo la educación nos sirve como una variable de control. La regresión que no la incluye podría estar mostrando un efecto interesante, pero incompleto. Es sólo cuando incluimos a la educación de los padres cuando podemos identificar el efecto real que genera el ingreso. Libre de sesgos.
En el siguiente post veremos una guía para hacer regresiones, para verificas sus supuestos y para interpretar el resultado que nos arrojan la mayoría de los softwares estadísticos.