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 variables explicativas:
donde define cada uno de los datos a ajustar,
Por ejemplo, para el caso de dos variables explicativas:
Aquí
-
, es una aproximación lineal, con el intercepto con y los demás valores de son las pendientes)
-
es la distancia entre el valor y el modelo, también llamada error o residual.
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 , 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 y una variable de respuesta . El diagrama de dispersión resulta ser el siguiente:
plt.plot(x,y,'.',label='datos')
Una aproximación lineal simple seguiría el modelo:
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:
La estrategia consiste en llevar a cabo transformaciones no lineales (polinomiales o trascendentes) de la variable . En este caso, si usamos:
Obtendríamos:
De esta forma se usa el modelo lineal para encontrar los coeficientes . 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 . Ese
arreglo lo llamamos xfit
. Luego hacemos una predicción, es decir
, 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:
- Regresión Discontinua5
Bibliografía
- Python Data Science Handbook. Jake VanderPlas. O’Reilly. 2023
- R for Data Science. https://r4ds.hadley.nz/
- Representing text as data. https://uclspp.github.io/PUBL0099/seminars/seminar1.html
- Statistical Inference via Data Science. https://moderndive.com/v2/sampling.html
- Data Science for Public Policy. Chen, Rubin, Cornwall. Springer Nature Switzerland AG. 2021
- Practical Statistics for Data Science. Bruce, Bruce, Gedeck.
- Data Science from Scratch, first principles with Python. Second Edition. Joel Grus. O’Reilly. 2019.
- Microdatos DANE, Censo Nacional de Población y Vivienda 2018, Módulo Personas, Región Cundinamarca. https://microdatos.dane.gov.co/index.php/catalog/643/get-microdata
- Microdatos DANE, Censo Nacional de Población y Vivienda 2018, Diccionario de Datos. https://microdatos.dane.gov.co/index.php/catalog/643/data-dictionary/F11?file_name=PERSONAS
- Dir Datos
/home/gavox/drive/02_Docencia/15_ESAP/06_2024_s1/17_map_mcpi/03_TALLERES/TALLER_1_2024_MCPI/03_YUDY
- https://python-graph-gallery.com/density-plot/
- OpenIntro Statistics. Fourth Edition. David Diez
- Manuel Ricardo Contento Rubio. Estadística con Aplicaciones en R. Editorial UTADEO. 2010. https://www.utadeo.edu.co/es/publicacion/libro/editorial/235/estadistica-con-aplicaciones-en-r
- Sofik Handoyo, Worldwide governance indicators: Cross country data set 2012–2022, Data in Brief, Volume 51, 2023, 109814, ISSN 2352-3409, https://doi.org/10.1016/j.dib.2023.109814.
Footnotes
-
Practical Statistics for Data Science. Bruce, Bruce, Gedeck, pg. 150. y Python Data Science Handbook. Jake VanderPlas, pg. 419. ↩
-
La información sobre los diagramas de dispersión se encuentra en https://matplotlib.org/stable/gallery/mplot3d/scatter3d.html ↩
-
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 ↩
-
Python Data Science Handbook. Jake VanderPlas, pg. 422. ↩
-
La bibliografía para ésta sección es: Data Science for Public Policy. Chen, Rubin, Cornwall, pg. 165 ↩