Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG4/Grupo_7_spyder.py
2714 views
1
# Issue4 #
2
3
# importamos librerías necesarias
4
import pandas as pd
5
import numpy as np
6
7
import pyreadr # Load R dataset
8
import os # for usernanme y set direcotrio
9
from scipy.stats import t # t - student
10
11
12
13
# creamos clase
14
15
class OLSRegClass( object ): # también podemos omitir object, pues es lo mismo
16
17
def __init__( self, X:pd.DataFrame, y:pd.Series, lista, RobustStandardError=True ): # X:pd.DataFrame indica que debe ser un dataframe
18
# y:pd.Series indica que debe ser una serie
19
## CONDICIONAL PARA X:pd.DataFrame ###
20
if not isinstance( X, pd.DataFrame ): # si X no es dataframe, arroja error
21
raise TypeError( "X must be a pd.DataFrame." )
22
23
## CONDICIONAL PARA y:pd.Series ###
24
if not isinstance( y, pd.Series ): # si y no es series, arroja error
25
raise TypeError( "y must be a pd.Series." )
26
27
# ## CONDICIONAL PARA y:pd.Series ###
28
# if not isinstance( lista, pd.Series ): # si lista no es series, arroja error
29
# raise TypeError( "lista must be a pd.Series." )
30
31
32
# asignando atributos de la clase
33
try:
34
self.X = X.loc[:, lista]
35
except:
36
self.X = X.iloc[:, lista]
37
38
self.y = y
39
self.RobustStandardError = RobustStandardError
40
41
# incluyendo columna de unos para el intercepto
42
self.X[ 'Intercept' ] = 1 # crea columna Intercept con valores 1 al final del array
43
44
# queremos que la columna Intercept aparezca en la primera columna
45
cols = self.X.columns.tolist() # convierte el nombre de las columnas a lista
46
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] # mueve la última columna (que sería Intercept) al inicio
47
# la manera de hacerlo es ordenando primero cols[-1] y luego cols[0:-1]
48
49
self.X = self.X.loc[ :, new_cols_orders ] # usamos .loc que filtra por nombre de filas o columnas
50
51
52
# creando nuevos atributos
53
self.X_np = self.X.values # pasamos dataframe a multi array
54
self.y_np = y.values.reshape( -1 , 1 ) # de objeto serie a array columna
55
self.columns = self.X.columns.tolist() # nombre de la base de datos como objeto lista
56
57
58
###########################################################################
59
######### CREANDO MÉTODOS ###############################################
60
61
######### MÉTODO 1 ###############################################
62
63
def beta_OLS_Reg( self ):
64
65
# X, y en Matrix, y vector columna respectivamente
66
X_np = self.X_np
67
y_np = self.y_np
68
69
# beta_ols
70
self.beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )
71
72
73
# asignando output de la función def beta_OLS( self ): como atributo self.beta_OLS
74
index_names = self.columns
75
beta_OLS_output = pd.DataFrame( self.beta_ols, index = index_names, columns = [ 'Coef.' ] )
76
self.beta_OLS = beta_OLS_output
77
78
return beta_OLS_output
79
80
81
######### MÉTODO 2 ###############################################
82
83
def var_stderrors_cfdinterval( self ):
84
85
#################
86
### VARIANCE ###
87
88
# Se corre la función beta_OLS que estima el vector de coeficientes
89
self.beta_OLS_Reg()
90
91
# usaré atributos pero con un nombre más simple
92
X_np = self.X_np
93
y_np = self.y_np
94
95
# beta_ols
96
beta_OLS = self.beta_OLS.values.reshape( - 1, 1 ) # Dataframe a vector columna
97
98
# errors
99
e = y_np - ( X_np @ beta_OLS )
100
101
# error variance
102
N = X_np.shape[ 0 ]
103
total_parameters = X_np.shape[ 1 ]
104
error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )
105
106
# Varianza
107
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )
108
109
110
# asignando output de la función def reg_var_OLS( self ): como atributo self.var_OLS
111
index_names = self.columns
112
var_OLS_output = pd.DataFrame( var_OLS , index = index_names , columns = index_names )
113
self.var_OLS = var_OLS_output
114
115
116
#######################
117
### STANDAR ERRORS ###
118
119
# var y beta
120
beta_OLS = self.beta_OLS.values.reshape( -1, 1 ) # -1 significa cualquier número de filas
121
var_OLS = self.var_OLS.values
122
123
# standard errors
124
beta_stderror = np.sqrt( np.diag( var_OLS ) )
125
126
table_data0 = { "Std.Err." : beta_stderror.ravel()}
127
128
# defining index names
129
index_names0 = self.columns
130
131
# defining a pandas dataframe
132
self.beta_se = pd.DataFrame( table_data0 , index = index_names0 )
133
134
135
###########################
136
### Confidence interval ###
137
138
up_bd = beta_OLS.ravel() + 1.96*beta_stderror
139
lw_bd = beta_OLS.ravel() - 1.96*beta_stderror
140
141
table_data1 = {"[0.025" : lw_bd.ravel(),
142
"0.975]" : up_bd.ravel()}
143
144
# defining index names
145
index_names1 = self.columns
146
147
# defining a pandas dataframe
148
self.confiden_interval = pd.DataFrame( table_data1 , index = index_names1 )
149
150
151
###################### MÉTODO 3 ###############################################
152
153
def robust_var_se_cfdinterval(self):
154
155
# Se corre la función reg_beta_OLS que estima el vector de coeficientes
156
self.reg_beta_OLS()
157
158
# usaré atributos pero con un nombre más simple
159
X_np = self.X_np
160
y_np = self.y_np
161
listaf = self.lista
162
163
beta = np.linalg.inv(X_np.T @ X_np) @ ((X_np.T) @ y )
164
y_est = X_np @ beta
165
n = X_np.shape[0]
166
k = X_np.shape[1] - 1
167
nk = n - k
168
169
matrix_robust = np.diag(list( map( lambda x: x**2 , y - y_est)))
170
Var = np.linalg.inv(X_np.T @ X_np) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)
171
sd = np.sqrt( np.diag(Var) )
172
var = sd**2
173
t_est = np.absolute(beta/sd)
174
lower_bound = beta-1.96*sd
175
upper_bound = beta+1.96*sd
176
SCR = sum(list( map( lambda x: x**2 , y - y_est) ))
177
SCT = sum(list( map( lambda x: x**2 , y - np.mean(y_est) )))
178
R2 = 1-SCR/SCT
179
rmse = (SCR/n)**0.5
180
table = pd.DataFrame( {"ols": beta , "standar_error" : sd , "Lower_bound":lower_bound, "Upper_bound":upper_bound} )
181
182
fit = {"Root_MSE":rmse, "R2": R2}
183
184
index_names7 = listaf
185
var_robust_output = pd.DataFrame( Var , index = index_names7 , columns = index_names7 )
186
self.var_robust = var_robust_output
187
188
189
return table, fit, var_robust_output
190
191
192
193
######### MÉTODO 4 ###############################################
194
195
def R2_rootMSE( self ) :
196
197
############
198
### R2 ###
199
200
# Se corre la función beta_OLS_Reg que estima el vector de coeficientes
201
self.beta_OLS_Reg()
202
203
self.y_est = self.X_np @ self.beta_OLS # y estimado
204
error = self.y_np - self.y_est # vector de errores
205
self.SCR = np.sum(np.square(error)) # Suma del Cuadrado de los Residuos
206
SCT = np.sum(np.square(self.y_np - np.mean(self.X_np) )) # Suma de Cuadrados Total
207
208
self.R2 = 1 - self.SCR/SCT
209
210
211
#################
212
### root MSE ###
213
214
for i in error.values:
215
216
suma = 0
217
suma = np.sqrt( suma + (i**2) / self.X_np.shape[0] )
218
219
self.rootMSE = suma.tolist()
220
221
222
######### MÉTODO 5 ###############################################
223
224
def output( self ):
225
226
self.beta_OLS_Reg()
227
self.R2_rootMSE()
228
self.var_stderrors_cfdinterval()
229
230
# var y beta
231
beta_OLS = self.beta_OLS.values.reshape( -1, 1 ) # -1 significa cualquier número de filas
232
var_OLS = self.var_OLS.values
233
234
# standard errors
235
beta_stderror = np.sqrt( np.diag( var_OLS ) )
236
237
# confidence interval
238
up_bd = beta_OLS.ravel() + 1.96*beta_stderror
239
lw_bd = beta_OLS.ravel() - 1.96*beta_stderror
240
241
table_data2 = {'Coef.' : beta_OLS.ravel(),
242
'Std.Err.' : beta_stderror.ravel(),
243
'[0.025' : lw_bd.ravel(),
244
'0.975]' : up_bd.ravel(),
245
'R2' : self.R2,
246
'rootMSE' : self.rootMSE}
247
248
return table_data2
249
250
251
###############################################################################
252
253
# leemos las base de datos sin cambiar nombre de usuario
254
user = os.getlogin() # Username
255
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4") # Set directorio
256
cps2012_env = pyreadr.read_r("../data/cps2012.Rdata") # output formato diccionario
257
cps2012 = cps2012_env[ 'data' ] # extrae iformación almacenada en la llave data del diccionario cps2012_env
258
259
# Borrar variables constantes: filtra observaciones que tenga varianza diferente a cero
260
variance_cols = cps2012.var().to_numpy() # to numpy
261
dataset = cps2012.iloc[ :, np.where( variance_cols != 0 )[0] ] # filtra observaciones que tenga varianza diferente a cero
262
263
# genero un dataset con 10 columnas del dataset general
264
X = dataset.iloc[:, 1:]
265
y = dataset[['lnw']].squeeze() # convirtiendo a serie
266
267
268
##########################
269
# Probando nuestra Class #
270
##########################
271
272
# asignando clase, ya sea por nombre o posición de variables
273
reg1 = OLSRegClass (X, y, ['female', 'widowed', 'divorced', 'separated', 'nevermarried'])
274
reg1 = OLSRegClass (X, y, range(0,5))
275
276
# Ejecutando Método 1
277
reg1.beta_OLS_Reg()
278
279
# Ejecutando Método 2
280
reg1.var_stderrors_cfdinterval()
281
reg1.var_OLS
282
reg1.beta_se
283
reg1.confiden_interval
284
285
# Ejecutando Método 3
286
reg1.robust_var_se_cfdinterval()
287
reg1.robust_var
288
289
# Ejecutando Método 4
290
reg1.R2_rootMSE()
291
reg1.R2
292
reg1.rootMSE
293
294
# Ejecutando Método 5
295
reg1.output()
296
297