Path: blob/main/Trabajo_grupal/WG4/Grupo_9_spyderv2.py
2714 views
# -*- coding: utf-8 -*-1"""2Created on Wed Sep 21 17:03:33 202234@author: JCarlosHPCorei35"""67import pandas as pd8import numpy as np9import pyreadr10import os # for usernanme y set direcotrio1112user = os.getlogin() # Username13os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4")14cps2012_env = pyreadr.read_r("../data/cps2012.RData")15type(cps2012_env) #diccionario16cps2012 = cps2012_env['data'] #se puede leer en dataframe ahora1718#Limpieza de base19cps2012.drop(['year'], axis=1, inplace = True ) #dropear columna de año 2012 para todos los valores20cps2012['married'] = cps2012['married'].astype('int') #convertir bool en enteros21cps2012['ne'] = cps2012['ne'].astype('int')22cps2012['sc'] = cps2012['sc'].astype('int')23cps2012=cps2012.head(2000)2425#Se pide mostrar DataFrame de variables explicativas26X = cps2012.iloc[ : , 1: ]2728#Se pide lista de valores para seleccionar 'x' de la Dataframe de variables explicativas29lista = [ 1, 5, 17,20] #lista con valores de 0-203031#Se pide el vector de la variable Y32y = cps2012.iloc[:, 0]33y3435class RegClass( object ): # == RegClass():3637def __init__( self, X : pd.DataFrame , y : pd.Series , lista: list, robust = True ):3839if not isinstance( X, pd.DataFrame ):40raise TypeError( "X must be a pd.DataFrame." )4142if not isinstance( y , pd.Series ):43raise TypeError( "y must be a pd.Series." )4445# asignando los cuatro atributos de la clase:46self.X = X47self.y = y48self.lista = lista49self.robust = robust5051# agregar columna de unos en self.X:52self.X[ 'Intercept' ] = 1 #agrega columnas de puros 1s con nombre de intercepto53cols = self.X.columns.tolist() #sale las etiquetas54new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] #hace que intercepto salga 1ero55# cols[ -1 ]: la última, sale "Intercept", cols[ 0:-1 ]: son todas las etiquetas, menos la ultima56self.X = self.X.loc[ : , new_cols_orders ] #ahora sí con todos los datos, intercepto 1ero575859# agregar variables de x seleccionadas, y y nombres de x60self.X_np=self.X.iloc[:,lista].values #creo q' son todas las filas y valores del # de columnas especificadas de la lista61self.y_np=y.values.reshape(-1,1) #lo hizo vector62self.columns=self.X.iloc[:,lista].columns.tolist() #sale ['exp3', 'ne', 'ad', 'we']-->sera el nombre de columnas6364def reg_beta_OLS( self ):6566# reasignar nombres a atributos67X_np=self.X_np68y_np=self.y_np6970# beta_ols71beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np ) #sale en vector72self.beta_ols=beta_ols7374# columnas de X75index_names = self.columns7677# Output78beta_OLS_output = pd.DataFrame( beta_ols , index = index_names , columns = [ 'Coef.' ] ) #p/ q' ahora salga en tabla, el nombre de la columan es coef7980# agregar Dataframe de coeficientes como atributo81self.beta_OLS_output = beta_OLS_output8283return beta_OLS_output8485def var_standar(self):8687#llamar método anterior88self.reg_beta_OLS()8990#reasignar nombres a atributos del método anterior91X_np = self.X_np92y_np = self.y_np93beta_OLS = self.beta_OLS_output.values.reshape(- 1, 1) # convierte dataframe en vector9495#### Operaciones ####96e = y_np - ( X_np @ beta_OLS ) # vector de errores: error_i = Y_i - Y_estimado_i97self.e=e9899N = X.shape[ 0 ] # numero de filas100k = X.shape[ 1 ] # numero de columnas101ee=(e.T @ e)[ 0 ] # sumatoria e^2 ... q' es [0]? si lo quitas, es vector, si pones 1 no sale102self.ee=ee103error_var = (ee)/( N - k ) # s^2= e^2/(n-k)...sale vector de 1 valor104105### 1. matriz de varianza y cov estándar ###106var_OLS = error_var*np.linalg.inv( X_np.T @ X_np ) # var_OLS(betas) = s^2 * (X'X)-1....sale vector 4x4 creo107108### 2. error estandar de cada coeficiente ###109sd = np.sqrt( np.diag(var_OLS) ) # desv(betas)=diagonal_var(betas)^(1/2)... np.diag toma la diagonal de la matriz110self.sd=sd111112### 3. intervalos de confianza ###, salen en vectores113superior= beta_OLS.ravel() + 1.96 * sd #ravel() lo volvio vector (de 1x4)114self.superior=superior115inferior= beta_OLS.ravel() - 1.96 * sd116self.inferior=inferior117118119def var_robust(self):120121#llamar a método anterior122self.reg_beta_OLS()123124#y reasignar nombres a atributos del método anterior125X_np = self.X_np126y_np = self.y_np127beta_OLS = self.beta_OLS_output.values.reshape(- 1, 1) # convertir dataframe a vector128129#### Operaciones ####130e = y_np - ( X_np @ beta_OLS ) # vector de errores: error_i = Y_i - Y_estimado_i131self.e=e132133N = X.shape[ 0 ] # numero de filas134ee=(e.T @ e)[ 0 ] # sumatoria e^2135self.ee=ee136137self.w=np.eye(N)*ee #np.eye(N): sale matris I 2000x2000 => ese ee sale en diagonal, repetido138139### 1. matriz de varianza y cov robusta ###140var_robust=np.linalg.inv(X_np.T @ X_np) @ X_np.T @(np.eye(N)*ee) @ X_np @ np.linalg.inv(X_np.T@X_np)141#=(X'X)^-1 *X'I*ee*X(X'X)^-1 o (X'X)^-1 *X'w*X(X'X)^-1142143self.vr=var_robust # var_OLS(betas) = (X'X)-1* X' * White * X * (X'X)-1144145### 2. error estandar de cada coeficiente ###146sd = np.sqrt( np.diag(var_robust) ) # desv(betas)=var(betas)^(1/2)147self.sd=sd148149### 3. intervalos de confianza ###150superior= beta_OLS.ravel() + 1.96 * sd151self.superior=superior152inferior= beta_OLS.ravel() - 1.96 * sd153self.inferior=inferior154155def reg_estad(self):156157#llamar a método anterior158self.reg_beta_OLS()159160N = self.X_np.shape[ 0 ] # Numero de filas161162y_est=self.X_np @ self.beta_ols # fila de Y_estimados163164self.SCR = np.sum(np.square(self.y_np - y_est )) # Sumatoria Cuadrado de Residuos165166self.SCT = np.sum(np.square(self.y_np - np.mean(y_est))) # Sumatoria Cuadrado Totales167168#### Root-MSE ####169root_mse = np.sqrt(self.SCT/ N)170self.root_mse=root_mse171172#### R cuadrado #### *****173R2 = 1- self.SCR/self.SCT174self.R2=R2175176fit = {"Root_MSE":root_mse, "R2": R2}177178return fit179180def reg_OLS(self):181182# a. Se corren las funciones y ordenan valores para colocarlos en una tabla:183self.reg_estad()184self.reg_beta_OLS()185186# a.1. coeficiente estimados187beta_ols = self.beta_ols188189# b. Varianza de acuerdo a errores estandar o robustos190191# b.1. errores estandar y límites192self.var_standar()193194sd_standar=self.sd.reshape( -1, 1 )195196superior_standar=self.superior.reshape( -1, 1 )197inferior_standar=self.inferior.reshape( -1, 1 )198199# b.2. errores robustos y límites200self.var_robust()201202sd_robust=self.sd.reshape( -1, 1 )203204superior_robust=self.superior.reshape( -1, 1 )205inferior_robust=self.inferior.reshape( -1, 1 )206207# c. Colocar valores en una tabla de acuerdo a errores estandar o robustos208209if self.robust:210table_data ={ "Coef." : beta_ols.ravel() ,211"Std.Err." : sd_standar.ravel(),212"Interv. sup." : superior_standar.ravel(),213"Interv. inf." : inferior_standar.ravel() }214215# d. crear dataframe216reg_OLS = pd.DataFrame( table_data , index = self.columns )217218# e. crear diccionario219dic = {"OLS": reg_OLS, "root MSE": self.root_mse, "R2": self.R2}220221else:222table_data ={ "Coef." : beta_ols.ravel() ,223"Std.Err." : sd_robust.ravel(),224"Interv. sup." : superior_robust.ravel(),225"Interv. inf." : inferior_robust.ravel() }226227# d. crear dataframe228reg_OLS = pd.DataFrame( table_data , index = self.columns )229230# e. crear diccionario231dic = {"OLS": reg_OLS, "root MSE": self.root_mse, "R2": self.R2}232233return dic234235#DEMOSTRACIÓN:236A = RegClass( X, y ,lista, robust=True) # correr datos237A238239#Usando funcion general240A.X_np241242#Usando la funcion reg_beta_OLS para hallar los coeficientes betas estimados243A.reg_beta_OLS()244245#Usando la funcion var_standar246A.var_standar()247A.superior # límite superior248249#Usando la funcion var_robust250A.var_robust()251A.superior # límite superior252253#Usando la funcion reg_OLS para ver el diccionario que incluye:254A = RegClass( X, y ,lista, robust=True)255A.reg_OLS() # diccionario cuando hay evaluación con errores robustos256257A.reg_OLS()['OLS'] #ver primer elemento del diccionario que es un dataframe258259A = RegClass( X, y ,lista,robust=False)260A.reg_OLS() # diccionario cuando hay evaluación estandar261262