Skip to content

Assignment/ivs 219385 #15

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: develop
Choose a base branch
from
5 changes: 3 additions & 2 deletions assignments/ivs/code/grader.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Imports
import importlib.util
import os
import sys
import traceback
import os
import importlib.util
import numpy as np

# Find student's script
def find_student_script():
Expand Down
52 changes: 52 additions & 0 deletions assignments/ivs/code/ivs-219385.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#importar paquetes
import pandas as pd
import statsmodels.api as sm
from linearmodels.iv import IV2SLS
from itertools import product

# Cargar y preparar datos
df = pd.read_csv('../data/raw.csv')
df = df[df['yob'] >= 1940]
df['cohort'] = '40-49'

# Crear dummies para año y trimestre
yob_dummies = pd.get_dummies(df['yob'], prefix='yob').astype(int)
qob_dummies = pd.get_dummies(df['qob'], prefix='qob').astype(int)
df = pd.concat([df, yob_dummies, qob_dummies], axis=1)

# Crear interacciones yob × qob (excepto _qob_4 se usará como referencia después)
yob_cols = [col for col in df.columns if col.startswith('yob_') and '_qob_' not in col]
qob_cols = [col for col in df.columns if col.startswith('qob_')]
for yob, qob in product(yob_cols, qob_cols):
df[f'{yob}_{qob}'] = (df[yob] * df[qob]).astype(int)

# Agregar constante
df['const'] = 1

# Modelo OLS (res0)
controls = [
'educ', 'race', 'married', 'smsa', 'neweng', 'midatl', 'enocent',
'wnocent', 'soatl', 'esocent', 'wsocent', 'mt'
]
yob_dummies = [col for col in df.columns if col.startswith('yob_') and '1949' not in col and 'qob_' not in col]
X = df[['const'] + controls + yob_dummies]
y = df['lwklywge']
res0 = sm.OLS(y, X).fit(cov_type='HC3')

# Modelo IV (res1)
controls_iv = [
'race', 'married', 'smsa', 'neweng', 'midatl', 'enocent',
'wnocent', 'soatl', 'esocent', 'wsocent', 'mt'
]
yob_dummies_iv = [col for col in df.columns if col.startswith('yob_') and '1949' not in col and '_qob_' not in col]
instr_cols = [col for col in df.columns if '_qob_' in col and not col.endswith('_qob_4')]

exog = df[['const'] + controls_iv + yob_dummies_iv]
endog = df['educ']
instruments = df[instr_cols]
res1 = IV2SLS(dependent=y, exog=exog, endog=endog, instruments=instruments).fit(cov_type='robust')

# sesgo
bias = True
bias_sign = '+'

48 changes: 48 additions & 0 deletions assignments/rct/code/rct-219385.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#imports
import os
import pandas as pd
import statsmodels.api as sm

# Load data
PATH = os.path.join('..', 'data', 'raw.csv')
df = pd.read_csv(PATH)

## Renombrar columnas
df.columns = ['id', 'dark', 'views', 'time', 'purchase', 'mobile', 'location']

# Mapear columnas a valores numéricos
df.replace(
to_replace={
'dark': {'A': '0', 'B': '1'},
'mobile': {'Mobile': '1', 'Desktop': '0'},
'purchase': {'No': '0', 'Yes': '1'},
'location': {'Northern Ireland': 'Ireland'}
},
inplace=True
)

# Convertir strings a enteros
df[['dark', 'mobile', 'purchase']] = df[['dark', 'mobile', 'purchase']].astype(int)

# Convertir la columna 'location' a minúsculas
df['location'] = df['location'].str.lower()

df = pd.get_dummies(
data=df,
prefix='',
prefix_sep='',
columns=['location'],
dtype=int
)

# Asignar una constante
df['const'] = 1

# Declarar modelo sin término de interacción
spec = sm.OLS(
endog=df['purchase'], # Variable dependiente
exog=df[['const', 'ireland', 'scotland', 'wales', 'dark']], # Variables explicativas sin interacción
)

# Ajustar el modelo
model = spec.fit()