Regressão Linear

Leitura Recomendada

O modelo de regressão linear é a ferramenta mais tradicional para estimarmos impactos de tratamento. Estruturalmente, ela é uma comparação entre médias, estimando como o valor médio da variável dependente muda conforme alteramos os valores das variáveis independentes. Isso faz com que consigamos estimar efeitos médios por ela, assim como controlar variáveis condicionais e relações complexas. Como utilizamos Mínimos Quadrados Ordinários (MQO), estimamos parâmetros que, sob as suposições corretas de identificação, possuem uma interpretação causal direta. Considerando uma relação linear simples YX+ε, estimamos o efeito de X sobre Y através dos coeficientes β^0 e β^1.

Análise entre médias de diferentes grupos

Em cenários com diferentes grupos, isto é, subpopulações, se formos analisar a mão, avaliaríamos o efeito do tratamento de forma ponderada, ou seja, tirando a média pelo tamanho da amostra de cada uma. Entretanto, se formos utilizar a regressão linear com o mesmo objetivo, a ponderação acontece de forma diferente: os grupos são avaliados pela variância de valores entre eles.

A intuição é que o modelo busca extrair o máximo de informação possível: grupos onde a variável apresenta maior dispersão (em dummies, quando a proporção de tratados e controles é mais equilibrada) oferecem mais "contraste" para o estimador, recebendo, portanto, maior peso na composição do coeficiente final.

Em casos como esse, de tratamentos categóricos com efeitos heterogêneos - diferentes efeitos para diferentes grupos - isso significa que o β estimado será mais influenciado pelos grupos onde o tratamento varia mais, o que gera uma divergência entre o coeficiente da regressão e o ATE puramente populacional.

1. O Intercepto (β^0)

O coeficiente β^0 representa o valor esperado de Y quando X=0 (assumindo que todas as outras covariáveis do modelo também sejam zero).

Interpretação em Experimentos

Em estudos com grupos de Controle e Tratamento (onde X é uma dummy indicando o tratamento), β^0 representa a média do grupo de controle. Consequentemente, β^1 captura a diferença média entre os grupos (efeito do tratamento).

2. O Coeficiente de Interesse (β^1)

O coeficiente β^1 isola a variação média esperada em Y dada uma alteração em X, mantendo constantes as demais variáveis do modelo (ceteris paribus). A interpretação varia conforme a natureza de X:

Variáveis Categóricas e Dummies

Para utilizar dados categóricos (strings ou categorias numéricas) em uma regressão, é necessário transformá-los em variáveis binárias (Dummies).

  • Implementação:

  • Pandas: Utilize pd.get_dummies(df, columns=['Var'], drop_first=True).

    • Statsmodels: Na fórmula, basta envolver a variável com C(): outcome ~ C(Variavel).
  • Atenção (Armadilha da Dummy): Para uma variável com N categorias, devemos criar apenas N1 colunas de dummies. Se incluirmos todas as N colunas junto com o intercepto, criamos multicolinearidade perfeita (redundância).

  • Interpretação: A categoria omitida torna-se a Categoria de Referência. Os coeficientes das outras dummies representam a diferença média em relação a essa categoria base (quando todas as dummies são 0).

3. Termo de Interação

Muitas vezes, a suposição de que o efeito de X sobre Y é constante para todos é muito forte. Para capturar como o efeito varia dependendo de uma terceira variável Z, incluímos um termo de interação (produto) no modelo:

Y=β0+β1X+β2Z+β3(XZ)+ε

Neste modelo, o efeito de X sobre Y não é mais apenas β1. O efeito marginal de X passa a depender do valor de Z:

ΔYΔX=β1+β3Z

A interpretação dos coeficientes muda:

Lembrete

Ao incluir uma interação XZ, sempre inclua as variáveis originais X e Z no modelo separadamente. Omitir β1 ou β2 força o intercepto ou a inclinação a passar pela origem de forma artificial, enviesando a estimativa da interação.

O Trade-off entre Viés e Variância

Leitura Recomendada

Causal Inference in Python: Applying Causal Inference — Part II, Cap. Frisch-Waugh-Lovell Theorem and Orthogonalization, pág. 106

Condicionar covariáveis irrelevantes ou em excesso no modelo pode introduzir um risco: o aumento da variância do estimador de β^1.

O aumento na variância ocorre frequentemente devido à multicolinearidade e significa que as estimativas de β^1 serão menos precisas. Isso resulta em intervalos de confiança mais amplo, tornando mais difícil rejeitar a hipótese nula e obter um resultado estatisticamente significativo.

Teorema Frisch‑Waugh‑Lovell

Outra forma de observamos isso, é entendermos melhor o funcionamento do teorema Teorema Frisch-Waugh-Lovell (FWL).

Ele demonstra que o coeficiente de X em uma regressão múltipla Y ~ X + Z é igual ao coeficiente obtido ao regressar os resíduos de Y sobre Z nos resíduos de X sobre Z. Em termos práticos, isso significa que a contribuição de cada regressora pode ser entendida como a associação entre as partes de Y e X que não são explicadas por Z. Isto pode ser dividido em três etapas

  1. Desviesamento (Debiasing Step)
    • Remover o viés das variáveis de controle Z da sua variável de interesse X.
    • Regredimos a variável de tratamento X nas covariáveis de controle Z, (ex: XZ)
    • Coletamos os resíduos dessa regressão X~. Estes resíduos representam a parte de X que é ortogonal (não correlacionada) aos controles Z.
  2. Remoção de Ruído (Denoising Step)
    • Remover o ruído das variáveis de controle Z da sua variável dependente Y.
    • Regredimos a variável dependente Y nas mesmas covariáveis de controle Z, (ex: YZ)
    • Coletamos os resíduos dessa regressão Y~. Estes resíduos representam a parte de Y que é independente dos controles Z.
  3. Regressão Final
    • A estimativa final do efeito causal β^1 é obtida regredindo o resíduo da variável dependente no resíduo da variável de tratamento: Y~X~.
    • O β^ obtido nesta regressão de resíduos é idêntico ao β^1 da regressão original YX+Z.

Para ver exemplos via código, é só acessar aqui.

Lembrete

A regressão linear assume que a relação entre as regressoras e o resultado (condicional) é linear. Se a relação verdadeira for não linear, a especificação linear pode provocar viés de especificação. É importante verificar se isso ocorre, especialmente entre a variável de tratamento e o desfecho; caso ocorra, podemos aplicar transformações adequadas, por exemplo: logaritmos, termos polinomiais, interações ou transformações multiplicativas.

Regressão Linear como Modelo para Potenciais Outcome

Outra possibilidade de utilizar a regressão linear, é atuar como um modelo de imputação de potenciais resultados. Isto quer dizer que conseguimos estimar os efeitos causais, seja ATE ou ATT, preechendo valores contrafactuais.
A lógica reside na capacidade da regressão de modelar as funções de resultado potencial:E[Y0|X] e E[Y1|X].

Efeito de Tratamento Médio (ATE)

Lembrete

O ATE é calculado como a diferença média entre o que toda a população teria se fosse tratada E^[Y1|Xi] e o que toda a população teria se não fosse tratada E^[Y0|Xi]

  • ATE=1Ni(E^[Y1|Xi]E^[Y0|Xi])

Onde E^[Y0|Xi] e E^[Y1|Xi] são modelos de regressão ajustados, respectivamente, nas unidades de controle T=0 e nas unidades tratadas T=1.

Cálculo Simplificado com statsmodels

Em um modelo de regressão linear que inclui covariáveis X, o estimador do ATE é equivalente ao coeficiente da variável de tratamento D.

Se o seu modelo é Y=β0+β1D+β2X+ϵ, a estimativa de β^1 é o ATE.

Python

formula_ate = 'Y ~ D + X1 + X2'
model_ate = smf.ols(formula_ate, data=data).fit()
ate_estimate = model_ate.params['D']

Efeito Médio de Tratamento nos Tratados (ATT)

Lembrete

O ATT é a diferença média entre o resultado observado para o grupo tratado Yi e o seu resultado contrafactual imputado E^[Y0|Xi]
ATT=1N1i:Di=1(YiE^[Y0|Xi])
Isto significa que usamos o grupo de controle D=0 para construir o modelo que prevê o resultado potencial Y0.

Cálculo Simplificado com statsmodels

model_mu0 = smf.ols('Y ~ X1 + X2', data=data[data['D'] == 0]).fit()
imputed_y0 = model_mu0.predict(data[data['D'] == 1]) # Imputar o contrafactual, isto é, usar model_mu0 para prever o Y_0 para as unidades do grupo tratado T=1. 
att_estimate = (data[data['D'] == 1]['Y'] - imputed_y0).mean()