Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG1/Grupo_9_py.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""
3
Trabajo Grupal_9
4
5
"""
6
#Importar galerias
7
import numpy as np
8
import pandas as pd
9
import random
10
from scipy.stats import t
11
12
#1.############################################################################
13
def function1(x):
14
for i in x:
15
if i in range(0,101):
16
print(np.sqrt(i))
17
18
elif i in range(101,301):
19
print(i-5)
20
21
elif i >300:
22
print(50)
23
24
#generar vector con numeros del 0 a 500 y con talla del vector de 20 datos
25
A=np.random.randint(0,501,20)
26
#aplicar la funcion creada
27
function1(A)
28
29
30
#2.############################################################################
31
def fescalar(M: np.ndarray,est = True): #condicionar a que sea vector o matriz
32
33
if not isinstance( M , np.ndarray ) :
34
raise TypeError( "Error: el tipo de variable no es un vector o matriz.")
35
36
elif est is False:
37
38
Z = np.zeros((M.shape[0], M.shape[1]))
39
for i in range(M.shape[1]):
40
a = np.ndarray.min(M[:,i])
41
b = np.ndarray.max(M[:,i])
42
Z[:,i] = np.around((M[:,i]-a)/(b-a),2)
43
44
return Z
45
46
elif est is True:
47
Z = np.zeros(M.shape[0])
48
for i in range(M.shape[0]):
49
a = np.ndarray.min(M)
50
b = np.ndarray.max(M)
51
Z[i] = round((M[i]-a)/(b-a),2)
52
53
return Z
54
55
56
#Caso matriz:
57
B=np.random.randint(1,100, size=(100,50))
58
print(fescalar(B, est=False))
59
60
#Caso vector:
61
C=np.random.randint(1,101,100)
62
print(fescalar(C, est=True))
63
64
65
66
#3.############################################################################
67
#Y, Proceso generador de datos con 5 variables (1 + x1 + x2 + x3 + x4 )
68
69
np.random.seed(170) #semilla
70
71
x1 = np.random.rand(10000) #uniforme distribucion
72
x2 = np.random.rand(10000)
73
x3 = np.random.rand(10000)
74
x4 = np.random.rand(10000)
75
x5 = np.random.rand(10000)
76
e = np.random.normal(0,1,10000) # normal distribution
77
78
79
Y = 1 + 0.8*x1 + 1.2*x2 + 0.5*x3 + 1.5*x4 + e
80
print(Y.size) #10 mil observaciones
81
82
#Informacion omitiendo una variable x4
83
mat = np.column_stack((Y, np.ones(10000),x1,x2,x3))
84
85
muestra = (10, 50, 80 , 120 , 200, 500, 800, 1000, 5000)
86
87
for m in muestra:
88
89
elegidos=random.sample(range(10000), m) #vector de indices de las posiciones de las observaciones elegidos en la muestra
90
observ= mat[elegidos,:] #matriz con observaciones elegidas
91
92
#vector de X
93
X = observ[:,1:]
94
#vector de Y
95
Y = observ[:,0]
96
97
#1. Construir beta
98
beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
99
beta
100
101
#2. Error estandar
102
y_est = X @ beta #2.b. Y estimado = vector
103
104
n = X.shape[0] #2.c. numero de observaciones
105
106
k = X.shape[1] - 1 #2.d. x - unos
107
108
nk = n - k #2.e. grados de libertad
109
110
sigma2 = sum(list( map( lambda x: x**2 , Y - y_est) )) / nk #2.f. SCR/ (n-k) = e'e /(n-k) = s^2 =sigma^2
111
112
Var = sigma2*np.linalg.inv(X.T @ X) #2.g. Var_Cov(betas) = s^2 * (X'X)-1
113
114
sd = np.sqrt( np.diag(Var) ) #2.h. desv(betas)=var(betas)^(1/2)
115
116
#3. Tamano de la muestra m
117
tamano=np.ones(len(beta))*m # se crea vector para colocarlo en la tabla
118
119
120
df = pd.DataFrame( {"Muestra_tamano": tamano, "OLS": beta , "standar_error" : sd })
121
print(df)
122
123
#4.
124
# Y, proceso generador de datos con 8 variables
125
126
np.random.seed(170)
127
128
x1 = np.random.rand(800)
129
x2 = np.random.rand(800)
130
x3 = np.random.rand(800)
131
x4 = np.random.rand(800)
132
x5 = np.random.rand(800)
133
x6 = np.random.rand(800)
134
x7 = np.random.rand(800)
135
e = np.random.normal(0,1,800) # normal distribution
136
137
Y = 1 + 0.8*x1 + 1.2*x2 + 0.5*x3 + 1.5*x4 + 2*x5 + 3*x6 + 1.5*x7 + e
138
print(Y.size) #800 observaciones
139
140
X = np.column_stack((np.ones(800),x1,x2,x3,x4,x5,x6,x7))
141
X
142
143
#1. Definir funcion
144
#Incluye,
145
#argumento de que incluye intercepto por default
146
#argumento de heterocedasticidad (es homocedastico por default)
147
148
def ols(M,Y, inter=True, homo=True):
149
150
#2. Estimaciones
151
#Beta
152
beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y ) #2.a. estimar beta
153
154
y_est = X @ beta #2.b. Y estimado y Y media
155
y_mean=np.mean(Y)
156
157
n = X.shape[0] #2.c. numero de observaciones
158
k = X.shape[1] - 1 #2.d. numeros de x - unos
159
nk = n - k #2.e. grados de libertad
160
161
ee= list( map( lambda x: x**2 , Y - y_est)) #2.f. Vector de residuos^2
162
163
SCR = sum(ee) #2.g. Sumatoria Cuadrado de Residuos
164
SCT = sum(list( map( lambda x: x**2 , Y - y_mean))) #2.h. Sumatoria Cuadrados Totales
165
166
# Root-MSE
167
root_mse = np.sqrt(SCR/ n)
168
169
# R cuadrado
170
R_cuadrado = 1- SCR/SCT
171
172
diccionario = {'R2': R_cuadrado ,'Rootmse': root_mse }
173
174
if inter and homo:
175
176
sigma2 = SCR / nk #2.f. SCR/ (n-k) = e'e /(n-k) = s^2
177
178
Var = sigma2*np.linalg.inv(X.T @ X) #2.g. Var_Cov(betas) = s^2 * (X'X)-1
179
180
sd = np.sqrt( np.diag(Var) ) #2.h. desv(betas)=var(betas)^1/2 , solo diag
181
182
t_est = np.absolute(beta/sd) #2.i. t_est = |beta-0|/sd ==> para cada beta
183
184
pvalue= (1 - t.cdf(t_est, df=nk) ) * 2 #2.j. p_value ==> para cada beta
185
186
superior= beta + 1.96 * sd #2.h. límites
187
inferior= beta - 1.96 * sd
188
189
df = pd.DataFrame( {"Estimacion_OLS": beta , "standar_error" : sd , "Pvalue" : pvalue, "Limit_sup": superior, "Limit_inf": inferior})
190
191
elif inter and (homo is False):
192
193
White= np.eye(n)*ee #2.a. Matriz de corrección de White
194
195
VarCorg=np.linalg.inv(X.T @ X) @ X.T @White @ X @ np.linalg.inv(X.T@X) #2.g. Var_Cov(betas) corregida
196
197
sd = np.sqrt( np.diag(VarCorg) ) #2.h. desv(betas)=var(betas)^1/2 , solo diag
198
199
t_est = np.absolute(beta/sd) #2.i. t_est =|beta-0|/sd ==> para cada beta
200
201
pvalue= (1 - t.cdf(t_est, df=nk) ) * 2 #2.j. p_value ==> para cada beta
202
203
superior= beta + 1.96 * sd #2.h limites
204
inferior= beta - 1.96 * sd
205
206
df = pd.DataFrame( {"Estimacion_OLS": beta , "standar_error" : sd , "Pvalue" : pvalue, "Limit_sup": superior, "Limit_inf": inferior})
207
208
print(df, "\n", diccionario)
209
210
211
212
#Caso homocedastico
213
ols(X,Y)
214
215
#Caso heterocedastico
216
ols(X,Y,homo=False)
217
#Cuando hay heterocedasticidad, la varianza modificada afecta el error estandar, pvalue, limites.
218
#No cambia los R2 y Rootmse pues solo explican como los betas estimados ajustan la linea de regresion,
219
#y con la matriz de white los betas no han cambiado.
220
221
222
223
224
225
226
227
228
229
230