Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG4/Grupo 5_Tarea 4.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
Created on Fri Sep 23 17:53:59 2022
4
5
@author: Usuario
6
"""
7
8
import numpy as np
9
import pandas as pd
10
from pandas import DataFrame, Series
11
import statistics
12
import inspect
13
from scipy.stats import t # t - student
14
import os
15
import pyreadr
16
17
user = os.getlogin() # Username
18
print(user)
19
20
# Extraemos los datos del directorio
21
22
os.chdir(f"C:/Users/{user}/Documentos/GitHub/1ECO35_2022_2/Lab5")
23
cps2012_env = pyreadr.read_r("../data/cps2012.Rdata")
24
25
26
#Para crear W hay que hacer algo con listas
27
W = ['lnw','female','widowed', 'divorced', 'separated', 'nevermarried', 'hsd08', 'hsd911', 'hsg', 'cg', 'ad', 'mw', 'so', 'we', 'exp1', 'exp2', 'exp3', 'exp4', 'weight', 'ne', 'sc']
28
#W = [1.2.3]
29
30
class OLS(object):
31
32
def __init__(self, X:pd.DataFrame ,Y:pd.Series , W, robust_sd=False):
33
34
self.X = X
35
self.Y = Y
36
self.robust_sd = robust_sd
37
self.W = W
38
39
#Método 1
40
def Determinarcoeficientes(self): #Método 1
41
42
self.columns = self.X.columns.tolist() # nombre de la base de datos como objeto lista
43
44
self.n = self.X.shape[0] # numero de observaciones, # self.n "Se crea un nuevo atributo"
45
k = self.X.shape[1] + 1 #numero de variables y el intercepto
46
self.X1 = np.column_stack((np.ones(self.n ), self.X.to_numpy() )) # self.X.to_numpy() # DataFrame to numpy
47
self.Y1 = self.Y.to_numpy().reshape(self.n ,1) #reshape(-1 ,1)
48
49
self.beta = np.linalg.inv(self.X1.T @ self.X1) @ ((self.X1.T) @ self.Y1 )
50
self.nk = self.n - k
51
52
#Método 2
53
def Errorvarcovintcof(self):
54
55
if self.robust_sd:
56
57
self.y_est = self.X1 @ self.beta
58
self.error = self.Y1 - self.y_est
59
sigma_1 = sum(list( map( lambda x: x**2 , self.error) )) / self.nk
60
self.Var = sigma_1*np.linalg.inv(self.X.T @ self.X) #Matríz de varianzas y covarianzas caso no robusto
61
self.sd = np.sqrt( np.diag(self.Var) ) #Desviación estandar o errores estandar
62
self.límite_inferior = self.beta-1.96*self.sd
63
self.límite_superior = self.beta+1.96*self.sd
64
65
#Método 3
66
else:
67
68
self.y_est = self.X1 @ self.beta
69
self.error = self.Y1 - self.y_est
70
matrix_robust = np.diag(list( map( lambda x: x**2 , self.error)))
71
self.Var = np.linalg.inv(self.X.T @ self.X) @ self.X.T @ matrix_robust @ self.X @ np.linalg.inv(self.X.T @ self.X)
72
self.sd = np.sqrt( np.diag(self.Var) )
73
74
self.límite_inferior = self.beta-1.96*self.sd
75
self.límite_superior = self.beta+1.96*self.sd
76
77
#Método 4
78
def R2yMSE(self):
79
80
self.Determinarcoeficientes() # run function
81
self.Errorvarcovintcof()
82
83
#SCR = sum(list( map( lambda x: x**2 , self.error)))
84
#SCT = sum(list( map( lambda x: x**2 , self.Y - np.mean(self.y_est))))
85
#R2 = 1 - self.SCR/self.SCT
86
87
#y_est = self.y_est
88
#error = self.error
89
self.SCR = np.sum(np.square(self.error))
90
self.rmse = (self.SCR/self.n)**0.5
91
SCT = np.sum(np.square(self.Y1 - np.mean(self.Y1)))
92
93
self.R2 = 1 - self.SCR/SCT
94
95
return self.R2
96
97
#Método 5
98
def Table(self, **Kargs):
99
100
W = ['lnw','female','widowed', 'divorced', 'separated', 'nevermarried', 'hsd08', 'hsd911', 'hsg', 'cg', 'ad', 'mw', 'so', 'we', 'exp1', 'exp2', 'exp3', 'exp4', 'weight', 'ne', 'sc']
101
# Lo agregamos, pero no lo usamos. Lo lamento Roberto, se nos acababa el tiempo.
102
103
self.R2yMSE()
104
self.Determinarcoeficientes()
105
r2= self.R2
106
scr = self.SCR
107
sigma = scr / self.nk
108
Var = self.Var #sigma*np.linalg.inv(self.X1.T @ self.X1)
109
sd = self.sd #np.sqrt( np.diag(Var) )
110
lower_bound = self.límite_inferior
111
upper_bound = self.límite_superior
112
rmse = self.rmse #(scr/self.n)**0.5
113
114
if (Kargs['Output'] == "DataFrame"):
115
116
df = pd.DataFrame( {"OLS": self.beta.flatten() , "standar_error": sd.flatten() , "Lower_bound": lower_bound.flatten() , "Upper_bound": upper_bound.flatten() })
117
118
#self.beta.flatten() # multy-array a simple array
119
120
elif (Kargs['Output'] == "Diccionario"):
121
122
df = pd.DataFrame({"OLS": self.beta.flatten() , "standar_error": sd.flatten() , "Lower_bound": lower_bound.flatten() , "Upper_bound":upper_bound.flatten() })
123
124
df_1 = { "Root_MSE":rmse.flatten() } #R2"R2": R2.flatten()
125
126
df_2 = { "R2": r2.flatten() }
127
128
return df
129
130
cps2012_env # es un diccionario. En la llave "data" está la base de datos
131
cps2012 = cps2012_env[ 'data' ] # extrae información almacenada en la llave data del diccionario cps2012_env
132
dt = cps2012.describe()
133
cps2012.shape
134
135
variance_cols = cps2012.var().to_numpy() # to numpy
136
137
Dataset = cps2012.iloc[ : , np.where( variance_cols != 0 )[0] ]
138
139
X = Dataset.iloc[:,1:10]
140
Y = Dataset[['lnw']]
141
142
Reg1 = OLS(X,Y, W, robust_sd=True)
143
144
#Comprobaciones
145
Reg1.Determinarcoeficientes()
146
Reg1.X
147
Reg1.beta
148
149
Reg1.Errorvarcovintcof()
150
Reg1.error
151
Reg1.Var
152
Reg1.límite_inferior
153
Reg1.límite_superior
154
155
Reg1.R2yMSE()
156
Reg1.rmse
157
158
Reg1.Table(Output = "Diccionario")
159
160