Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG4/Grupo_8_py.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
4
@author: grupo 8
5
6
"""
7
8
import numpy as np
9
import pandas as pd
10
import os
11
import scipy.stats as stats
12
from scipy.stats import t
13
14
15
import pyreadr # Load R dataset
16
import os # for usernanme y set directorio
17
18
user = os.getlogin() # Username
19
20
# Set directorio
21
22
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2") # Set directorio
23
24
cps2012_env = pyreadr.read_r("data/cps2012.Rdata") # output formato diccionario
25
26
27
cps2012_env # es un diccionario. En la llave "data" está la base de datos
28
cps2012 = cps2012_env[ 'data' ] # extrae información almacenada en la llave data del diccionario cps2012_env
29
dt = cps2012.describe()
30
31
32
#Creamos la clase
33
34
class OLSRegClass(object):
35
def __init__(self, x:pd.DataFrame, y:pd.Series, lista, RobustStandardError=True):
36
#x:pd.DataFrame nos indica que debe ser un DataFrame
37
#y:pd.Series nos indica que debe ser una serie
38
#Condicional para el x:pd.DataFrame
39
if not isinstance(x, pd.DataFrame):
40
raise TypeError("x debe ser pd.DataFrame.")
41
42
#Condicional para el y:pd.Series
43
if not isinstance(y, pd.Series):
44
raise TypeError("y debe ser pd.Series.")
45
46
#Condicional para el y:pd.Series
47
if not isinstance(lista, pd.Series):
48
raise TypeError("lista debe ser pd.Series")
49
50
#Ahora asignamos atributos de la clase
51
try:
52
self.x = x.loc[:, lista]
53
except:
54
self.x = x.iloc[:, lista]
55
56
self.y = y
57
self.RobustStandardError = RobustStandardError
58
59
#Ahora incluimos una columna de unos para el intercepto
60
self.x['Intercept'] = 1
61
62
#para que la columna intercept aparezca en la primera columna:
63
col = self.x.columns.tolist() #esto convierte el nombre de las columnas a lista
64
new_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]
65
66
#usamos .loc para filtrar por nombre de filas o columnas
67
self.x = self.x.loc[ :, new_col_orders]
68
69
#Creamos nuevos atributos:
70
#para pasar de dataframe a multi array:
71
self.x_np = self.x.values
72
#para pasar de objeto serie a array columna:
73
self.y_np = y.values.reshape(-1,1)
74
#nombramos a la base de datos como objeto lista:
75
self.columns = self.x.columns.tolist()
76
77
#METODO 1
78
79
def beta_OLS_Reg(self):
80
x_np = self.x_np
81
y_np = self.y_np
82
83
beta_ols = np.linalg.inv(x_np.T@x_np) @ (x_np.T@y_np)
84
85
#Hay que asignar al output de la función def beta_OLS(self): como atributo self.beta_Ols
86
index_names = self.columns
87
beta_OLS_output = pd.DataFrame(beta_ols, index = index_names, columns = ['Coef.'])
88
self.beta_OLS = beta_OLS_output
89
90
return beta_OLS_output
91
92
93
#METODO 2
94
95
def var_errorest_interv(self):
96
97
####Matriz de varianza y covarianza estándar####
98
99
#corremos la función beta_OLS
100
self.beta_OLS_Reg()
101
102
X_np = self.X_np
103
y_np = self.y_np
104
105
#Beta_OLS
106
beta_OLS = self.beta_OLS.values.reshape( -1, 1) #Pasamos de dataframe a un vector columna
107
108
#errores
109
e= y_np - (X_np @ beta_OLS)
110
111
#
112
N= X_np.shape [0]
113
parametros_totales = X_np.shape [1]
114
error_var = ( (e.T @ e)[0])/(N- parametros_totales)
115
116
#Varianza estandar
117
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np)
118
119
#asignaremos output
120
index_names = self.columns
121
var_OLS_output = pd.DataFrame(var_OLS, index=index_names, columns=index_names)
122
self.var_OLS = var_OLS_output
123
124
####ERRORES ESTANDAR####
125
126
#beta y var
127
beta_OLS= self.beta_OLS.values.reshape (-1,1)
128
var_OLS= self.var_OLS.values
129
130
#errores estandar
131
beta_errores= np.sqrt(np.diag(var_OLS))
132
tabla_data_1= { "Std.Err.": beta_errores.ravel()}
133
134
#definimos index names
135
index_names0=self.columns
136
137
#definimos un pandas dataframe
138
self.beta_se= pd.DataFrame(tabla_data_1, index= index_names0)
139
140
####INTERVALOS DE CONFIANZA####
141
142
up_bd = beta_OLS.ravel() + 1.96*beta_errores
143
lw_bd = beta_OLS.ravel() - 1.96*beta_errores
144
145
tabla_data_2 ={"[0.025" : lw_bd.ravel(),
146
"0.975]" : up_bd.ravel()
147
}
148
149
# definiendo index names
150
index_names1 = self.columns
151
152
# defining a pandas dataframe
153
self.intervalo_confianza= pd.DataFrame(tabla_data_2, index = index_names1)
154
155
156
#METODO 3
157
def robust_var_se_cfdinterval(self):
158
159
# Función beta OLS para estimar el vector de coeficientes
160
self.beta_OLS_Reg()
161
162
#atributos
163
X_np = self. X_np
164
Y_np= self.Y_np
165
166
####VAR ROBUSTA####
167
#matriz propuesta de White
168
169
y_est= X_np @ self.beta_OLS
170
171
matrix_robusta = np.diag(list ( map( lambda x: x**2, Y_np - y_est.values )))
172
self.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)
173
174
175
176
#METODO 4
177
def R2_raizMSE( self ) :
178
179
# Se corre la función beta OLS Reg
180
self. beta_OLS_Reg()
181
182
self.y_est = self.X_np @ self.beta_OLS
183
error = self.y_np - self.y_est
184
self.SCR = np. sum(np.square (error))
185
SCT= np. sum(np.square (self.y_np - np.mean (self.y_est) ))
186
187
self.R2 = 1 - self.SCR/SCT
188
189
for i in error. values:
190
suma = 0
191
suma = np.sqrt( suma + (i**2) / self. X_np. shape [0] )
192
193
self.rootMSE = suma. tolist()
194
195
196
197
#metodo 5###########
198
def output(self):
199
self.beta_OLS_Reg()
200
self.R2_raizMSE()
201
self.var_errorest_interv()
202
203
#var y beta
204
beta_OLS = self.beta_OLS.values.reshape(-1,1)
205
var_OLS = self.var_OLS.values
206
207
#Errores estandar
208
beta_errores = np.sqrt(np.diag(var_OLS))
209
210
#Intervalo de confianza
211
up_bd = beta_OLS.ravel() + 1.96*beta_errores
212
lw_bd = beta_OLS.ravel() - 1.96*beta_errores
213
214
tabla_data_3 = {'Coeficientes': beta_OLS.ravel(),
215
'Error estandar' :beta_errores.ravel(),
216
'[0.025': lw_bd.ravel(),
217
'0.975]': up_bd.ravel(),
218
'R2': self.R2,
219
'rootMSE' : self.rootMSE}
220
221
return tabla_data_3
222
223