Path: blob/main/Trabajo_grupal/WG4/Grupo_8_py.py
2714 views
# -*- coding: utf-8 -*-1"""23@author: grupo 845"""67import numpy as np8import pandas as pd9import os10import scipy.stats as stats11from scipy.stats import t121314import pyreadr # Load R dataset15import os # for usernanme y set directorio1617user = os.getlogin() # Username1819# Set directorio2021os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2") # Set 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#Creamos la clase3233class OLSRegClass(object):34def __init__(self, x:pd.DataFrame, y:pd.Series, lista, RobustStandardError=True):35#x:pd.DataFrame nos indica que debe ser un DataFrame36#y:pd.Series nos indica que debe ser una serie37#Condicional para el x:pd.DataFrame38if not isinstance(x, pd.DataFrame):39raise TypeError("x debe ser pd.DataFrame.")4041#Condicional para el y:pd.Series42if not isinstance(y, pd.Series):43raise TypeError("y debe ser pd.Series.")4445#Condicional para el y:pd.Series46if not isinstance(lista, pd.Series):47raise TypeError("lista debe ser pd.Series")4849#Ahora asignamos atributos de la clase50try:51self.x = x.loc[:, lista]52except:53self.x = x.iloc[:, lista]5455self.y = y56self.RobustStandardError = RobustStandardError5758#Ahora incluimos una columna de unos para el intercepto59self.x['Intercept'] = 16061#para que la columna intercept aparezca en la primera columna:62col = self.x.columns.tolist() #esto convierte el nombre de las columnas a lista63new_col_orders = [col[-1]] + col[0:-1] #esto mueve la última columna(intercept) al inicio, para ello se ordena primero col[-1] y luego col[0:-1]6465#usamos .loc para filtrar por nombre de filas o columnas66self.x = self.x.loc[ :, new_col_orders]6768#Creamos nuevos atributos:69#para pasar de dataframe a multi array:70self.x_np = self.x.values71#para pasar de objeto serie a array columna:72self.y_np = y.values.reshape(-1,1)73#nombramos a la base de datos como objeto lista:74self.columns = self.x.columns.tolist()7576#METODO 17778def beta_OLS_Reg(self):79x_np = self.x_np80y_np = self.y_np8182beta_ols = np.linalg.inv(x_np.T@x_np) @ (x_np.T@y_np)8384#Hay que asignar al output de la función def beta_OLS(self): como atributo self.beta_Ols85index_names = self.columns86beta_OLS_output = pd.DataFrame(beta_ols, index = index_names, columns = ['Coef.'])87self.beta_OLS = beta_OLS_output8889return beta_OLS_output909192#METODO 29394def var_errorest_interv(self):9596####Matriz de varianza y covarianza estándar####9798#corremos la función beta_OLS99self.beta_OLS_Reg()100101X_np = self.X_np102y_np = self.y_np103104#Beta_OLS105beta_OLS = self.beta_OLS.values.reshape( -1, 1) #Pasamos de dataframe a un vector columna106107#errores108e= y_np - (X_np @ beta_OLS)109110#111N= X_np.shape [0]112parametros_totales = X_np.shape [1]113error_var = ( (e.T @ e)[0])/(N- parametros_totales)114115#Varianza estandar116var_OLS = error_var * np.linalg.inv( X_np.T @ X_np)117118#asignaremos output119index_names = self.columns120var_OLS_output = pd.DataFrame(var_OLS, index=index_names, columns=index_names)121self.var_OLS = var_OLS_output122123####ERRORES ESTANDAR####124125#beta y var126beta_OLS= self.beta_OLS.values.reshape (-1,1)127var_OLS= self.var_OLS.values128129#errores estandar130beta_errores= np.sqrt(np.diag(var_OLS))131tabla_data_1= { "Std.Err.": beta_errores.ravel()}132133#definimos index names134index_names0=self.columns135136#definimos un pandas dataframe137self.beta_se= pd.DataFrame(tabla_data_1, index= index_names0)138139####INTERVALOS DE CONFIANZA####140141up_bd = beta_OLS.ravel() + 1.96*beta_errores142lw_bd = beta_OLS.ravel() - 1.96*beta_errores143144tabla_data_2 ={"[0.025" : lw_bd.ravel(),145"0.975]" : up_bd.ravel()146}147148# definiendo index names149index_names1 = self.columns150151# defining a pandas dataframe152self.intervalo_confianza= pd.DataFrame(tabla_data_2, index = index_names1)153154155#METODO 3156def robust_var_se_cfdinterval(self):157158# Función beta OLS para estimar el vector de coeficientes159self.beta_OLS_Reg()160161#atributos162X_np = self. X_np163Y_np= self.Y_np164165####VAR ROBUSTA####166#matriz propuesta de White167168y_est= X_np @ self.beta_OLS169170matrix_robusta = np.diag(list ( map( lambda x: x**2, Y_np - y_est.values )))171self.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)172173174175#METODO 4176def R2_raizMSE( self ) :177178# Se corre la función beta OLS Reg179self. beta_OLS_Reg()180181self.y_est = self.X_np @ self.beta_OLS182error = self.y_np - self.y_est183self.SCR = np. sum(np.square (error))184SCT= np. sum(np.square (self.y_np - np.mean (self.y_est) ))185186self.R2 = 1 - self.SCR/SCT187188for i in error. values:189suma = 0190suma = np.sqrt( suma + (i**2) / self. X_np. shape [0] )191192self.rootMSE = suma. tolist()193194195196#metodo 5###########197def output(self):198self.beta_OLS_Reg()199self.R2_raizMSE()200self.var_errorest_interv()201202#var y beta203beta_OLS = self.beta_OLS.values.reshape(-1,1)204var_OLS = self.var_OLS.values205206#Errores estandar207beta_errores = np.sqrt(np.diag(var_OLS))208209#Intervalo de confianza210up_bd = beta_OLS.ravel() + 1.96*beta_errores211lw_bd = beta_OLS.ravel() - 1.96*beta_errores212213tabla_data_3 = {'Coeficientes': beta_OLS.ravel(),214'Error estandar' :beta_errores.ravel(),215'[0.025': lw_bd.ravel(),216'0.975]': up_bd.ravel(),217'R2': self.R2,218'rootMSE' : self.rootMSE}219220return tabla_data_3221222223