Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG4/GRUPO2_Tarea 4.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
Ejercicio Número 4 (WG4)
4
5
@author: Grupo 2
6
"""
7
8
9
import numpy as np
10
import pandas as pd
11
from pandas import DataFrame, Series
12
import statistics
13
import inspect # Permite conocer los argumentos de una función , classes, etc
14
import pyreadr # Load R dataset
15
import os # for usernanme y set direcotrio
16
from scipy.stats import t # t - student
17
18
user = os.getlogin() # Username
19
20
# Set directorio
21
22
os.chdir(f"C:/Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4") # Fijar 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
"""
33
1- Un método debe estimar los coeficientes de la regresión
34
2- Un método que permita hallar la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza.
35
3- Un método que halle la matriz de varianza y covarianza robusta, los errores estándar de cada coeficiente, e intervalos de confianza.
36
4- Un método que halle el R2, root MSE (mean square error)
37
5- Finalmente un método que muestre los siguientes resultados en un objeto diccionario:
38
39
coeficientes estimados, errores estándar e intervalos de confianza en un Dataframe
40
R2
41
root-MSE
42
"""
43
44
45
46
47
#creamos la clase
48
49
class OLS_Tarea(object):
50
def __init__(self, X:pd.DataFrame, Y:pd.Series, List, robustse = True):
51
52
self.X = X.loc[:, List] #asigno mi atributo X
53
self.Y = Y #asigno mi atributo y
54
self.robustse = robustse #asigno mi atributo robustse
55
56
#Incluye una columna de unos en nuestra dataframe X
57
self.X['Intercept'] = 1
58
59
#para que la columna intercept aparezca en la primera columna:
60
cOLS = self.X.columns.tolist() #esto convierte el nombre de las columnas a lista
61
new_cOLS_orders = [cOLS[-1]] + cOLS[0:-1] #esto mueve la última columna(intercept) al inicio, para ello se ordena primero col[-1] y luego col[0:-1]
62
63
#usamos .loc para filtrar por nombre de filas o columnas
64
self.X = self.X.loc[ :, new_cOLS_orders]
65
66
#Creamos nuevos atributos:
67
#para pasar de dataframe a multi array:
68
self.X_np = self.X.values
69
#para pasar de objeto serie a array columna:
70
self.Y_np = Y.values.reshape(-1,1)
71
#nombramos a la base de datos como objeto lista:
72
self.columns = self.X.columns.tolist()
73
self.n = self.X.shape[0]
74
k = self.X.shape[1]
75
self.nk = self.n - k
76
77
#1- Un método debe estimar los coeficientes de la regresión
78
79
def coeficientes(self):
80
81
#número de observaciones
82
X1 = self.X_np #matriz de Xs incluyendo intercepto
83
Y1 = self.Y_np
84
beta = np.linalg.inv(X1.T @ X1) @ ((X1.T) @ Y1 )
85
86
index_names = self.columns
87
# Output
88
beta_OLS_output = pd.DataFrame( beta , index = index_names , columns = [ 'Coef.' ] )
89
90
# Dataframe de coeficientes como atributo
91
92
self.beta_OLS = beta_OLS_output
93
94
return beta_OLS_output
95
96
#2- Un método que permita hallar la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza.
97
98
def metodo2(self):
99
100
101
#corremos la función anterior de coeficientes
102
self.coeficientes()
103
104
X_np = self.X_np
105
Y_np = self.Y_np
106
107
#Beta_OLS
108
beta_OLS = self.beta_OLS.values.reshape( -1, 1) #Pasamos de dataframe a un vector columna
109
110
#hallamos los errores
111
e= Y_np - (X_np @ beta_OLS)
112
113
114
N= X_np.shape [0]
115
parametros_totales = X_np.shape [1]
116
error_var = ( (e.T @ e)[0])/(N- parametros_totales)
117
118
#Hallamos la Varianza estandar
119
var_OLS = error_var * np.linalg.inv( X_np.T @ X_np)
120
121
#Sacamos el nombre de las columnas y asignamos un output que tenga la varianza
122
index_names = self.columns
123
var_OLS_output = pd.DataFrame(var_OLS, index=index_names, columns=index_names)
124
self.var_OLS = var_OLS_output
125
126
########Hallamos errores estandar
127
128
#Hallamos beta y var
129
beta_OLS= self.beta_OLS.values.reshape (-1,1)
130
var_OLS= self.var_OLS.values
131
132
#errores estandar
133
beta_errores= np.sqrt(np.diag(var_OLS))
134
tabla_data_1= { "Std.Err.": beta_errores.ravel()}
135
136
#definimos el nombre del indice
137
index_names0=self.columns
138
139
#definimos un pandas dataframe
140
self.beta_se= pd.DataFrame(tabla_data_1, index= index_names0)
141
142
####Hallamos intervalos de confianza
143
144
self.up_bd = beta_OLS.ravel() + 1.96*beta_errores
145
self.lw_bd = beta_OLS.ravel() - 1.96*beta_errores
146
147
tabla_data_2 ={"[0.025" : self.lw_bd.ravel(),
148
"0.975]" : self.up_bd.ravel()
149
}
150
151
#definimos el nombre del indice
152
index_names1 = self.columns
153
154
# defining un pandas dataframe
155
self.intervalo_confianza= pd.DataFrame(tabla_data_2, index = index_names1)
156
157
158
#Un método que halle la matriz de varianza y covarianza robusta, los errores estándar de cada coeficiente, e intervalos de confianza.
159
def metodo_robust(self):
160
161
# Corremos nuestra función de coeficientes
162
self.coeficientes()
163
164
#Asignamos atributos
165
X_np = self. X_np
166
Y_np= self.Y_np
167
168
#Hallamos nuestras varianzas robustas
169
#con nuestra matriz propuesta de White
170
171
y_est= X_np @ self.beta_OLS
172
173
matrix_robusta = np.diag(list ( map( lambda x: x**2, Y_np - y_est.values )))
174
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)
175
176
177
#Un método que halle el R2, root MSE (mean square error)
178
def R2_rMSE( self ) :
179
180
# Se corre la función beta OLS Reg
181
self.coeficientes() # run function
182
y_est = self.X_np @ self.beta_OLS
183
error = self.Y_np - y_est
184
self.SCR = np.sum(np.square(error))
185
SCT = np.sum(np.square(self.Y_np - np.mean(self.Y_np)))
186
self.rootMSE = np.sqrt(SCT/self.n)
187
self.R2 = 1 - self.SCR/SCT
188
189
190
#Finalmente un método que muestre los siguientes resultados en un objeto diccionario:
191
#coeficientes estimados, errores estándar e intervalos de confianza en un Dataframe
192
#R2
193
#root-MSE
194
195
def Table(self):
196
#run functions
197
self.R2_rMSE()
198
self.R2
199
self.coeficientes()
200
self.up_bd #Intervalo de confianza
201
self.lw_bd #Intervalo de confianza
202
203
scr= self.SCR
204
sigma= scr/ self.nk
205
Var = sigma*np.linalg.inv(self.X_np.T @ self.X_np)
206
sd = np.sqrt( np.diag(Var))
207
t_est = np.absolute(self.beta_OLS/sd)
208
pvalue = (1 - t.cdf(t_est, df=self.nk)) * 2
209
210
df = {"OLS": self.beta_OLS.flatten() , "standar_error" : sd.flatten(), "IC_up_bd": self.up_bd.flatten(),"IC_lw_bd": self.lw_bd.flatten(), "R2": self.R2.flatten() , "RootMSE": self.rootMSE.flatten()}
211
212
return df
213
214
#APLICACION DE LA CLASE EN NUESTRA DATA.
215
#COMO GRUPO APLICAMOS LOS METODOS; SIN EMBARGO TUVIMOS INCONVENIENTES PARA QUE
216
#LOS METODOS 3 Y 5 CORRAN.
217
218
219
cps2012.shape
220
variance_cols = cps2012.var().to_numpy() #saca la varianza de cada vector y lu vuelve array
221
222
Dataset = cps2012.iloc[ : , np.where( variance_cols != 0 )[0] ] #filtrame aquellas columnas que no tengan varianza (observaciones iguales)
223
224
X = Dataset.iloc[:,1:10]
225
Y = Dataset[['lnw']]
226
227
L1 = ['female','divorced','separated']
228
229
230
Reg1 = OLS_Tarea(X,Y,L1, robustse = True)
231
232
#aplicamos el metodo 1 y estimamos los betas
233
Reg1.coeficientes()
234
235
# aplicamos el metodo 2
236
Reg1.metodo2()
237
print('Betas')
238
print(Reg1.beta_OLS)
239
print('Variannza_OLS')
240
print(Reg1.var_OLS)
241
print('Intervalo_confianza')
242
print(Reg1.intervalo_confianza)
243
#aplicamos metodo 4 y hallamos los R
244
Reg1.R2_rMSE()
245
print('rootMSE')
246
print(Reg1.rootMSE)
247
print('R2')
248
print(Reg1.R2)
249
250
251