Saltar al contenido
Inferencia Causal con Python y Causal ML

Estimación del Efecto Causal con Propensity Score Matching.

Introducción

La inferencia causal es el proceso de descubrir las relaciones de causa y efecto entre variables en un sistema. En la mayoría de las situaciones, no es posible llevar a cabo un experimento controlado para establecer la causalidad. En cambio, los científicos usan métodos de datos para identificar el efecto causal de una variable en otra.

Uno de estos métodos es el Propensity Score Matching (PSM), que es una técnica que permite comparar individuos o grupos similares entre sí para estimar el efecto causal de una intervención o tratamiento. En concreto, el PSM busca crear grupos de individuos que sean parecidos en cuanto a sus características antes de la intervención o tratamiento. De esta forma, se reduce el sesgo y se puede calcular cuánto más eficaz es el tratamiento en comparación con el grupo de control.

Python y Causal ML son herramientas que pueden ser utilizadas para implementar PSM y otros métodos de inferencia causal. A través de estos lenguajes de programación y librerías, los científicos pueden analizar grandes conjuntos de datos de manera eficiente y precisa.

En conclusión, la estimación del efecto causal es una tarea compleja pero crucial para entender cómo las variables afectan a un sistema y, por medio del PSM, podemos realizar una investigación más precisa de las relaciones de causa y efecto.

Resumen

La estimación del efecto causal es una de las aplicaciones más populares de la inferencia causal. El objetivo de esta técnica es estimar el efecto causal de una variable independiente sobre una variable dependiente. Para ello, se utiliza una serie de métodos que permiten controlar los efectos de otras variables que podrían estar relacionadas con la variable dependiente.

Uno de estos métodos es el Propensity Score Matching. El Propensity Score Matching es una técnica que se usa para estimar el efecto causal de una variable independiente en una variable dependiente al formar grupos en los que los participantes tienen el mismo score de probabilidad o propensión de haber recibido el tratamiento. En otras palabras, se busca crear grupos de observaciones con características similares para controlar otros factores que podrían afectar la relación entre la variable independiente y la variable dependiente. Esto permite comparar los resultados entre los grupos tratado y no tratado y estimar el efecto causal con mayor precisión.

En la práctica, el proceso completo de Propensity Score Matching se divide en dos fases:

  1. Estimación del Propensity Score: En esta fase, se utiliza un modelo de regresión logística para estimar el score de probabilidad o propensión de haber recibido el tratamiento.

  2. Matching: En esta fase, se seleccionan individuos que tengan propensión similar y se comparan los resultados entre los grupos.

Una vez que se han formado los grupos, se utiliza una técnica estadística llamada “Diferencia en la Diferencia” para comparar la media de la variable dependiente entre el grupo tratado y el grupo no tratado. Esta técnica permite estimar el efecto causal de la variable independiente en la variable dependiente con mayor precisión y controlar otros factores que podrían estar involucrados.

En resumen, el Propensity Score Matching es una técnica muy poderosa y efectiva para estimar el efecto causal de una variable independiente en una variable dependiente. Sin embargo, es importante recordar que esta técnica supone que se cumplen ciertos supuestos, como la aleatorización y la ignorabilidad de la relación entre los grupos. Por lo tanto, es importante tener precaución al utilizar esta técnica, especialmente en situaciones en las que no se cumplan estos supuestos, y tener en cuenta otras técnicas de inferencia causal disponibles para estimar el efecto causal con mayor precisión.

Aplicación teórica

Imaginemos que estamos interesados en evaluar el efecto causal de un programa de mentoría sobre el rendimiento académico de un grupo de estudiantes universitarios. Los estudiantes fueron asignados aleatoriamente ya sea al grupo de mentoría o al grupo de control, pero algunos estudiantes se negaron a participar en el programa de mentoría y otros fueron excluidos por elegibilidad. Dado que tenemos una muestra sesgada, podemos utilizar el método de Propensity Score Matching para estimar el efecto causal.

Primero, podemos usar la regresión logística para estimar la probabilidad de participar en el programa de mentoría (propensity score) utilizando variables como el nivel socioeconómico, el género, la raza, el nivel de ingresos y el GPA previo. Luego, podemos utilizar el método de emparejamiento basado en propensity score para emparejar a los participantes en el grupo de control con los participantes en el grupo de mentoría que tienen un score similar de propensity.

Finalmente, podemos estimar el efecto causal del programa en el rendimiento académico usando una técnica como el Difference-in-differences (diferencias en diferencias) para comparar la diferencia en el rendimiento académico entre los dos grupos antes y después de la iniciación del programa de mentoría.

En resumen, el Propensity Score Matching es una técnica valiosa para estimar el efecto causal en situaciones donde la asignación no es completamente aleatoria, permitiendo una mejor inferencia causal. Este enfoque nos permite controlar el sesgo y obtener estimaciones más precisas del impacto del programa de mentoría en el rendimiento académico de los estudiantes.

Aplicación práctica

Estimación del efecto causal con Propensity Score Matching en Python

Supongamos que queremos estimar el efecto causal del tratamiento en el tiempo de recuperación de una enfermedad. Contamos con una muestra de pacientes que recibieron el tratamiento (grupo de tratamiento) y una muestra de pacientes que no lo recibieron (grupo de control). Para realizar el Propensity Score Matching, primero debemos estimar el propensity score, que es la probabilidad de que un individuo haya sido asignado al grupo de tratamiento en función de sus características observables. Definimos las variables de nuestro modelo, en este caso, tiempo de recuperación y variable de tratamiento:


import pandas as pd
import statsmodels.api as sm

data = pd.read_csv('datos_enfermos.csv')
X = data[['edad', 'sexo', 'indice_de_masas_corporal', 'enfermedad_previa']]
y = data['tiempo_de_recuperacion']
tratamiento = data['tratamiento']

Con esto estimamos el propensity score con una regresión logística:


modelo_logistico = sm.Logit(tratamiento, X)
propensity_scores = modelo_logistico.fit(disp=0).predict(X)

Posteriormente, realizamos el Propensity Score Matching, que consiste en encontrar los individuos del grupo de control que tengan similar propensity score a los del grupo de tratamiento:


from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import cdist

def Match(groups, propensity_scores, caliper=0.05):
    '''Implementación del Propensity Score Matching '''
    # divide los grupos
    treatment = groups[0]
    control = groups[1]
    # calcula la distancia entre los propensity scores
    distancias = cdist(treatment.reshape(-1, 1), control.reshape(-1, 1)).diagonal()
    # encuentra los matches cercanos
    indices = np.argsort(distancias)
    tratados_seleccionados = []
    control_seleccionado = []
    for indice in indices:
        if distancias[indice] > caliper:
            break
        if indices[indice] in control_seleccionado:
            continue
        tratados_seleccionados.append(indice)
        control_seleccionado.append(indices[indice])
    match_propensity = propensity_scores[control_seleccionado]
    return tratados_seleccionados, control_seleccionado, match_propensity

indices_tratamiento, indices_control, match_propensity_scores = Match([tratamiento, ~tratamiento], propensity_scores)

Una vez que tenemos los individuos de los grupos de tratamiento y control que están emparejados, podemos utilizar un modelo de regresión para estimar el efecto causal del tratamiento en el tiempo de recuperación. Aquí utilizaremos una simple regresión de mínimos cuadrados:


import statsmodels.formula.api as smf

# combinamos los datos de los individuos emparejados
datos_matching = pd.concat([X.iloc[indices_tratamiento], X.iloc[indices_control]])
datos_matching['tratamiento'] = tratamiento.iloc[indices_tratamiento + indices_control].to_numpy()
datos_matching['tiempo_de_recuperacion'] = y.iloc[indices_tratamiento + indices_control].to_numpy()
# ajustamos un modelo de regresión de mínimos cuadrados
modelo_matching = smf.ols('tiempo_de_recuperacion ~ tratamiento', data=datos_matching).fit()
print(modelo_matching.summary())

La salida del modelo nos dará la estimación del efecto causal del tratamiento en el tiempo de recuperación, junto con los intervalos de confianza correspondientes. De esta manera, podemos concluir si el tratamiento tiene un efecto causal significativo en el tiempo de recuperación de la enfermedad.