Path: blob/main/Trabajo_grupal/WG4/Grupo_6_py.py
2714 views
# -*- coding: utf-8 -*-1"""2Spyder Editor34This is a temporary script file.5"""6##########################################7# TAREA 4 #8##########################################910# Primero es necesario que importemos las librerias para crear las clases, definir atributos y finalmente crear los modelos1112import numpy as np13import pandas as pd14from pandas import DataFrame, Series15import statistics16import inspect17import pyreadr # Cargar la base de datos de R18import os # Para identificar el directorio1920# Llamamos el paquete que nos permitirá llevar a cabo la regresión lineal2122from scipy.stats import t2324# Comenzamos a crear la clase, en la parte de class REGREE_OLS, podemos omitir object, pues es lo mismo2526class OLS27def __init__( self, X:pd.Dataframe, y:pd.Series, lista, RobustStandardError = True):28def __init__(self, explicativas, vector, extraer, booleano):2930self.explicativas = explicativas31self.vector = vector32self.booleano = booleano3334# INDICAMOS QUE "X" SEA UN DATA FRAME Y "Y" UNA LISTA, PROPONEMOS UN CONDICIONAL PARA AMBOS// mensaje de error porsiaca #3536if not isinstance( X, pd.Dataframe ) :37raise TypeError ( "X debería ser un pd.Dataframe.")3839if not isinstance( y, pd.Series ) :40raise TypeError("y debería ser una pd.Series.")4142# PROPONEMOS LOS ATRIBUTOS CORRESPONDIENTES43try:44self.X = X.loc[:, lista]45except:46self.X = X.iloc[:, lista]47self.y = y48self.RobustStandardError = RobustStandardError4950self.X[ 'intercepto' ] = 15152cols = self.X.columns.tolist()5354new_cols_orders = [cols[ -1 ]] + cols[ 0:-1]5556# Convertimos los nombres a columnas, filtramos los nombres5758self.X1 = self.X.loc[ :, new_cols_orders ]59self.X1_np = self.X.values6061self.Y_np = y.values.reshape( -1 , 1 )62self.columns = self.X.columns.tolist()6364#%% Método 165# Se busca estimar los coeficientes de la regresión66# Definimos la regresión6768def REGRE_BETA_OLS( self ):6970X_np = self.X_np71y_np = self.y_np7273# beta_ols7475beta_ols = np.Linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )7677#OUTPUT7879index_names = self.columns80beta_OLS_output = pd.DetaFrame( beta_ols, index = index_names, columns = [ 'Coef.'] )81self.beta_OLS - beta_OLS_output8283return beta_OLS_output8485#%% Método 286# Se busca hallar la matriz de varianzas y covarianzas, en modo estándar:87# Primero buscamos hallar el error estandar y la varianza a continuación88def STDERROR_VAR_M( self ):8990# Primero, Estimamos el error91self.beta_OLS_Reg()9293# SHORTCUT PARA LOS X_NP94X_np = self.X_np95y_np = self.y_np9697# BETA_OLS98beta_OLS = self.beta_OLS.values.reshape( - 1, 1 )99100X_np = self.X_np101y_np = self.y_yp102103e = y_np - ( X_np @ beta_OLS )104105# Segundo, PARA EL ERROR DE LA VARIANZA106N = X_np.shape [ 0 ]107total_parameters = X_np.shape [1 ]108error_var = ( (e.T @ e) [0]) / (N - total_parameters)109110# Tercero, hallamos la varianza.111var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )112113# OUTPUT DE reg_var_OLS(setf): ATRIBUTO DE VAR114index_names = self. columns115var_OLS_output = pd.Dataframe( var_OLS, index = index_names, columns = index_names )116self.var_OLS = var_OLS_output117118#Ahora si, podemos analizar el error estándar:119120# VARIANZA121beta_OLS = self.beta_OLS.values.reshape( -1, 1 )122var_OLS = self.var_OLS.values123124# ERROR ESTANDAR125beta_stderror = np.sqrt(np.diag( var_OLS ) )126table_data0 = { "Std.Err." : beta_stderror.ravel()}127128index_names0 = self.columns129130self.beta_se = pd.DataFrame ( table_data0, index = index_names0 )131132# Para analizar el intervalo de confianza hacia un 95%, se sabe que el valor es 1.96133134up_bd = beta_OLS.ravel() + 1.96*beta_stderror135136lw_bd = beta_OLS.ravel() - 1.96*beta_stderror137138table_data1 = {"[0.025" : lw_bd.ravel(),139"0.975]" : up_bd.ravel() }140#Por lo propuesto nos piden, primero denominaremos el index:141142index_names1 = self.columns143144# Ahora tenemos un panda frame:145146self.confiden_interval = pd.Dataframe( table_data1, index = index_names1 )147148#%% Método 3149# Aqui nos piden un método para hallar la matriz de varianza y covarianza robusta150def M_ROBUST_COV(self):151# ESTIMACIÓN DEL VECTOR DE COEFICIENTES.152153self.beta_OLS_Reg()154155# usamos atributos pero con el nombre simplificado156X_np = self.X_np157y_np = self.y_np158159#VARIANZA ROBUSTA:160161# matriz propuesta de White para muestras grandes162# V = np.zeros ((X_np.shape[1]. X_np. shape(1)))163self.y_est = X_np @ self.beta_OLS164165matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))166167self.robust_var = np.linalg.inv(X_np.T @ X) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)168169#%% Método 4170# Se definirá el método que permita hallar la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza.171172# Determinamos que X sea un data frame, mientras Y sea una columna, de modo que tambien se utiliza el args173174def coeficientes(self, *args):175self.n = self.X.shape[0] # numero de observaciones, # self.n "Se crea un nuevo atributo"176k = self.X.shape[1]177Y = np.column_stack((np.ones(self.n ), self.Y.to_numpy() )) # self.X.to_numpy() # DataFrame to numpy #Se crea atributo de vector de variable Y178X1 = self.Y.to_numpy().reshape(self.n ,1) # Se mantiene como DataFrame. Se crea atributo de variables explicativas179self.X = X180self.Y = Y #Se crea el atributo para extraer el vector de la variable Y181self.beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )182183self.nk = self.n - k #Para determinar grados de libertad184# Se definirá un método que halle el R2 y root MSE (mean square error)185186def R2(self):187188self.coeficientes()189y_est = self.X @ self.beta190error = self.Y - y_est191self.SCR = np.sum(np.square(error))192SCT = np.sum(np.square(self.Y - np.mean(self.Y)))193R2 = 1 - self.SCR/SCT194195return R2196# Ahora, para hallar el root MSE, primero hay que llamar al paquete que nos permitirá encontrarlo197from sklearn.metrics import mean_squared_erro198#Definimos el método199200def MSE(true,predicted):201202MSE = mean_squared_error(true,predicted, squared=False)203204return MSE205206#%% Método 5207# Primero se necesita cargar la base de datos, por ello utilizamos el user que se utilice sin necesidad de cambiar el usuario del computador208user = os.getlogin()209os.chdir(f"Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4") #Tomar en cuenta que al trabajar en una Mac o sistema IOs, no se usa el C:"210211cps2012_UNO = pyreadr.read_r("../data/cps2012.Rdata")212cps2012 = cps2012_UNO['data']213dt = cps2012.describe214215#ES NECESARIO FILTRAR LAS VARIANZAS DISTINTAS A 0216217variance_cols = cps2012.var().to_numpy()218dataset = cps2012.iloc[:, np.where(variance_cols !=0 )[0]]219## aca poner un dataset específico desde el general, podría ser con iloc y squeeze()220221################## FIN TAREA ########################222223224225226227