Path: blob/main/Trabajo_grupal/WG5/Grupo_1_py1.py
2714 views
# -*- coding: utf-8 -*-12#%% Grupo 1. Miembros del grupo:34# 20163197, Enrique Alfonso Pazos5# 20191894, Ilenia Ttito6# 20151595, Rodrigo Ramos7# 20193469, Luis Eguzquiza8# 20163377, Jean Niño de Guzmán910#%% Parte 111import os12import pyreadr13import pandas as pd14import numpy as np15import scipy.stats as stats16from scipy.stats import t1718user = os.getlogin() # Usuario del dispositivo19os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/data") # Definimos el directorio2021# Leemos el archivo de Workspace R22dr = pyreadr.read_r("../data/cps2012.Rdata")2324# Convertimos en un dataframe25dr = dr['data']262728#Filtando la base de datos29# Saca la varianza de cada vector y lo pasa a un array30var_cols = dr.var().to_numpy()3132# Se filtran las columnas con valores constantes (muchos 1), nos aseguramos de tener variables continuas3334df = dr.iloc[:,np.where(var_cols != 0)[0]]35X = df.iloc[:,1:10] # Filtra por posiciones36y = df[['lnw']] # Filtra por el nombre de la variable3738#%%3940class RegClass( object ):4142# Colocamos los atributos definidos en la clase. X se incluye privatizado43__slots__ = [ '__X', 'y', 'intercept', 'X_np', 'y_np', 'columns', 'reg_beta_OLS', 'reg_var_OLS', 'reg_OLS', 'pregunta_3_var_covar_robust', 'pregunta_3_parte_2', 'rmse', '__mostrar_resultados' ]4445#Se definen X como un data frame y Y como una serie, y se indica que en este caso si habrá intercepto46def __init__( self, X : pd.DataFrame , y : pd.Series , intercept = True ):4748#Creación de atributos de acuerdo a la base de datos (añadiendo intercepto)4950# Privatizamos el atributo X (dataframe de variables explicativas)51self.__X = X52self.y = y53self.intercept = intercept5455#Se indica que se apliquen las funciones si se cuenta con intercepto, y en caso contrario no hacer nada56if self.intercept:5758self.__X[ 'Intercept' ] = 159#Coloación del Intercepto como la primera columna60cols = self.__X.columns.tolist() # nombre de varaible a lista61new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] # Se juntan las listas62self.X = self.__X.loc[ : , new_cols_orders ] # usamos .loc que filtra por nombre de filas o columnas6364else:65pass6667# Creación de nuevos atributos6869self.X_np = self.__X.values # Dataframe a multi array70self.y_np = y.values.reshape( -1 , 1 ) # de objeto serie a array columna71self.columns = self.__X.columns.tolist() # nombre de la base de datos como objeto lista7273def reg_beta_OLS( self ):7475#Se llaman a los atributos antes creados para el cálculos de los betas con a matriz X y la columna y76X_np = self.X_np77y_np = self.y_np787980#Estimación de los Betas81beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )8283#Se llama al atributos de las columnas antes creado para hacer un dataframe con los betas estimados84index_names = self.columns8586#Se crea un dataframe con los betas estimados de cada variable en la columna y87beta_OLS_output = pd.DataFrame( beta_ols , index = index_names , columns = [ 'Coef.' ] )8889#Se pone el vector de coeficientes estimados como un atributo90self.beta_OLS = beta_OLS_output9192return beta_OLS_output9394def reg_var_OLS( self ):95#Se llaman a los betas calculados anteriormente96self.reg_beta_OLS()9798#Se crean nuevos valores y atributos para el calculos de la varianza99X_np = self.X_np100y_np = self.y_np101102# Se traen los valores estimados de los betas103beta_OLS = self.beta_OLS.values.reshape( - 1, 1 )104105# Calculos de los errores106e = y_np - ( X_np @ beta_OLS )#############################################################107108# creo el atributo error porque me servirá más adelante109self.error = e ################################################################110111# Calculo de la varianza de los errores.112N = X_np.shape[ 0 ]113114total_parameters = X_np.shape[ 1 ]115error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )116117# Se calculan las varianzas y covarianzas118var_ols = error_var * np.linalg.inv( X_np.T @ X_np )119120#Se trae el atributo de columnas antes creado para añadirlo al nuevo dataframe121index_names = self.columns122123#Se coloca en un dataframe las varianzas de todas las variables así y su respectiva covarianza124var_OLS_output = pd.DataFrame( var_ols , index = index_names , columns = index_names )125126#Se pone la matriz de varianzas y covarianza como un atributo con los valores en el dataframe calculado antes127self.var_OLS = var_OLS_output128129return var_OLS_output130131def reg_OLS( self ):132133# Se llaman los betas y varianzas estimados anteriormente134self.reg_beta_OLS()135self.reg_var_OLS()136137#Se llama a un atributo antes creado de X138X = self.X_np139140#Se traen los valores antes calculados en los dos métodos anteriores (Betas y Varianza)141beta_OLS = self.beta_OLS.values.reshape( -1, 1 )142var_OLS = self.var_OLS.values143144#Creación de los errores estándar145beta_se = np.sqrt( np.diag( var_OLS ) )146147# Se calcula el test statistic para cada coeficiente para poder calcular los intervalos de confianza148t_stat = beta_OLS.ravel() / beta_se.ravel()149150#Creación del p-value para creación de intervalos de confianza151N = X.shape[ 0 ]152k = beta_OLS.size153pvalue = (1 - t.cdf(t_stat, df= N - k) ) * 2154# defining index names155index_names = self.columns156157158# Creación de los intervalos de confianza de acuerdo a los betas estimados159160int1 = beta_OLS.ravel() + 1.96*beta_se161int2 = beta_OLS.ravel() - 1.96*beta_se162163table_data ={ 'Coef.' : beta_OLS.ravel() ,164"Std.Err." : beta_se.ravel(),165"t" : t_stat.ravel(),166"P>|t|" : pvalue.ravel(),167"[0.025" : int1.ravel(),168"0.975]" : int2.ravel()169}170171# defining a pandas dataframe172reg_OLS1 = pd.DataFrame( table_data , index = index_names )173174# Ponemos como atributo175self.reg_se_interv = reg_OLS1176177return reg_OLS1178179def pregunta_3_var_covar_robust( self ):180181X = self.X_np182183"""184De manera más fácil sería llamar al error como atributo calculado en la función anterior185"""186# Necesito el atributo error (e)187self.reg_var_OLS188e = self.error189190# Número de observaciones = N191N = X.shape[ 0 ]192193# Matriz Varianza-Covarianza robusta: (X'X)^-1 * X' * Matriz_White * X * (X'X)^-1194195# Matriz propuesta por White: error^2 * M.Identidad(MxM)196# Para crearla, primero debo crear una matriz de paso: e x e'197Matriz_de_paso = e @ e.T198199# En caso de que hubiera 4 observaciones:200# e1^2 e1e2 e1e3 e1e4201# e2e1 e2^2 e2e3 e2e4202# e3e1 e3e2 e3^2 e3e4203# e4e1 e4e2 e4e3 e4^2204205# Ahora, debo diagonalizarla:206207lista = np.arange(N)208for i in lista:209for j in lista:210if(i == j):211Matriz_de_paso[i][j] = Matriz_de_paso[i][j]212else:213Matriz_de_paso[i][j] = 0214215# De esa manera, obtendría la matriz de White216# e1^2 0 0 0217# 0 e2^2 0 0218# 0 0 e3^2 0219# 0 0 0 e4^2220Matriz_White = Matriz_de_paso221222# Ahora, calcularé la matriz robusta:223# Primero, (X'X)^-1224Inversa = np.linalg.inv( X.T @ X )225226# (X'X)^-1 * X' * Matriz_White * X * (X'X)^-1227var_OLS_robusta = Inversa @ X.T @ Matriz_White @ X @ Inversa228229# Nombres de las columnas230index_names = self.columns231232var_robusta = pd.DataFrame(var_OLS_robusta , index = index_names , columns = index_names )233234# Crearé un atributo con el valor de la matriz var-covar robusta.235self.var_OLS_robusta = var_robusta236237return var_robusta238239def pregunta_3_parte_2( self ):240241# Los atributos de las funciones anteriores242self.reg_beta_OLS()243self.pregunta_3_var_covar_robust244245# X tomará el valor del atributo X_np246X = self.X_np247248# La variable beta_OLS tomará los valores del output anterior transformado, aqui, a vector fila.249beta_OLS = self.beta_OLS.values.reshape( -1, 1 )250251# La variable var_robust será igual al output de la función anterior252var_robust = self.var_robust253254"""255OJO: voy a calcular la desviación estándar con la matriz de var-covar robusta:256"""257258# Desviación estándar de los coeficientes estimados: (var(beta^))^0.5259beta_desv_std = np.sqrt( np.diag( var_robust ) )260261N = X.shape[ 0 ] # Número de observaciones262k = X.shape[ 1 ] # Número de regresores263264# Intervalos de confianza:265266# t_tabla -> Distribución T-Student al 95% de confianza.267# bound = Desv. Estandar*t_tabla268bound = beta_desv_std * stats.t.ppf( ( 1 + 0.95 ) / 2., N - k )269270# Límite superior = Coeficiente + Desv. Estandar*t_stat271lim_sup_robust = beta_OLS.ravel() + bound272273# Límite superior = Coeficiente - Desv. Estandar*t_stat274lim_inf_robust = beta_OLS.ravel() - bound275276277tabla = { 'desv. std. robusto' : beta_desv_std.ravel(),278'límite superior robusto' : lim_sup_robust.ravel(),279'límite inferior robusto' : lim_inf_robust.ravel()}280281# defining index names282index_names = self.columns283284resultados_robustos = pd.DataFrame(tabla, index = index_names )285286# Crearé un atributo con el valor de la matriz var-covar robusta.287self.result_robustos_OLS = resultados_robustos288289return resultados_robustos290291def rmse(self):292293suma = 0294295for v in self.y_np:296suma = suma + v297298media = suma/self.y_np.len()299300#columna = self.y_np301302columna = np.ones(self.y_np.len())303304y_dif= self.y_np - media * columna.T305306sct = y_dif.T @ y_dif307308sce = self.error.T @ self.error309310R_2 = 1- (sce / sct)311312root = pow(sct/self.y_np.len(), 0.5)313314self.R_cuadrado = R_2315316self.root_mse = root317318R_2_root = {self.R_cuadrado, self.root_mse}319320return R_2_root321322def __mostrar_resultados (self):323324#Corremos las funciones pertinentes325self.reg_OLS()326self.pregunta_3_parte_2()327self.rmse()328329# Generamos los resultados de los coeficientes estimados, errores estándar e intervalos de confianza, el R2 y el RMSE330result_df ={ 'Coef.' : self.beta_OLS.flatten(),331'desv. std. robusto' : self.beta_desv_std.flatten(),332'límite superior robusto' : self.lim_sup_robust.flatten(),333'límite inferior robusto' : self.lim_inf_robust.flatten()334}335# defining index names336index_names = self.columns337338# Definimos estos dentro de un dataframe339OLS_results = pd.DataFrame( result_df , index = index_names )340return OLS_results341342# Creamos un diccionario que muestra todos los resultados343344final_results ={"OLS": OLS_results , "R_2" : self.R_cuadrado.flatten() ,345"Root-MSE" : self.R_2_root.flatten()}346347return final_results348349350#Probando la clase351regress = RegClass(X, y)352353# Hallamos los coeficientes de la regresión354regress.reg_beta_OLS()355356# Hallamos la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza.357regress.reg_var_OLS()358regress.var_OLS359360regress.reg_OLS()361regress.reg_se_interv362363# Hallamos la matriz de varianza y covarianza robusta, los errores estándar de cada coeficiente, e intervalos de confianza.364regress.pregunta_3_var_covar_robust()365regress.var_robusta366regress.result_robustos_OLS367368# Hallamos el R2, root MSE (mean square error)369regress.rmse()370regress.R_cuadrado371regress.root_mse372373# Mostramos los resultados en un diccionario374regress.__mostrar_resultados()375regress.final_results376377378379380