Skip to content

Regresión

Published: at 12:00 AM

Table of contents

Open Table of contents

Regresión

Regresión Múltiple1

En el modelo de regresión lineal simple, tenemos sólo una variable explicativa y una variable de respuesta. En la regresión múltiple hay más de una variable explicativa. En general, si son pp variables explicativas:

yi=β0+β1x1i+β2x2i+...+βpxpi+ϵi{\color{blue}y_i} = {\color{green} \beta_0 + \beta_1 x_{1i}+ \beta_2 x_{2i} +...+ \beta_p x_{pi} } + {\color{red}\epsilon_i} donde ii define cada uno de los datos a ajustar, i=1,...,ni = 1,...,n

Por ejemplo, para el caso de dos variables explicativas:

yi=β0+β1x1i+β2x2i+ϵi, i=1,...,n{\color{blue}y_i} = {\color{green} \beta_0 + \beta_1 x_{1i}+ \beta_2 x_{2i} } + {\color{red}\epsilon_i},\ i = 1,...,n

Aquí

Si son dos variables explicativas, la aproximación lineal es un plano.

Ejemplo

Volvemos a los Worldwide Governance Indicators del Banco Mundial. Si podemos tomar como variables explicativas a : Voice and Accountability y Regulatory Quality y como variable depdendiente a Government Effectiveness, tendríamos el siguiente procedimiento.

Inicialmente cargamos las librerías y cerramos las gráficas:

import pandas as pd
from sklearn import linear_model
from sklearn.metrics import mean_squared_error
import statsmodels.api as sm
import numpy as np
import matplotlib.pyplot as plt
plt.close('all')

Ahora definimos los predictores y el modelo lineal:

predictors=['Voice and Accountability','Regulatory Quality']
outcome = 'Government Effectiveness'
lm = linear_model.LinearRegression()

Leemos los datos:

wgi_df = pd.read_excel("Worldwide Governance Indicators 2012-2022.xlsx")

La función fit hace el ajuste, toma como argumentos los nombres de las variables, predictores y de la variable objetivo.

lm.fit(wgi_df[predictors],wgi_df[outcome])

Aquí podemos generar un resumen del ajuste. Para esto usamos la librería sklearn. Primero generamos un modelo, y hacemos el ajuste. Luego imprimimos los resultados de éste proceso.

model = sm.OLS(wgi_df[outcome], wgi_df[predictors].assign(const=1))
results = model.fit()
print(results.summary())

Los resultados del análisis son:

                               OLS Regression Results                               
====================================================================================
Dep. Variable:     Government Effectiveness   R-squared:                       0.860
Model:                                  OLS   Adj. R-squared:                  0.860
Method:                       Least Squares   F-statistic:                     6093.
Date:                      jue, 10 abr 2025   Prob (F-statistic):               0.00
Time:                              13:47:39   Log-Likelihood:                -7520.6
No. Observations:                      1980   AIC:                         1.505e+04
Df Residuals:                          1977   BIC:                         1.506e+04
Df Model:                                 2                                         
Covariance Type:                  nonrobust                                         
============================================================================================
                               coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------------
Voice and Accountability     0.0332      0.014      2.392      0.017       0.006       0.060
Regulatory Quality           0.8983      0.014     65.642      0.000       0.871       0.925
const                        2.8740      0.486      5.918      0.000       1.922       3.826
==============================================================================
Omnibus:                      177.632   Durbin-Watson:                   0.341
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              363.095
Skew:                           0.576   Prob(JB):                     1.43e-79
Kurtosis:                       4.753   Cond. No.                         154.
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

Tenemos un valor de R20.860R^2 \approx 0.860, que es cercano a 1.

Para generar la gráfica cargamos la figura y generamos un eje con proyección 3D2. El comando scatter genera el diagrama de dispersión. Y el comando set_xlabel genera la etiqueta del eje x.

fig = plt.figure()
ax =  fig.add_subplot(projection='3d')
ax.scatter(wgi_df['Voice and Accountability'],wgi_df['Regulatory Quality'],wgi_df['Government Effectiveness'], marker='o')

Para generar una gráfica del plano construimos las variables que varíen en los mismos rangos de las variables. Generamos una malla con esos valores de los variables. Y procedemos a generar un plano con las constantes de ajuste del modelo lm. Generamos el plano con el comando plot_surface, y grabamos con savefig 3.

x=np.linspace(0,100,100)
y=np.linspace(0,100,100)
x, y = np.meshgrid(x, y)
plano = x * lm.coef_[0] +  y * lm.coef_[1]
ax.plot_surface(x,y,plano,alpha=0.4)
plt.show()
plt.savefig('3dfitwgi.svg')

En la interfaz de Python se puede mover la figura para mejorar la visualización.

Regresión de funciones no lineales4

En los dos casos anteriores ha habido una relación lineal entre variables explicativas y variables de respuesta. En los casos en los que la relación no es lineal se pueden usar los procedimientos de Regresión, pero es necesario primero llevar a cabo una transformación de los datos.

Veámos un ejemplo. Iniciamos cargando librerías y generando la figura.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.ion()
plt.close('all')

fig = plt.figure()
ax = plt.gca()

Aqui usted cargaría sus datos. Para este ejemplo propongo usemos los siguientes arreglos de datos:

x=[2.91915403e+00, 5.04227145e+00, 8.00623721e-04, 2.11632801e+00,
       1.02729124e+00, 6.46370163e-01, 1.30382148e+00, 2.41892509e+00,
       2.77737232e+00, 3.77171714e+00, 2.93436160e+00, 4.79653650e+00,
       1.43116575e+00, 6.14682205e+00, 1.91713152e-01, 4.69327257e+00,
       2.92113362e+00, 3.91082880e+00, 9.82708570e-01, 1.38671042e+00,
       5.60521198e+00, 6.77783103e+00, 2.19396925e+00, 4.84625831e+00,
       6.13472407e+00, 6.26224664e+00, 5.95309480e-01, 2.73383483e-01,
       1.18881294e+00, 6.14699752e+00, 6.88427837e-01, 2.94775338e+00,
       6.70522671e+00, 3.73215699e+00, 4.84313980e+00, 2.20860942e+00,
       4.80550649e+00, 5.84237970e+00, 1.28017941e-01, 5.25101020e+00,
       6.92202762e+00, 5.23715958e+00, 1.96310794e+00, 5.52495530e+00,
       7.22582046e-01, 3.13525468e+00, 6.36016852e+00, 2.05529904e+00,
       2.01442737e+00, 9.10200005e-01]

y=[ 0.15189155, -1.03060098, -0.06632399,  0.85358508,  0.74417029,
        0.62573434,  1.13055361,  0.73559223,  0.33703733, -0.67800824,
        0.13103516, -0.82721623,  0.99534825, -0.1996406 ,  0.20963249,
       -0.78979177,  0.23069347, -0.63386635,  0.86202009,  0.947879  ,
       -0.74146767,  0.4397856 ,  0.79114136, -0.93239056, -0.06401813,
        0.07217308,  0.58932376,  0.35850492,  0.85248734, -0.01048038,
        0.68661685,  0.1628184 ,  0.4584754 , -0.56438704, -0.87830134,
        0.95538153, -0.77711016, -0.56631783, -0.01674283, -0.90886333,
        0.61227017, -0.777822  ,  0.95559123, -0.88985753,  0.63070327,
        0.08913539,  0.09991667,  0.9611078 ,  0.88096628,  0.76955067]

Tenemos una variable explicativa xx y una variable de respuesta yy. El diagrama de dispersión resulta ser el siguiente:

plt.plot(x,y,'.',label='datos')

Una aproximación lineal simple seguiría el modelo:

yi^=β0+β1xi{\color{green} \hat{y_i} = \beta_0 + \beta_1 x_ i}

Pero esto correspondería a una recta, que claramente no se ajusta a los datos. Una aproximación lineal múltiple seguiría el modelo:

yi^=β0+β1x1i+β2x1i+...+βpxpi{\color{green} \hat{y_i} = \beta_0 + \beta_1 x_{1i}+ \beta_2 x_{1i} +...+ \beta_p x_{pi} }

La estrategia consiste en llevar a cabo transformaciones no lineales (polinomiales o trascendentes) de la variable xx. En este caso, si usamos:

x1=xx_1=x

x2=x2x_2=x^2

x3=x3x_3=x^3

Obtendríamos:

yi^=β0+β1xi+β2xi2+β3xi3{\color{green} \hat{y_i} = \beta_0 + \beta_1 x_{i}+ \beta_2 x_{i}^2 + \beta_3 x_{i}^3 }

yi^=β0+β1x1i+β2x2i+β3x3i{\color{green} \hat{y_i} = \beta_0 + \beta_1 x_{1i}+ \beta_2 x_{2i} + \beta_3 x_{3i} }

De esta forma se usa el modelo lineal para encontrar los coeficientes β\beta. Una forma de hacer éste proceso de manera eficiente es la siguiente. Primero cargamos librerías:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

Ahora definimos la transformación polinomial. En este caso el númro 3 indica que vamos hasta potencias al cubo.

from sklearn.pipeline import make_pipeline
poly_model = make_pipeline(PolynomialFeatures(3), LinearRegression())

Ahora hacemos el ajuste al modelo y generamos los datos de la predicción. Primero construimos un vector ordenado que tenga valores extremos (mínimo y máximo) similares a los de la variable xx. Ese arreglo lo llamamos xfit. Luego hacemos una predicción, es decir y^\color{green} \hat{y}, usando el modelo polinomial que habíamos construido. Finalmente graficamos el ajuste e imprimimos la leyenda.

xfit = np.linspace(0,7,50)
yfit = poly_model.predict(xfit[:, np.newaxis])
plt.plot(xfit,yfit,'g-',label='ajuste cúbico')
plt.legend()

Temas avanzados

En una revisión más a profundidad se pueden tratar temas como:

Bibliografía

Footnotes

  1. Practical Statistics for Data Science. Bruce, Bruce, Gedeck, pg. 150. y Python Data Science Handbook. Jake VanderPlas, pg. 419.

  2. La información sobre los diagramas de dispersión se encuentra en https://matplotlib.org/stable/gallery/mplot3d/scatter3d.html

  3. para generar un plano se sigue la información aquí https://www.tutorialspoint.com/how-to-plot-a-plane-using-some-mathematical-equation-in-matplotlib

  4. Python Data Science Handbook. Jake VanderPlas, pg. 422.

  5. La bibliografía para ésta sección es: Data Science for Public Policy. Chen, Rubin, Cornwall, pg. 165


Previous Post
Regresión, Regresión Lineal Simple
Next Post
Unir Bases