Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG4/Grupo_6_jupyter.py
2714 views
1
#!/usr/bin/env python
2
# coding: utf-8
3
4
# In[4]:
5
6
7
import numpy as np
8
import pandas as pd
9
import scipy.stats import t
10
import pyreadr
11
import os
12
13
14
# In[2]:
15
16
17
class REGREE_OLS ( object ) :
18
# también podemos omitir object. pues es lo mismo
19
def __init__( self, X:pd.Dataframe, y:pd.Series, lista, RobustStandardError = True):
20
21
# INDICAMOS QUE "X" SEA UN DATA FRAME Y "Y" UNA LISTA.
22
23
## CON LO CUAL, PROPONEMOS UN CONDICIONAL PARA AMBOS// mensaje de error porsiaca #
24
25
if not isinstance( X, pd.Dataframe ) :
26
raise TypeError ( "X debería ser un pd.Dataframe.")
27
28
if not isinstance( y, pd.Series ) :
29
raise TypeError("y debería ser una pd.Series.")
30
31
# PROPONEMOS LOS ATRIBUTOS CORRESPONDIENTES
32
try:
33
self.X = X.loc[:, lista]
34
except:
35
self.X = X.iloc[:, lista]
36
self.y = y
37
38
self.RobustStandardError = RobustStandardError
39
40
self.X[ 'intercepto' ] = 1
41
42
cols = self.X.columns.tolist()
43
44
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1]
45
46
# CONVERTIMOS LOS NOMBRES A COLUMNAS
47
48
# FILTRAMOS LOS NOMBRES
49
50
self.X = self.X.loc[ :, new_cols_orders ]
51
52
self.X_np = self.X.values
53
54
self.y_np = y.values.reshape( -1 , 1 )
55
56
self.columns = self.X.columns.tolist()
57
58
59
# In[5]:
60
61
62
#### METODO 1 -> Estimar los coeficientes de la regresión ####
63
64
def REGRE_BETA_OLS( self ):
65
66
X_np = self.X_np
67
y_np = self.y_np
68
69
# beta_ols
70
71
beta_ols = np.Linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )
72
73
#OUTPUT
74
75
index_names = self.columns
76
beta_OLS_output = pd.DetaFrame( beta_ols, index = index_names, columns = [ 'Coef.'] )
77
self.beta_OLS - beta_OLS_output
78
79
return beta_OLS_output
80
81
82
# In[6]:
83
84
85
86
#### METODO 2 -> Matriz de varianza y covarianza estándar ####
87
88
def STDERROR_VAR_M( self ):
89
90
# VARIANZA:
91
92
# BUSCAMOS ESTIMAR EL ERROR
93
94
self.beta_OLS_Reg()
95
96
# SHORTCUT PARA LOS X_NP
97
X_np = self.X_np
98
y_np = self.y_np
99
100
# BETA_OLS
101
beta_OLS = self.beta_OLS.values.reshape( - 1, 1 )
102
103
X_np = self.X_np
104
y_np = self.y_yp
105
106
e = y_np - ( X_np @ beta_OLS )
107
# PARA EL ERROR DE LA VARIANZA
108
N = X_np.shape [ 0 ]
109
total_parameters = X_np.shape [1 ]
110
error_var = ( (e.T @ e) [0]) / (N - total_parameters)
111
112
# PARA LA VARIANZA
113
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )
114
115
# OUTPUT DE reg_var_OLS(setf): ATRIBUTO DE VAR
116
index_names = self. columns
117
var_OLS_output = pd.Dataframe( var_OLS, index = index_names, columns = index_names )
118
self.var_OLS = var_OLS_output
119
120
#ERROR ESTANDAR:
121
122
# VARIANZA
123
beta_OLS = self.beta_OLS.values.reshape( -1, 1 )
124
var_OLS = self.var_OLS.values
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
# CONFIANZA
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
#SEGUN LO PROPUESTO
142
143
# NOMBRE INDEX.
144
145
index_names1 = self.columns
146
147
# PANDA FRAME.
148
149
self.confiden_interval = pd.Dataframe( table_data1, index = index_names1 )
150
151
152
# In[7]:
153
154
155
156
#### MÉTODO 3 -> Un método que halle la matriz de varianza y covarianza robusta... ####
157
158
def M_ROBUST_COV(self):
159
# ESTIMACIÓN DEL VECTOR DE COEFICIENTES.
160
161
self.beta_OLS_Reg()
162
# usaré atributos pero con un nombre más simple
163
X_np = self.X_np
164
y_np = self.y_np
165
166
#VARIANZA ROBUSTA:
167
168
# matriz propuesta de White en muestras grandes
169
# V = np.zeros ((X_np.shape[1]. X_np. shape(1)))
170
171
172
self.y_est = X_np @ self.beta_OLS
173
174
matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))
175
176
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)
177
178
179
# In[8]:
180
181
182
183
#### METODO 4
184
185
# Se definirá un método que halle el R2 y MSE (mean square error)
186
187
def R2(self):
188
189
self.coeficientes()
190
y_est = self.X1 @ self.beta
191
error = self.Y1 - y_est
192
self.SCR = np.sum(np.square(error))
193
SCT = np.sum(np.square(self.Y1 - np.mean(self.Y1)))
194
R2 = 1 - self.SCR/SCT
195
196
return R2
197
198
#llamamos al paquete que nos permitirá encontrar el root MSE
199
from sklearn.metrics import mean_squared_error
200
201
#definimos el método
202
def rootMSE(true,predicted):
203
204
rootMSE = mean_squared_error(true,predicted, squared=False)
205
206
return rootMSE
207
208
209
# In[15]:
210
211
212
#### METODO 5
213
214
215
# In[14]:
216
217
218
#VAMOS A CARGAR LA BASE DE DATOS, CON LO CUAL UTILIZAREMOS USER ///
219
#CON ESTO, CORRE SIN NECESIDAD DE CAMBIAR EL NOMBRE DE USUARIO :D
220
221
user = os.getlogin()
222
os.chdir("C:\Users\User\Documents\GitHub\1ECO35_2022_2\Lab4")
223
224
cps2012_UNO = pyreadr.read_r("../data/cps2012.Rdata")
225
cps2012 = cps2012_UNO['data']
226
dt = cps2012.describe
227
228
#ES NECESARIO FILTRAR LAS VARIANZAS DISTINTAS A 0
229
variance_cols = cps2012.var().to_numpy()
230
dataset = cps2012.iloc[:, np.where(variance_cols !=0 )[0]]
231
## aca poner un dataset específico desde el geeneral, podría ser con iloc y squeeze()
232
233
234
# In[ ]:
235
236
237
238
239
240