Path: blob/main/Trabajo_grupal/WG4/GRUPO2_Tarea 4.py
2714 views
# -*- coding: utf-8 -*-1"""2Ejercicio Número 4 (WG4)34@author: Grupo 25"""678import numpy as np9import pandas as pd10from pandas import DataFrame, Series11import statistics12import inspect # Permite conocer los argumentos de una función , classes, etc13import pyreadr # Load R dataset14import os # for usernanme y set direcotrio15from scipy.stats import t # t - student1617user = os.getlogin() # Username1819# Set directorio2021os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4") # Fijar directorio2223cps2012_env = pyreadr.read_r("../data/cps2012.Rdata") # output formato diccionario242526cps2012_env # es un diccionario. En la llave "data" está la base de datos27cps2012 = cps2012_env[ 'data' ] # extrae información almacenada en la llave data del diccionario cps2012_env28dt = cps2012.describe()293031"""321- Un método debe estimar los coeficientes de la regresión332- Un método que permita hallar la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza.343- Un método que halle la matriz de varianza y covarianza robusta, los errores estándar de cada coeficiente, e intervalos de confianza.354- Un método que halle el R2, root MSE (mean square error)365- Finalmente un método que muestre los siguientes resultados en un objeto diccionario:3738coeficientes estimados, errores estándar e intervalos de confianza en un Dataframe39R240root-MSE41"""4243444546#creamos la clase4748class OLS_Tarea(object):49def __init__(self, X:pd.DataFrame, Y:pd.Series, List, robustse = True):5051self.X = X.loc[:, List] #asigno mi atributo X52self.Y = Y #asigno mi atributo y53self.robustse = robustse #asigno mi atributo robustse5455#Incluye una columna de unos en nuestra dataframe X56self.X['Intercept'] = 15758#para que la columna intercept aparezca en la primera columna:59cOLS = self.X.columns.tolist() #esto convierte el nombre de las columnas a lista60new_cOLS_orders = [cOLS[-1]] + cOLS[0:-1] #esto mueve la última columna(intercept) al inicio, para ello se ordena primero col[-1] y luego col[0:-1]6162#usamos .loc para filtrar por nombre de filas o columnas63self.X = self.X.loc[ :, new_cOLS_orders]6465#Creamos nuevos atributos:66#para pasar de dataframe a multi array:67self.X_np = self.X.values68#para pasar de objeto serie a array columna:69self.Y_np = Y.values.reshape(-1,1)70#nombramos a la base de datos como objeto lista:71self.columns = self.X.columns.tolist()72self.n = self.X.shape[0]73k = self.X.shape[1]74self.nk = self.n - k7576#1- Un método debe estimar los coeficientes de la regresión7778def coeficientes(self):7980#número de observaciones81X1 = self.X_np #matriz de Xs incluyendo intercepto82Y1 = self.Y_np83beta = np.linalg.inv(X1.T @ X1) @ ((X1.T) @ Y1 )8485index_names = self.columns86# Output87beta_OLS_output = pd.DataFrame( beta , index = index_names , columns = [ 'Coef.' ] )8889# Dataframe de coeficientes como atributo9091self.beta_OLS = beta_OLS_output9293return beta_OLS_output9495#2- Un método que permita hallar la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza.9697def metodo2(self):9899100#corremos la función anterior de coeficientes101self.coeficientes()102103X_np = self.X_np104Y_np = self.Y_np105106#Beta_OLS107beta_OLS = self.beta_OLS.values.reshape( -1, 1) #Pasamos de dataframe a un vector columna108109#hallamos los errores110e= Y_np - (X_np @ beta_OLS)111112113N= X_np.shape [0]114parametros_totales = X_np.shape [1]115error_var = ( (e.T @ e)[0])/(N- parametros_totales)116117#Hallamos la Varianza estandar118var_OLS = error_var * np.linalg.inv( X_np.T @ X_np)119120#Sacamos el nombre de las columnas y asignamos un output que tenga la varianza121index_names = self.columns122var_OLS_output = pd.DataFrame(var_OLS, index=index_names, columns=index_names)123self.var_OLS = var_OLS_output124125########Hallamos errores estandar126127#Hallamos beta y var128beta_OLS= self.beta_OLS.values.reshape (-1,1)129var_OLS= self.var_OLS.values130131#errores estandar132beta_errores= np.sqrt(np.diag(var_OLS))133tabla_data_1= { "Std.Err.": beta_errores.ravel()}134135#definimos el nombre del indice136index_names0=self.columns137138#definimos un pandas dataframe139self.beta_se= pd.DataFrame(tabla_data_1, index= index_names0)140141####Hallamos intervalos de confianza142143self.up_bd = beta_OLS.ravel() + 1.96*beta_errores144self.lw_bd = beta_OLS.ravel() - 1.96*beta_errores145146tabla_data_2 ={"[0.025" : self.lw_bd.ravel(),147"0.975]" : self.up_bd.ravel()148}149150#definimos el nombre del indice151index_names1 = self.columns152153# defining un pandas dataframe154self.intervalo_confianza= pd.DataFrame(tabla_data_2, index = index_names1)155156157#Un método que halle la matriz de varianza y covarianza robusta, los errores estándar de cada coeficiente, e intervalos de confianza.158def metodo_robust(self):159160# Corremos nuestra función de coeficientes161self.coeficientes()162163#Asignamos atributos164X_np = self. X_np165Y_np= self.Y_np166167#Hallamos nuestras varianzas robustas168#con nuestra matriz propuesta de White169170y_est= X_np @ self.beta_OLS171172matrix_robusta = np.diag(list ( map( lambda x: x**2, Y_np - y_est.values )))173self.varianza_robusta= np.linalg.inv(X_np.T @ X_np) @ X_np.T @ matrix_robusta @ X_np @ np.linalg.inv(X_np.T @ X_np)174175176#Un método que halle el R2, root MSE (mean square error)177def R2_rMSE( self ) :178179# Se corre la función beta OLS Reg180self.coeficientes() # run function181y_est = self.X_np @ self.beta_OLS182error = self.Y_np - y_est183self.SCR = np.sum(np.square(error))184SCT = np.sum(np.square(self.Y_np - np.mean(self.Y_np)))185self.rootMSE = np.sqrt(SCT/self.n)186self.R2 = 1 - self.SCR/SCT187188189#Finalmente un método que muestre los siguientes resultados en un objeto diccionario:190#coeficientes estimados, errores estándar e intervalos de confianza en un Dataframe191#R2192#root-MSE193194def Table(self):195#run functions196self.R2_rMSE()197self.R2198self.coeficientes()199self.up_bd #Intervalo de confianza200self.lw_bd #Intervalo de confianza201202scr= self.SCR203sigma= scr/ self.nk204Var = sigma*np.linalg.inv(self.X_np.T @ self.X_np)205sd = np.sqrt( np.diag(Var))206t_est = np.absolute(self.beta_OLS/sd)207pvalue = (1 - t.cdf(t_est, df=self.nk)) * 2208209df = {"OLS": self.beta_OLS.flatten() , "standar_error" : sd.flatten(), "IC_up_bd": self.up_bd.flatten(),"IC_lw_bd": self.lw_bd.flatten(), "R2": self.R2.flatten() , "RootMSE": self.rootMSE.flatten()}210211return df212213#APLICACION DE LA CLASE EN NUESTRA DATA.214#COMO GRUPO APLICAMOS LOS METODOS; SIN EMBARGO TUVIMOS INCONVENIENTES PARA QUE215#LOS METODOS 3 Y 5 CORRAN.216217218cps2012.shape219variance_cols = cps2012.var().to_numpy() #saca la varianza de cada vector y lu vuelve array220221Dataset = cps2012.iloc[ : , np.where( variance_cols != 0 )[0] ] #filtrame aquellas columnas que no tengan varianza (observaciones iguales)222223X = Dataset.iloc[:,1:10]224Y = Dataset[['lnw']]225226L1 = ['female','divorced','separated']227228229Reg1 = OLS_Tarea(X,Y,L1, robustse = True)230231#aplicamos el metodo 1 y estimamos los betas232Reg1.coeficientes()233234# aplicamos el metodo 2235Reg1.metodo2()236print('Betas')237print(Reg1.beta_OLS)238print('Variannza_OLS')239print(Reg1.var_OLS)240print('Intervalo_confianza')241print(Reg1.intervalo_confianza)242#aplicamos metodo 4 y hallamos los R243Reg1.R2_rMSE()244print('rootMSE')245print(Reg1.rootMSE)246print('R2')247print(Reg1.R2)248249250251