Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG4/Grupo_6_py.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
Spyder Editor
4
5
This is a temporary script file.
6
"""
7
##########################################
8
# TAREA 4 #
9
##########################################
10
11
# Primero es necesario que importemos las librerias para crear las clases, definir atributos y finalmente crear los modelos
12
13
import numpy as np
14
import pandas as pd
15
from pandas import DataFrame, Series
16
import statistics
17
import inspect
18
import pyreadr # Cargar la base de datos de R
19
import os # Para identificar el directorio
20
21
# Llamamos el paquete que nos permitirá llevar a cabo la regresión lineal
22
23
from scipy.stats import t
24
25
# Comenzamos a crear la clase, en la parte de class REGREE_OLS, podemos omitir object, pues es lo mismo
26
27
class OLS
28
def __init__( self, X:pd.Dataframe, y:pd.Series, lista, RobustStandardError = True):
29
def __init__(self, explicativas, vector, extraer, booleano):
30
31
self.explicativas = explicativas
32
self.vector = vector
33
self.booleano = booleano
34
35
# INDICAMOS QUE "X" SEA UN DATA FRAME Y "Y" UNA LISTA, PROPONEMOS UN CONDICIONAL PARA AMBOS// mensaje de error porsiaca #
36
37
if not isinstance( X, pd.Dataframe ) :
38
raise TypeError ( "X debería ser un pd.Dataframe.")
39
40
if not isinstance( y, pd.Series ) :
41
raise TypeError("y debería ser una pd.Series.")
42
43
# PROPONEMOS LOS ATRIBUTOS CORRESPONDIENTES
44
try:
45
self.X = X.loc[:, lista]
46
except:
47
self.X = X.iloc[:, lista]
48
self.y = y
49
self.RobustStandardError = RobustStandardError
50
51
self.X[ 'intercepto' ] = 1
52
53
cols = self.X.columns.tolist()
54
55
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1]
56
57
# Convertimos los nombres a columnas, filtramos los nombres
58
59
self.X1 = self.X.loc[ :, new_cols_orders ]
60
self.X1_np = self.X.values
61
62
self.Y_np = y.values.reshape( -1 , 1 )
63
self.columns = self.X.columns.tolist()
64
65
#%% Método 1
66
# Se busca estimar los coeficientes de la regresión
67
# Definimos la regresión
68
69
def REGRE_BETA_OLS( self ):
70
71
X_np = self.X_np
72
y_np = self.y_np
73
74
# beta_ols
75
76
beta_ols = np.Linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )
77
78
#OUTPUT
79
80
index_names = self.columns
81
beta_OLS_output = pd.DetaFrame( beta_ols, index = index_names, columns = [ 'Coef.'] )
82
self.beta_OLS - beta_OLS_output
83
84
return beta_OLS_output
85
86
#%% Método 2
87
# Se busca hallar la matriz de varianzas y covarianzas, en modo estándar:
88
# Primero buscamos hallar el error estandar y la varianza a continuación
89
def STDERROR_VAR_M( self ):
90
91
# Primero, Estimamos el error
92
self.beta_OLS_Reg()
93
94
# SHORTCUT PARA LOS X_NP
95
X_np = self.X_np
96
y_np = self.y_np
97
98
# BETA_OLS
99
beta_OLS = self.beta_OLS.values.reshape( - 1, 1 )
100
101
X_np = self.X_np
102
y_np = self.y_yp
103
104
e = y_np - ( X_np @ beta_OLS )
105
106
# Segundo, PARA EL ERROR DE LA VARIANZA
107
N = X_np.shape [ 0 ]
108
total_parameters = X_np.shape [1 ]
109
error_var = ( (e.T @ e) [0]) / (N - total_parameters)
110
111
# Tercero, hallamos la varianza.
112
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )
113
114
# OUTPUT DE reg_var_OLS(setf): ATRIBUTO DE VAR
115
index_names = self. columns
116
var_OLS_output = pd.Dataframe( var_OLS, index = index_names, columns = index_names )
117
self.var_OLS = var_OLS_output
118
119
#Ahora si, podemos analizar el error estándar:
120
121
# VARIANZA
122
beta_OLS = self.beta_OLS.values.reshape( -1, 1 )
123
var_OLS = self.var_OLS.values
124
125
# ERROR ESTANDAR
126
beta_stderror = np.sqrt(np.diag( var_OLS ) )
127
table_data0 = { "Std.Err." : beta_stderror.ravel()}
128
129
index_names0 = self.columns
130
131
self.beta_se = pd.DataFrame ( table_data0, index = index_names0 )
132
133
# Para analizar el intervalo de confianza hacia un 95%, se sabe que el valor es 1.96
134
135
up_bd = beta_OLS.ravel() + 1.96*beta_stderror
136
137
lw_bd = beta_OLS.ravel() - 1.96*beta_stderror
138
139
table_data1 = {"[0.025" : lw_bd.ravel(),
140
"0.975]" : up_bd.ravel() }
141
#Por lo propuesto nos piden, primero denominaremos el index:
142
143
index_names1 = self.columns
144
145
# Ahora tenemos un panda frame:
146
147
self.confiden_interval = pd.Dataframe( table_data1, index = index_names1 )
148
149
#%% Método 3
150
# Aqui nos piden un método para hallar la matriz de varianza y covarianza robusta
151
def M_ROBUST_COV(self):
152
# ESTIMACIÓN DEL VECTOR DE COEFICIENTES.
153
154
self.beta_OLS_Reg()
155
156
# usamos atributos pero con el nombre simplificado
157
X_np = self.X_np
158
y_np = self.y_np
159
160
#VARIANZA ROBUSTA:
161
162
# matriz propuesta de White para muestras grandes
163
# V = np.zeros ((X_np.shape[1]. X_np. shape(1)))
164
self.y_est = X_np @ self.beta_OLS
165
166
matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))
167
168
self.robust_var = np.linalg.inv(X_np.T @ X) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)
169
170
#%% Método 4
171
# 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.
172
173
# Determinamos que X sea un data frame, mientras Y sea una columna, de modo que tambien se utiliza el args
174
175
def coeficientes(self, *args):
176
self.n = self.X.shape[0] # numero de observaciones, # self.n "Se crea un nuevo atributo"
177
k = self.X.shape[1]
178
Y = 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 Y
179
X1 = self.Y.to_numpy().reshape(self.n ,1) # Se mantiene como DataFrame. Se crea atributo de variables explicativas
180
self.X = X
181
self.Y = Y #Se crea el atributo para extraer el vector de la variable Y
182
self.beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
183
184
self.nk = self.n - k #Para determinar grados de libertad
185
# Se definirá un método que halle el R2 y root MSE (mean square error)
186
187
def R2(self):
188
189
self.coeficientes()
190
y_est = self.X @ self.beta
191
error = self.Y - y_est
192
self.SCR = np.sum(np.square(error))
193
SCT = np.sum(np.square(self.Y - np.mean(self.Y)))
194
R2 = 1 - self.SCR/SCT
195
196
return R2
197
# Ahora, para hallar el root MSE, primero hay que llamar al paquete que nos permitirá encontrarlo
198
from sklearn.metrics import mean_squared_erro
199
#Definimos el método
200
201
def MSE(true,predicted):
202
203
MSE = mean_squared_error(true,predicted, squared=False)
204
205
return MSE
206
207
#%% Método 5
208
# Primero se necesita cargar la base de datos, por ello utilizamos el user que se utilice sin necesidad de cambiar el usuario del computador
209
user = os.getlogin()
210
os.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:"
211
212
cps2012_UNO = pyreadr.read_r("../data/cps2012.Rdata")
213
cps2012 = cps2012_UNO['data']
214
dt = cps2012.describe
215
216
#ES NECESARIO FILTRAR LAS VARIANZAS DISTINTAS A 0
217
218
variance_cols = cps2012.var().to_numpy()
219
dataset = cps2012.iloc[:, np.where(variance_cols !=0 )[0]]
220
## aca poner un dataset específico desde el general, podría ser con iloc y squeeze()
221
222
################## FIN TAREA ########################
223
224
225
226
227