Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG4/Grupo_9_spyderv2.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
Created on Wed Sep 21 17:03:33 2022
4
5
@author: JCarlosHPCorei3
6
"""
7
8
import pandas as pd
9
import numpy as np
10
import pyreadr
11
import os # for usernanme y set direcotrio
12
13
user = os.getlogin() # Username
14
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4")
15
cps2012_env = pyreadr.read_r("../data/cps2012.RData")
16
type(cps2012_env) #diccionario
17
cps2012 = cps2012_env['data'] #se puede leer en dataframe ahora
18
19
#Limpieza de base
20
cps2012.drop(['year'], axis=1, inplace = True ) #dropear columna de año 2012 para todos los valores
21
cps2012['married'] = cps2012['married'].astype('int') #convertir bool en enteros
22
cps2012['ne'] = cps2012['ne'].astype('int')
23
cps2012['sc'] = cps2012['sc'].astype('int')
24
cps2012=cps2012.head(2000)
25
26
#Se pide mostrar DataFrame de variables explicativas
27
X = cps2012.iloc[ : , 1: ]
28
29
#Se pide lista de valores para seleccionar 'x' de la Dataframe de variables explicativas
30
lista = [ 1, 5, 17,20] #lista con valores de 0-20
31
32
#Se pide el vector de la variable Y
33
y = cps2012.iloc[:, 0]
34
y
35
36
class RegClass( object ): # == RegClass():
37
38
def __init__( self, X : pd.DataFrame , y : pd.Series , lista: list, robust = True ):
39
40
if not isinstance( X, pd.DataFrame ):
41
raise TypeError( "X must be a pd.DataFrame." )
42
43
if not isinstance( y , pd.Series ):
44
raise TypeError( "y must be a pd.Series." )
45
46
# asignando los cuatro atributos de la clase:
47
self.X = X
48
self.y = y
49
self.lista = lista
50
self.robust = robust
51
52
# agregar columna de unos en self.X:
53
self.X[ 'Intercept' ] = 1 #agrega columnas de puros 1s con nombre de intercepto
54
cols = self.X.columns.tolist() #sale las etiquetas
55
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] #hace que intercepto salga 1ero
56
# cols[ -1 ]: la última, sale "Intercept", cols[ 0:-1 ]: son todas las etiquetas, menos la ultima
57
self.X = self.X.loc[ : , new_cols_orders ] #ahora sí con todos los datos, intercepto 1ero
58
59
60
# agregar variables de x seleccionadas, y y nombres de x
61
self.X_np=self.X.iloc[:,lista].values #creo q' son todas las filas y valores del # de columnas especificadas de la lista
62
self.y_np=y.values.reshape(-1,1) #lo hizo vector
63
self.columns=self.X.iloc[:,lista].columns.tolist() #sale ['exp3', 'ne', 'ad', 'we']-->sera el nombre de columnas
64
65
def reg_beta_OLS( self ):
66
67
# reasignar nombres a atributos
68
X_np=self.X_np
69
y_np=self.y_np
70
71
# beta_ols
72
beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np ) #sale en vector
73
self.beta_ols=beta_ols
74
75
# columnas de X
76
index_names = self.columns
77
78
# Output
79
beta_OLS_output = pd.DataFrame( beta_ols , index = index_names , columns = [ 'Coef.' ] ) #p/ q' ahora salga en tabla, el nombre de la columan es coef
80
81
# agregar Dataframe de coeficientes como atributo
82
self.beta_OLS_output = beta_OLS_output
83
84
return beta_OLS_output
85
86
def var_standar(self):
87
88
#llamar método anterior
89
self.reg_beta_OLS()
90
91
#reasignar nombres a atributos del método anterior
92
X_np = self.X_np
93
y_np = self.y_np
94
beta_OLS = self.beta_OLS_output.values.reshape(- 1, 1) # convierte dataframe en vector
95
96
#### Operaciones ####
97
e = y_np - ( X_np @ beta_OLS ) # vector de errores: error_i = Y_i - Y_estimado_i
98
self.e=e
99
100
N = X.shape[ 0 ] # numero de filas
101
k = X.shape[ 1 ] # numero de columnas
102
ee=(e.T @ e)[ 0 ] # sumatoria e^2 ... q' es [0]? si lo quitas, es vector, si pones 1 no sale
103
self.ee=ee
104
error_var = (ee)/( N - k ) # s^2= e^2/(n-k)...sale vector de 1 valor
105
106
### 1. matriz de varianza y cov estándar ###
107
var_OLS = error_var*np.linalg.inv( X_np.T @ X_np ) # var_OLS(betas) = s^2 * (X'X)-1....sale vector 4x4 creo
108
109
### 2. error estandar de cada coeficiente ###
110
sd = np.sqrt( np.diag(var_OLS) ) # desv(betas)=diagonal_var(betas)^(1/2)... np.diag toma la diagonal de la matriz
111
self.sd=sd
112
113
### 3. intervalos de confianza ###, salen en vectores
114
superior= beta_OLS.ravel() + 1.96 * sd #ravel() lo volvio vector (de 1x4)
115
self.superior=superior
116
inferior= beta_OLS.ravel() - 1.96 * sd
117
self.inferior=inferior
118
119
120
def var_robust(self):
121
122
#llamar a método anterior
123
self.reg_beta_OLS()
124
125
#y reasignar nombres a atributos del método anterior
126
X_np = self.X_np
127
y_np = self.y_np
128
beta_OLS = self.beta_OLS_output.values.reshape(- 1, 1) # convertir dataframe a vector
129
130
#### Operaciones ####
131
e = y_np - ( X_np @ beta_OLS ) # vector de errores: error_i = Y_i - Y_estimado_i
132
self.e=e
133
134
N = X.shape[ 0 ] # numero de filas
135
ee=(e.T @ e)[ 0 ] # sumatoria e^2
136
self.ee=ee
137
138
self.w=np.eye(N)*ee #np.eye(N): sale matris I 2000x2000 => ese ee sale en diagonal, repetido
139
140
### 1. matriz de varianza y cov robusta ###
141
var_robust=np.linalg.inv(X_np.T @ X_np) @ X_np.T @(np.eye(N)*ee) @ X_np @ np.linalg.inv(X_np.T@X_np)
142
#=(X'X)^-1 *X'I*ee*X(X'X)^-1 o (X'X)^-1 *X'w*X(X'X)^-1
143
144
self.vr=var_robust # var_OLS(betas) = (X'X)-1* X' * White * X * (X'X)-1
145
146
### 2. error estandar de cada coeficiente ###
147
sd = np.sqrt( np.diag(var_robust) ) # desv(betas)=var(betas)^(1/2)
148
self.sd=sd
149
150
### 3. intervalos de confianza ###
151
superior= beta_OLS.ravel() + 1.96 * sd
152
self.superior=superior
153
inferior= beta_OLS.ravel() - 1.96 * sd
154
self.inferior=inferior
155
156
def reg_estad(self):
157
158
#llamar a método anterior
159
self.reg_beta_OLS()
160
161
N = self.X_np.shape[ 0 ] # Numero de filas
162
163
y_est=self.X_np @ self.beta_ols # fila de Y_estimados
164
165
self.SCR = np.sum(np.square(self.y_np - y_est )) # Sumatoria Cuadrado de Residuos
166
167
self.SCT = np.sum(np.square(self.y_np - np.mean(y_est))) # Sumatoria Cuadrado Totales
168
169
#### Root-MSE ####
170
root_mse = np.sqrt(self.SCT/ N)
171
self.root_mse=root_mse
172
173
#### R cuadrado #### *****
174
R2 = 1- self.SCR/self.SCT
175
self.R2=R2
176
177
fit = {"Root_MSE":root_mse, "R2": R2}
178
179
return fit
180
181
def reg_OLS(self):
182
183
# a. Se corren las funciones y ordenan valores para colocarlos en una tabla:
184
self.reg_estad()
185
self.reg_beta_OLS()
186
187
# a.1. coeficiente estimados
188
beta_ols = self.beta_ols
189
190
# b. Varianza de acuerdo a errores estandar o robustos
191
192
# b.1. errores estandar y límites
193
self.var_standar()
194
195
sd_standar=self.sd.reshape( -1, 1 )
196
197
superior_standar=self.superior.reshape( -1, 1 )
198
inferior_standar=self.inferior.reshape( -1, 1 )
199
200
# b.2. errores robustos y límites
201
self.var_robust()
202
203
sd_robust=self.sd.reshape( -1, 1 )
204
205
superior_robust=self.superior.reshape( -1, 1 )
206
inferior_robust=self.inferior.reshape( -1, 1 )
207
208
# c. Colocar valores en una tabla de acuerdo a errores estandar o robustos
209
210
if self.robust:
211
table_data ={ "Coef." : beta_ols.ravel() ,
212
"Std.Err." : sd_standar.ravel(),
213
"Interv. sup." : superior_standar.ravel(),
214
"Interv. inf." : inferior_standar.ravel() }
215
216
# d. crear dataframe
217
reg_OLS = pd.DataFrame( table_data , index = self.columns )
218
219
# e. crear diccionario
220
dic = {"OLS": reg_OLS, "root MSE": self.root_mse, "R2": self.R2}
221
222
else:
223
table_data ={ "Coef." : beta_ols.ravel() ,
224
"Std.Err." : sd_robust.ravel(),
225
"Interv. sup." : superior_robust.ravel(),
226
"Interv. inf." : inferior_robust.ravel() }
227
228
# d. crear dataframe
229
reg_OLS = pd.DataFrame( table_data , index = self.columns )
230
231
# e. crear diccionario
232
dic = {"OLS": reg_OLS, "root MSE": self.root_mse, "R2": self.R2}
233
234
return dic
235
236
#DEMOSTRACIÓN:
237
A = RegClass( X, y ,lista, robust=True) # correr datos
238
A
239
240
#Usando funcion general
241
A.X_np
242
243
#Usando la funcion reg_beta_OLS para hallar los coeficientes betas estimados
244
A.reg_beta_OLS()
245
246
#Usando la funcion var_standar
247
A.var_standar()
248
A.superior # límite superior
249
250
#Usando la funcion var_robust
251
A.var_robust()
252
A.superior # límite superior
253
254
#Usando la funcion reg_OLS para ver el diccionario que incluye:
255
A = RegClass( X, y ,lista, robust=True)
256
A.reg_OLS() # diccionario cuando hay evaluación con errores robustos
257
258
A.reg_OLS()['OLS'] #ver primer elemento del diccionario que es un dataframe
259
260
A = RegClass( X, y ,lista,robust=False)
261
A.reg_OLS() # diccionario cuando hay evaluación estandar
262