Path: blob/main/Trabajo_grupal/WG4/Grupo_7_spyder.py
2714 views
# Issue4 #12# importamos librerías necesarias3import pandas as pd4import numpy as np56import pyreadr # Load R dataset7import os # for usernanme y set direcotrio8from scipy.stats import t # t - student9101112# creamos clase1314class OLSRegClass( object ): # también podemos omitir object, pues es lo mismo1516def __init__( self, X:pd.DataFrame, y:pd.Series, lista, RobustStandardError=True ): # X:pd.DataFrame indica que debe ser un dataframe17# y:pd.Series indica que debe ser una serie18## CONDICIONAL PARA X:pd.DataFrame ###19if not isinstance( X, pd.DataFrame ): # si X no es dataframe, arroja error20raise TypeError( "X must be a pd.DataFrame." )2122## CONDICIONAL PARA y:pd.Series ###23if not isinstance( y, pd.Series ): # si y no es series, arroja error24raise TypeError( "y must be a pd.Series." )2526# ## CONDICIONAL PARA y:pd.Series ###27# if not isinstance( lista, pd.Series ): # si lista no es series, arroja error28# raise TypeError( "lista must be a pd.Series." )293031# asignando atributos de la clase32try:33self.X = X.loc[:, lista]34except:35self.X = X.iloc[:, lista]3637self.y = y38self.RobustStandardError = RobustStandardError3940# incluyendo columna de unos para el intercepto41self.X[ 'Intercept' ] = 1 # crea columna Intercept con valores 1 al final del array4243# queremos que la columna Intercept aparezca en la primera columna44cols = self.X.columns.tolist() # convierte el nombre de las columnas a lista45new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] # mueve la última columna (que sería Intercept) al inicio46# la manera de hacerlo es ordenando primero cols[-1] y luego cols[0:-1]4748self.X = self.X.loc[ :, new_cols_orders ] # usamos .loc que filtra por nombre de filas o columnas495051# creando nuevos atributos52self.X_np = self.X.values # pasamos dataframe a multi array53self.y_np = y.values.reshape( -1 , 1 ) # de objeto serie a array columna54self.columns = self.X.columns.tolist() # nombre de la base de datos como objeto lista555657###########################################################################58######### CREANDO MÉTODOS ###############################################5960######### MÉTODO 1 ###############################################6162def beta_OLS_Reg( self ):6364# X, y en Matrix, y vector columna respectivamente65X_np = self.X_np66y_np = self.y_np6768# beta_ols69self.beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )707172# asignando output de la función def beta_OLS( self ): como atributo self.beta_OLS73index_names = self.columns74beta_OLS_output = pd.DataFrame( self.beta_ols, index = index_names, columns = [ 'Coef.' ] )75self.beta_OLS = beta_OLS_output7677return beta_OLS_output787980######### MÉTODO 2 ###############################################8182def var_stderrors_cfdinterval( self ):8384#################85### VARIANCE ###8687# Se corre la función beta_OLS que estima el vector de coeficientes88self.beta_OLS_Reg()8990# usaré atributos pero con un nombre más simple91X_np = self.X_np92y_np = self.y_np9394# beta_ols95beta_OLS = self.beta_OLS.values.reshape( - 1, 1 ) # Dataframe a vector columna9697# errors98e = y_np - ( X_np @ beta_OLS )99100# error variance101N = X_np.shape[ 0 ]102total_parameters = X_np.shape[ 1 ]103error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )104105# Varianza106var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )107108109# asignando output de la función def reg_var_OLS( self ): como atributo self.var_OLS110index_names = self.columns111var_OLS_output = pd.DataFrame( var_OLS , index = index_names , columns = index_names )112self.var_OLS = var_OLS_output113114115#######################116### STANDAR ERRORS ###117118# var y beta119beta_OLS = self.beta_OLS.values.reshape( -1, 1 ) # -1 significa cualquier número de filas120var_OLS = self.var_OLS.values121122# standard errors123beta_stderror = np.sqrt( np.diag( var_OLS ) )124125table_data0 = { "Std.Err." : beta_stderror.ravel()}126127# defining index names128index_names0 = self.columns129130# defining a pandas dataframe131self.beta_se = pd.DataFrame( table_data0 , index = index_names0 )132133134###########################135### Confidence interval ###136137up_bd = beta_OLS.ravel() + 1.96*beta_stderror138lw_bd = beta_OLS.ravel() - 1.96*beta_stderror139140table_data1 = {"[0.025" : lw_bd.ravel(),141"0.975]" : up_bd.ravel()}142143# defining index names144index_names1 = self.columns145146# defining a pandas dataframe147self.confiden_interval = pd.DataFrame( table_data1 , index = index_names1 )148149150###################### MÉTODO 3 ###############################################151152def robust_var_se_cfdinterval(self):153154# Se corre la función reg_beta_OLS que estima el vector de coeficientes155self.reg_beta_OLS()156157# usaré atributos pero con un nombre más simple158X_np = self.X_np159y_np = self.y_np160listaf = self.lista161162beta = np.linalg.inv(X_np.T @ X_np) @ ((X_np.T) @ y )163y_est = X_np @ beta164n = X_np.shape[0]165k = X_np.shape[1] - 1166nk = n - k167168matrix_robust = np.diag(list( map( lambda x: x**2 , y - y_est)))169Var = np.linalg.inv(X_np.T @ X_np) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)170sd = np.sqrt( np.diag(Var) )171var = sd**2172t_est = np.absolute(beta/sd)173lower_bound = beta-1.96*sd174upper_bound = beta+1.96*sd175SCR = sum(list( map( lambda x: x**2 , y - y_est) ))176SCT = sum(list( map( lambda x: x**2 , y - np.mean(y_est) )))177R2 = 1-SCR/SCT178rmse = (SCR/n)**0.5179table = pd.DataFrame( {"ols": beta , "standar_error" : sd , "Lower_bound":lower_bound, "Upper_bound":upper_bound} )180181fit = {"Root_MSE":rmse, "R2": R2}182183index_names7 = listaf184var_robust_output = pd.DataFrame( Var , index = index_names7 , columns = index_names7 )185self.var_robust = var_robust_output186187188return table, fit, var_robust_output189190191192######### MÉTODO 4 ###############################################193194def R2_rootMSE( self ) :195196############197### R2 ###198199# Se corre la función beta_OLS_Reg que estima el vector de coeficientes200self.beta_OLS_Reg()201202self.y_est = self.X_np @ self.beta_OLS # y estimado203error = self.y_np - self.y_est # vector de errores204self.SCR = np.sum(np.square(error)) # Suma del Cuadrado de los Residuos205SCT = np.sum(np.square(self.y_np - np.mean(self.X_np) )) # Suma de Cuadrados Total206207self.R2 = 1 - self.SCR/SCT208209210#################211### root MSE ###212213for i in error.values:214215suma = 0216suma = np.sqrt( suma + (i**2) / self.X_np.shape[0] )217218self.rootMSE = suma.tolist()219220221######### MÉTODO 5 ###############################################222223def output( self ):224225self.beta_OLS_Reg()226self.R2_rootMSE()227self.var_stderrors_cfdinterval()228229# var y beta230beta_OLS = self.beta_OLS.values.reshape( -1, 1 ) # -1 significa cualquier número de filas231var_OLS = self.var_OLS.values232233# standard errors234beta_stderror = np.sqrt( np.diag( var_OLS ) )235236# confidence interval237up_bd = beta_OLS.ravel() + 1.96*beta_stderror238lw_bd = beta_OLS.ravel() - 1.96*beta_stderror239240table_data2 = {'Coef.' : beta_OLS.ravel(),241'Std.Err.' : beta_stderror.ravel(),242'[0.025' : lw_bd.ravel(),243'0.975]' : up_bd.ravel(),244'R2' : self.R2,245'rootMSE' : self.rootMSE}246247return table_data2248249250###############################################################################251252# leemos las base de datos sin cambiar nombre de usuario253user = os.getlogin() # Username254os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4") # Set directorio255cps2012_env = pyreadr.read_r("../data/cps2012.Rdata") # output formato diccionario256cps2012 = cps2012_env[ 'data' ] # extrae iformación almacenada en la llave data del diccionario cps2012_env257258# Borrar variables constantes: filtra observaciones que tenga varianza diferente a cero259variance_cols = cps2012.var().to_numpy() # to numpy260dataset = cps2012.iloc[ :, np.where( variance_cols != 0 )[0] ] # filtra observaciones que tenga varianza diferente a cero261262# genero un dataset con 10 columnas del dataset general263X = dataset.iloc[:, 1:]264y = dataset[['lnw']].squeeze() # convirtiendo a serie265266267##########################268# Probando nuestra Class #269##########################270271# asignando clase, ya sea por nombre o posición de variables272reg1 = OLSRegClass (X, y, ['female', 'widowed', 'divorced', 'separated', 'nevermarried'])273reg1 = OLSRegClass (X, y, range(0,5))274275# Ejecutando Método 1276reg1.beta_OLS_Reg()277278# Ejecutando Método 2279reg1.var_stderrors_cfdinterval()280reg1.var_OLS281reg1.beta_se282reg1.confiden_interval283284# Ejecutando Método 3285reg1.robust_var_se_cfdinterval()286reg1.robust_var287288# Ejecutando Método 4289reg1.R2_rootMSE()290reg1.R2291reg1.rootMSE292293# Ejecutando Método 5294reg1.output()295296297