Descontínua

Em alguns programas de políticas públicas, utiliza-se um valor específico de uma variável como critério de seleção para definir quem está apto a participar. Por exemplo, na seleção de municípios para um programa de desenvolvimento urbano, são escolhidos apenas aqueles com população superior a 50 mil habitantes.

Essa situação com um limite populacional cria uma situação de descontinuidade na probabilidade de seleção, municípios com menos de 50 mil habitantes a probabilidade é 0, mas com uma população superior, é de 100%. Como solução para análises de impactos, os municipios que estão próximos a esse ponto de corte são utilizadas como grupos de tratamento e controle, partindo do príncipio que possuem semelhanças entre si.

Resumindo, regressão descontínua necessista de uma variação exógena uma variável quantitativa (running variable) gerando um cutoff e viabilizando a definição dos grupos de tratamento e controle.

De acordo com de Avaliação de Impacto,para aplicar o método de regressão descontínua, é considerar algumas condições como:

Sharp

Os casos que consideram somente um valor de corte são o mais simples, conhecidos como sharp Considerando \(Y_{i}\) um indicador de impacto para indivíduo \(i\), \(x_{i}\) como uma running variable e c como cutoff, de modo que unidades com valores acima (\(x_{i} \geq c\)) são tratadas (\(T_{i} = 1\)) e aquelas abaixo (\(x_{i} \geq c\)) não recebem tratamento. Assim, a variável binária \(T_{i}\) é uma função determinística da variável \(x_{i}\).

Define-se \(\varepsilon\) como um número positivo de valor mínimo, pois como objetivo é comparar a médias dos indicadores de impacto próximo ao ponto \(c\), é necessário intuitivamente, aproximar esse número de \(0\). A função que auxilia na representação desse cálculo é “limite de uma função. Assim, o parâmetro de interesse de regressão descontínua (\(\beta_{RD}\)) é obetido da seguinte forma:

\[\beta_{RD} = \lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c + \varepsilon] - \lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c - \varepsilon]\]

Dessa forma, o efeito de interesse é a diferença das médias do indicador de impacto entre o grupo tratado e o grupo de controle para as observações próximas do ponto \(c\), denominado de Efeito Médio Local de Tratamento (Local Average Treatment Effect, LATE).

O ponto chave é na escolha do valor \(\varepsilon\) que define a banda (\(bandwidth\)) usada para estimar o parâmero de interesse. O processo empírico de determinação dessa banda vão desde a escolha ad hoc quanto a aplicação de métodos de validação-cruzada.

Também possível a estimação do parãmetro através do Mínimos Quadrados Ordinários, sendo a variável binária \(D_{i}\). O modelo empírico assume o formato:

\[Y_{i} = \beta_{0} + \beta_{RD}D_{i} + \beta_{2}x_{i} + \beta_{3}D_{i}x_{i} + \mu_{i}\]

onde \(\mu_{i}\) é o termo aleatório. O caso sharp envolve o situação em que todos os indivíduos sujeitos a um intervenção respeitam a regra do tratamento. Pode-se simular um conjunto de dados onde a variável de corte é a renda, e estamos interessados em avaliar o efeito de um programa de assistência (ex: auxílio financeiro) em relação a essa renda.

Neste exemplo, simulamos um cenário onde estamos estudando o efeito de um programa de bolsa de estudos. Suponha que alunos com nota de exame de entrada acima de 70 recebam uma bolsa, e queremos avaliar como essa bolsa impacta a nota final dos alunos. A hipótese é que alunos com notas pouco acima e pouco abaixo do corte de 70 sejam semelhantes em habilidade, mas apenas os que pontuaram acima de 70 recebem o benefício da bolsa, o que pode influenciar suas notas finais.

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
#Setting random seed for reproducibility
np.random.seed(0)

# Generate synthetic data
n = 200  # Total number of observations
score = np.random.uniform(50, 90, n)  # Entrance exam scores between 50 and 90

# Scholarship cutoff at 70
cutoff = 70
scholarship = (score >= cutoff).astype(int)  # 1 if score >= 70, otherwise 0

# Generate outcome variable (e.g., final grade)
# The students with scholarship receive a boost of 10 points on average
grade = 50 + 0.5 * score + 10 * scholarship + np.random.normal(0, 5, n)

# Create DataFrame
data = pd.DataFrame({'score': score, 'scholarship': scholarship, 'grade': grade})

# Visualizing the data
plt.figure(figsize=(10, 6))
sns.scatterplot(x='score', y='grade', data=data, hue='scholarship', palette='cool', edgecolor=None)
plt.axvline(cutoff, color='red', linestyle='--', label='Cutoff (score=70)')
plt.xlabel('Entrance Exam Score')
plt.ylabel('Final Grade')
plt.title('Regression Discontinuity at Scholarship Cutoff')
plt.legend()
plt.show()

# Performing Regression Discontinuity Analysis
# Model: grade ~ score + scholarship + interaction term
data['score_above_cutoff'] = (data['score'] - cutoff) * data['scholarship']  # Interaction term

# Regression with statsmodels
X = sm.add_constant(data[['score', 'scholarship', 'score_above_cutoff']])
model = sm.OLS(data['grade'], X).fit()

print(model.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  grade   R-squared:                       0.810
Model:                            OLS   Adj. R-squared:                  0.807
Method:                 Least Squares   F-statistic:                     279.2
Date:                Sun, 03 Nov 2024   Prob (F-statistic):           1.72e-70
Time:                        06:48:11   Log-Likelihood:                -595.63
No. Observations:                 200   AIC:                             1199.
Df Residuals:                     196   BIC:                             1212.
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
======================================================================================
                         coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------
const                 58.2117      5.210     11.174      0.000      47.938      68.486
score                  0.3583      0.087      4.116      0.000       0.187       0.530
scholarship           11.8542      1.365      8.685      0.000       9.162      14.546
score_above_cutoff     0.0338      0.120      0.283      0.777      -0.202       0.270
==============================================================================
Omnibus:                        0.944   Durbin-Watson:                   2.210
Prob(Omnibus):                  0.624   Jarque-Bera (JB):                0.975
Skew:                           0.163   Prob(JB):                        0.614
Kurtosis:                       2.896   Cond. No.                     1.11e+03
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.11e+03. This might indicate that there are
strong multicollinearity or other numerical problems.

O resultado determina a quanto, em média, a nota final aumenta devido à bolsa para os alunos que pontuaram ligeiramente acima do corte em comparação com os que ficaram ligeiramente abaixo.

Fuzzy

Quando a aplicação do tratamento não é perfeita, ou seja, quando unidades de controle recebem o tratamento e unidades de tratamento não o recebem, o desenho de regressão descontínua na lógica fuzzy considera que a mudança na probabilidade de receber o tratamento é menor que 1, sendo o estimador assumindo um formato diferente:

\[\alpha_{RD} = \lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c + \varepsilon] - \lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c - \varepsilon]\]

Nesse caso, \(\alpha_{RD}\) é a diferença de probabilidade de tratamento entre as unidades de ambos lados do cutoff, com as observações próximo do ponto. Para obter o estimador na lógica fuzzy, dividi-se por \(\beta_{RD}\) por \(\alpha_{RD}\):

\[\delta_{RD} = \frac{\lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c + \varepsilon] - \lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c - \varepsilon]}{\lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c + \varepsilon] - \lim_{\varepsilon \to 0} E[Y_{i}|x_{i} = c - \varepsilon]} = \frac{\alpha_{RD}}{\beta_{RD}}\]

onde o parâmetro \(\delta_{RD}\) representa o LATE.

A estimação de \(\beta_{RD}\) na lógica fuzzy resulta numa interpretação importante para o desenho da política de intervenção analisada, pois calcula o Efeito de Inteção do Tratamento (ITT), o que singifica que o estimador traduz o efeito da elegilidade de tratamento.

Mantendo o cenário de um programa de bolsa de estudos onde os alunos com nota acima de 70 têm maior chance de receber uma bolsa, mas não todos recebem. Da mesma forma, alguns alunos com nota abaixo de 70 podem acabar recebendo a bolsa. A ideia é usar esse aumento de probabilidade como um “instrumento” para medir o impacto causal da bolsa na nota final dos alunos.

# Setting random seed for reproducibility
np.random.seed(0)

# Generate synthetic data
n = 200  # Total number of observations
score = np.random.uniform(50, 90, n)  # Entrance exam scores between 50 and 90
cutoff = 70  # Scholarship cutoff score

# Probability of getting scholarship: higher above the cutoff but not certain
prob_scholarship = np.where(score >= cutoff, 0.8, 0.3)
scholarship = (np.random.rand(n) < prob_scholarship).astype(int)

# Generate the outcome (final grade) with treatment effect
# Students receiving scholarship get a 10-point boost on average
grade = 50 + 0.5 * score + 10 * scholarship + np.random.normal(0, 5, n)

# Create DataFrame
data = pd.DataFrame({'score': score, 'scholarship': scholarship, 'grade': grade})
data['above_cutoff'] = (data['score'] >= cutoff).astype(int)  # Instrument variable

# Visualizing the data
plt.figure(figsize=(10, 6))
sns.scatterplot(x='score', y='grade', data=data, hue='scholarship', palette='cool', edgecolor=None)
plt.axvline(cutoff, color='red', linestyle='--', label='Cutoff (score=70)')
plt.xlabel('Entrance Exam Score')
plt.ylabel('Final Grade')
plt.title('Fuzzy Regression Discontinuity at Scholarship Cutoff')
plt.legend()
plt.show()

Nos resultados da primeira etapa, o coeficiente da variável above_cutoff mostra a relação entre cruzar o ponto de corte (ter nota >= 70) e a probabilidade de receber a bolsa. Isso representa o efeito do ponto de corte sobre a chance de obter o tratamento.

# Fuzzy RDD Analysis with Instrumental Variables (IV) Regression
# Step 1: First stage regression - predict scholarship based on cutoff
X_first_stage = sm.add_constant(data[['above_cutoff', 'score']])
first_stage_model = sm.OLS(data['scholarship'], X_first_stage).fit()
data['predicted_scholarship'] = first_stage_model.predict(X_first_stage)
print("First Stage Regression Results (Predicting Scholarship):")
print(first_stage_model.summary())
First Stage Regression Results (Predicting Scholarship):
                            OLS Regression Results                            
==============================================================================
Dep. Variable:            scholarship   R-squared:                       0.268
Model:                            OLS   Adj. R-squared:                  0.261
Method:                 Least Squares   F-statistic:                     36.15
Date:                Sun, 03 Nov 2024   Prob (F-statistic):           4.23e-14
Time:                        06:48:12   Log-Likelihood:                -111.92
No. Observations:                 200   AIC:                             229.8
Df Residuals:                     197   BIC:                             239.7
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
================================================================================
                   coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------
const            0.4196      0.319      1.316      0.190      -0.209       1.048
above_cutoff     0.5537      0.121      4.591      0.000       0.316       0.792
score           -0.0020      0.005     -0.385      0.700      -0.012       0.008
==============================================================================
Omnibus:                        3.676   Durbin-Watson:                   1.911
Prob(Omnibus):                  0.159   Jarque-Bera (JB):                2.696
Skew:                          -0.132   Prob(JB):                        0.260
Kurtosis:                       2.497   Cond. No.                         786.
==============================================================================

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

Nos resultados da segunda etapa, o coeficiente da variável predicted_scholarship representa o efeito causal estimado da bolsa na nota final. Esse é o Efeito Médio Local do Tratamento (LATE), que mede o impacto da bolsa nos alunos próximos ao ponto de corte, onde a probabilidade de receber a bolsa aumenta, mas não é garantida.

# Step 2: Second stage regression - use predicted scholarship in outcome model
X_second_stage = sm.add_constant(data[['predicted_scholarship', 'score']])
second_stage_model = sm.OLS(data['grade'], X_second_stage).fit()


print("\nSecond Stage Regression Results (Effect on Grade):")
print(second_stage_model.summary())

Second Stage Regression Results (Effect on Grade):
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  grade   R-squared:                       0.643
Model:                            OLS   Adj. R-squared:                  0.640
Method:                 Least Squares   F-statistic:                     177.6
Date:                Sun, 03 Nov 2024   Prob (F-statistic):           8.23e-45
Time:                        06:48:12   Log-Likelihood:                -648.63
No. Observations:                 200   AIC:                             1303.
Df Residuals:                     197   BIC:                             1313.
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
=========================================================================================
                            coef    std err          t      P>|t|      [0.025      0.975]
-----------------------------------------------------------------------------------------
const                    47.4505      3.674     12.915      0.000      40.205      54.696
predicted_scholarship    10.2674      3.189      3.220      0.001       3.979      16.555
score                     0.5268      0.072      7.314      0.000       0.385       0.669
==============================================================================
Omnibus:                        5.378   Durbin-Watson:                   2.066
Prob(Omnibus):                  0.068   Jarque-Bera (JB):                5.186
Skew:                          -0.305   Prob(JB):                       0.0748
Kurtosis:                       3.501   Cond. No.                         714.
==============================================================================

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

Sobre a validade da regressão descontínua

Um ponto importante para a utilização da regressão descontínua

A regressão descontínua é muito útil quando existe um ponto de corte conhecida em uma variável contínua e que não se deveria observar descontinuidade do indicador caso não houvesse a intervençao.

Os componentes principais são:

  • Variável Corte: a regra ou ponto específico em um variável que determina a atribuição ao tratamento

  • Variável Running: variável contínua usada para determinar a elegibilidade para o tratamento

  • Descontinuidade: ponto onde há uma mudança abrupta na probabalidade de receber o tratamento.

As vantagens desse modelos é o fonercimento de estimativas causais robustar sem a necessidade de randomização explícita e aplicabilidade em diversas áreas. Entretanto, o efeito causal causal apenas os indivíduos próxioms ao ponto de corte, limitando a generalização e uma definição clara da regra de corte.

Para avaliar o modelo, é importante utilizar alguns métodos que possam avaliar a validade do modelo. Testes de robustez são alternativa que procurar demonstar estabilidade do valor coeficiente estimado. Uma possibilidade inicial é a utilização de polínômios com runinng variable além do método de primeiro grau. Regressões não-parammétricas podem modificar o peso atribuído às unidades observacionais de acordo a distância e frequância em relação ao cutoff.

Também é póssível a utilização de diferentes bandwidths de estimação, pois apesar da busca da melhor banda, é esperado que não ocorra alterações grandes no valor dos coeficientes obtidos. O cuidado necessário neste tipo de avaliaçao é a quantidade de elementos utilizados para análise, pois com redução da banda, espera-se que ocorra redução na quantidade de unidades para avaliação.

Resumindo

A regressão descontínua (RD) é uma metodologia de avaliação causal importante por sua capacidade de identificar efeitos de tratamento de forma robusta, especialmente quando há uma regra clara de elegibilidade baseada em um ponto de corte de uma variável contínua. Ao comparar indivíduos próximos ao limite, mas em lados opostos, a RD explora variações quase experimentais para estimar o impacto da intervenção. No entanto, a validade das estimativas depende da escolha adequada da janela de análise e da suposição de que, exceto pela intervenção, os grupos próximos ao ponto de corte são comparáveis. Assim, a regressão descontínua é uma ferramenta útil e precisa, mas exige cuidados para garantir a confiabilidade dos resultados.

Referências

Avaliação de Impacto na Prática Segunda edição.

Avaliação de impacto das políticas de saúde: um guia para o SUS [recurso eletrônico] / Ministério da Saúde, Secretaria de Ciência, Tecnologia, Inovação e Complexo da Saúde, Departamento de Ciência e Tecnologia. – Brasília: Ministério da Saúde, 2023.