Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG5/Grupo 3_py_ejercicio 1.py
2714 views
1
#!/usr/bin/env python
2
# coding: utf-8
3
4
# In[1]:
5
6
7
# En caso el lector no cuente con el pyreadr, puedes instalarlo de la siguiente manera
8
9
10
# In[2]:
11
12
13
pip install pyreadr
14
15
16
# In[8]:
17
18
19
#Antes de empezar, tenemos que primero importar las librerias de las cuales haremos uso, entre ellas están pandas, os, pyreadr , scipy.stats y numpy
20
21
22
# In[9]:
23
24
25
import numpy as np
26
import os
27
import pyreadr
28
import pandas as pd
29
import scipy.stats as stats
30
from scipy.stats import t
31
32
33
# In[15]:
34
35
36
class OLS_Grupo3 (object)
37
38
39
# In[11]:
40
41
42
def __init__( self, X:pd.Dataframe, y:pd.Series, lista, RobustStandardError = True):
43
44
45
# In[ ]:
46
47
48
#Si en caso nos sale error, utilizamos los siguientes códigos:
49
50
51
# In[ ]:
52
53
54
if not isinstance( X, pd.Dataframe ) :
55
raise TypeError ( 'X debería ser un pd.Dataframe')
56
57
if not isinstance( y, pd.Series ) :
58
raise TypeError('y debería ser una pd.Series')
59
60
61
# **Entonces, para privatizar los atributos, le anteponemos un guión al self.X:**
62
63
# In[ ]:
64
65
66
self._X = X.loc[:, lista]
67
68
self._X = X.iloc[:, lista]
69
self.y = y
70
71
self.RobustStandardError = RobustStandardError
72
73
self._X[ 'intercepto' ] = 1
74
75
cols = self._X.columns.tolist()
76
77
new_cols_orders = [cols[ -1 ]] + cols[ 0:-1]
78
79
80
# In[ ]:
81
82
83
#Se hace uso de .loc para poder filtrar por nombres:
84
85
self._X = self._X.loc[ :, new_cols_orders ]
86
87
#Creación de nuevos atributos:
88
89
#Si queremos pasar de un dataframe a un multi array, usamos:
90
91
self._X_np = self._X.values
92
93
#Si queremos pasar de un objeto serie a un array, usamos:
94
95
self.y_np = y.values.reshape( -1 , 1 )
96
97
#Posteriormente, usamos:
98
99
self.columns = self._X.columns.tolist()
100
101
self.n = self._X.shape[0]
102
103
k = self._X.shape[1]
104
105
self.nk = self.n - k
106
107
108
# **Empezamos a privatizar los métodos:**
109
110
# In[17]:
111
112
113
#Método 1: Un método debe estimar los coeficientes de la regresión
114
115
def OLS_BETA_Grupo3( self ):
116
117
X_np = self._X_np
118
y_np = self.y_np
119
120
beta_ols = np.Linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )
121
122
index_names = self.columns
123
124
beta_OLS_output = pd.DataFrame( beta_ols, index = index_names, columns = [ 'Coef.'] )
125
126
self.beta_OLS - beta_OLS_output
127
128
return beta_OLS_output
129
130
131
# In[ ]:
132
133
134
#Método 3: Un método que halle la matriz de varianza y covarianza robusta, los errores estándar de cada coeficiente, e intervalos de confianza.
135
136
def M_ROBUST_COV(self):
137
138
self.beta_OLS_Grupo3()
139
140
#Haremos uso de atributos que ya se han mencionado anteriormente:
141
142
X_np = self._X_np
143
y_np = self.y_np
144
145
#El cálculo de la varianza robusta es el siguiente:
146
147
self.y_est = X_np @ self.beta_OLS
148
149
matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))
150
151
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)
152
153
154
# In[ ]:
155
156
157
#Método 4: Un método que halle el R2, root MSE (mean square error)
158
159
#Los pasos para hallar el R2 son los siguientes:
160
161
def R2(self):
162
163
self.coeficientes()
164
y_est = self.X1 @ self.beta
165
error = self.Y1 - y_est
166
self.SCR = np.sum(np.square(error))
167
SCT = np.sum(np.square(self.Y1 - np.mean(self.Y1)))
168
R2 = 1 - self.SCR/SCT
169
170
return R2
171
172
#Los pasos para hallar el root MSE son los siguientes:
173
174
#Hay un paquete que nos permite encontrar el root MSE, por tanto, hacemos uso de él de la siguiente forma:
175
176
from sklearn.metrics import mean_squared_error
177
178
def rootMSE(true,predicted):
179
180
rootMSE = mean_squared_error(true,predicted, squared=False)
181
182
return rootMSE
183
184
185
# **Para terminar de privatizar un método, se tiene que hacer uso de la instancia _slot_**
186
187
# In[18]:
188
189
190
class RegClass: Ols_Grupo3
191
192
# A continuación colocamos la instancia __slot__ con todos los atributos que hemos creado para nuestra clase
193
194
__slots__ = [ '__X', 'y', 'intercept', 'X_np', 'y_np', 'columns', 'beta_OLS']
195
196
def __init__( self, X : pd.DataFrame , y : pd.Series , intercept = True ):
197
198
self.__X = X
199
self.y = y
200
self.intercetp = intercet
201
202
203