Escore de Propensão
Em inferência causal distinguimos dois cenários: estudos experimentais, nos quais o pesquisador controla o mecanismo de atribuição - por exemplo, usando RCT - e conhece as probabilidades de receber o tratamento; e estudos observacionais, nos quais a alocação não é controlada e pode haver vieses por confusão. Em estudos observacionais precisamos, de certa forma, “simular” a randomização para reduzir vieses decorrentes de diferenças nas covariáveis pré‑tratamento entre tratados e controles.
A definição formal é:
Onde
Ao condicionarmos nas covariáveis, o escore de propensão controla as variáveis de confusão, ajudando a alcançarmos a independência condicional — o tratamento
- Viés de Seleção: Pessoas que escolhem receber um tratamento são fundamentalmente diferentes daquelas que não o recebem.
- Exemplo: Indivíduos mais saudáveis ou mais ricos podem ter maior acesso ou propensão a um novo medicamento.
- Noncompliance: Mesmo em ensaios clínicos, se houver falta de adesão total ao tratamento, o efeito causal (como o ATE ou ATT) calculado diretamente pode estar enviesado, comprometendo os resultados e sua interpretabilidade.
O conceito do Escore de Propensão é estritamente aplicado a tratamentos binários (discretizados ou dicotômicos: Sim/Não). Para tratamentos contínuos, um método utilizado é o Generalized Propensity Score (GPS), aonde modela envolta a densidade condicional, ao invés da probabilidade condicional.
Importante destacar, que ainda sim, precisamos que as premissas de ignorabilidade, positividade e SUTVA devem ser respeitadas antes de aplicar. Relembrando que comentei sobre esse tema em 5. Design de Experimentos.
Para utilizarmos o score de propensão, basta regredirmos a intervenção com suas covariáveis em modelo probabilístico, como a regressão logística. Seu resultado, final, seria a probabilidade de uma unidade receber o tratamento condicional dado às covariáveis pré‑tratamento
Exemplo (Causal Inference in Python: Applying Causal Inference in the Tech Industry)
import statsmodels.formula.api as smf
# 1. Estimar o Escore de Propensão
ps_model = smf.logit("""intervention ~
tenure + last_engagement_score + department_score
+ C(n_of_reports) + C(gender) + C(role)""", data=df).fit(disp=0)
# 2. Adicionar o Escore de Propensão como nova coluna
data_ps = df.assign(
propensity_score = ps_model.predict(df),
)
data_ps[["intervention", "engagement_score", "propensity_score"]].head()
# 3. Estimar o Efeito Causal usando o Escore de Propensão como covariável
model = smf.ols("engagement_score ~ intervention + propensity_score",
data=data_ps).fit()
# O coeficiente 'intervention' neste modelo representa o ATE ajustado pelo escore de propensão
print("ATE Ajustado por Escore de Propensão:", model.params["intervention"])
Ponderação por Escore de Propensão Inverso
Uma vez tendo esse score, podemos estimar o efeito médio de tratamento. Uma das formas que podemos é por Ponderação por Score de Propensão Inverso (IPW).
A ideia de IPW é reponderar a sua amostra para criar uma pseudo-população onde a distribuição das variáveis de confusão
Unidades Incomuns (Alto Peso):
- Unidades que receberam um tratamento improvável (e.g., alto risco de rotatividade, mas não receberam o treino) recebem um peso alto.
- Isso os torna mais representativos da população em geral, essencialmente forçando um balanceamento da amostra.
Unidades Comuns (Baixo Peso):
- Unidades que receberam um tratamento provável recebem um peso baixo.
O peso para cada unidade
Ao dar um peso alto a unidades tratadas que parecem unidades de controle, e unidades de controle que parecem unidades tratadas, o método garante que o grupo de tratamento e o grupo de controle na pseudo-população sejam comparáveis.
Exemplos (Causal Inference in Python: Applying Causal Inference in the Tech Industry)
# 1. Calcular os pesos IPW para cada grupo
weight_t = 1 / data_ps.query("intervention == 1")["propensity_score"]
weight_nt = 1 / (1 - data_ps.query("intervention == 0")["propensity_score"])
# 2. Obter os resultados (engagement_score) por grupo
t1 = data_ps.query("intervention == 1")["engagement_score"]
t0 = data_ps.query("intervention == 0")["engagement_score"]
# 3. Estimar o Resultado Potencial Médio (E[Y^t])
y1_num = sum(t1 * weight_t) # Numerador: Somatório (Y * W) para T=1
y1_den = sum(weight_t) # Denominador: Somatório (W) para T=1
y1 = y1_num / y1_den
y0_num = sum(t0 * weight_nt) # Numerador: Somatório (Y * W) para T=0
y0_den = sum(weight_nt) # Denominador: Somatório (W) para T=0
y0 = y0_num / y0_den
print("E[Y1] (Tratado):", y1)
print("E[Y0] (Controle):", y0)
print("ATE:", y1 - y0)
Estimador Duplamente Robusto
O Escore de Propensão
Entretanto, uma preocupação comum em inferência causal é a especificação incorreta dos modelos. E se o modelo que usamos para calcular o Escore de Propensão estiver errado? Isso nos leva à busca por estimadores mais resilientes.
O Conceito "Duplamente Robusto"
Um estimador é considerado Duplamente Robusto (Double Robust - DR) se a estimativa do efeito causal for consistente (ou seja, convergirá para o verdadeiro efeito causal) se:
- O modelo para o Escore de Propensão estiver corretamente especificado.
OU - O modelo para o outcome potencial que estima estiver corretamente especificado.
Em outras palavras, o estimador DR converge para o modelo que estiver correto. Isso confere uma vantagem e aumenta a confiança na estimativa final, pois você só precisa acertar em um dos dois modelos. A ideia central é que o estimador utiliza ambos os modelos - por exemplo, IPW + Regressão Logística - para construir um estimador para o resultado potencial.
Um estimador DR popular para o resultado potencial médio sob tratamento pode ser escrito como:
Onde:
é o resultado observado. é a variável de tratamento. é a previsão do resultado pelo modelo, assumindo o tratamento é o Escore de Propensão.
Se o Escore de Propensão estiver correto:
O termo
Isto deixa apenas o primeiro termo,
Se o modelo estiver correto:
O segundo termo,
A estimativa DR converge para um estimador outcome-based que se baseia primariamente no modelo.