Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Trabajo_grupal/WG1/Grupo_4_py.py
2714 views
1
# -*- coding: utf-8 -*-
2
"""#-------------------------------------------------------------------------------
3
4
5
TAREA 1- GRUPO 4
6
7
8
"""#--------------------------------------------------------------------------------
9
10
11
#%% PREGUNTA 1
12
13
14
#### Importamos las librerías correspondientes.
15
16
import numpy as np
17
import math
18
19
from numpy import random
20
21
22
#### Generamos un vector de 500 valores aleatorios, de donde se escogerán 20 datos
23
24
x=np.random.randint(500, size=(20))
25
26
print(x)
27
28
29
#### Construimos el primer if statement (w), que sacará la raíz cuadrada a cada uno de los elementos que cumplan con la condición de estar entre 0 y 100.
30
31
32
w = x**0.5
33
34
if (w < 100).all():
35
print("Number is smaller than one hundred")
36
37
elif (w > 0):
38
print("Number is greater than Zero")
39
40
else:
41
print("Number is Zero")
42
43
44
45
#### Construimos el segundo if statement (j), que le restará 5 a cada uno de los elementos que cumplan con la condición de tomar valores entre 100 y 300.
46
47
j= (x-5) .all()
48
if (j < 300):
49
print("Number is smaller than three hundred")
50
elif (j > 100):
51
print("Number is greater than one hundred")
52
else:
53
print("Number is Zero")
54
55
56
57
#### Construimos el último if statement (p), que igualará a 50 a cada uno de los elementos que cumplan con la condición de ser mayores a 300.
58
59
p = 50
60
if p > 300:
61
print(p, "is s greater than three hundred")
62
63
64
65
#%% PREGUNTA 2
66
67
#### Importamos las librerías necesarias
68
69
import numpy as np
70
from numpy import random
71
72
73
#### Creamos el vector con 100 observaciones enteras aleatorias
74
75
v=np.random.randint(100, size=(100))
76
77
print(v)
78
79
80
#### Creamos la matriz de 100 x 50 con observaciones enteras aleatorias
81
82
m=np.random.randint(0, 101, (100, 50))
83
84
print (m)
85
86
87
#### Creamos la función que nos diga si es una matriz o vector de tipo np.nd array y bote mensaje si no lo es
88
#### En caso el objeto sea un vector o matriz, la función hallará el valor del escalar y reajustará la matriz y vector de acuerdo a este, dando como resultado la matriz ajustada.
89
def escalar (M):
90
91
if not isinstance(M, np.ndarray ) :
92
raise TypeError( "x debe ser una matriz o vector")
93
94
95
else:
96
97
a = M.max(axis=0)
98
b = M.min(axis=0)
99
e = (M-b)/(a-b)
100
M=M*e
101
102
return M
103
104
105
#### Probamos la función en nuestro vector y obtenemos el vector ajustado por el escalar.
106
107
print (escalar(v))
108
109
#### Probamos la función en nuestra matriz y obtenemos la matriz ajustada por el escalar.
110
111
print (escalar(m))
112
113
#%% PREGUNTA 3
114
115
import numpy as np
116
import random
117
from scipy.stats import t # t - student
118
import pandas as pd
119
120
#número de observaciones= 10000
121
122
#fijamos una semilla
123
np.random.seed(175)
124
125
#creamos 5 variables, las cuales tienen una distribución uniforme de entre [0,1]
126
127
x1 = np.random.rand(10000)
128
print(x1)
129
x2 = np.random.rand(10000)
130
print(x2)
131
x3 = np.random.rand(10000)
132
x4 = np.random.rand(10000)
133
x5 = np.random.rand(10000)
134
e = np.random.normal(0,1,10000) # normal distribution mean = 0 and sd = 1
135
136
# El modelo sin contar a la explicativa x5 sería:
137
# Y = b1*x1 + b2*x2 + b3*x3 + b4*x4 + e
138
139
Y = 0.7*x1 + 1.6*x2 + 0.3*x3 + 1.8*x4 + e
140
141
X = np.column_stack((np.ones(10000),x1,x2,x3,x4,x5))
142
print(X)
143
144
beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
145
print(beta)
146
147
####Creamos una tupla con los tamaños de muestra
148
149
m = (10,50,80,120,200,500,800)
150
151
#### Con un m=10
152
153
w1=np.array(random.sample( range(10000) , m[0] ))
154
print(w1)
155
w2=np.array(random.sample(range(10000) , m[0] ))
156
w3=np.array(random.sample( range(10000) , m[0] ))
157
w4=np.array(random.sample( range(10000) , m[0] ))
158
w5=np.array(random.sample( range(10000) , m[0] ))
159
b = np.random.normal(0,1,m[0])
160
161
Y_1 = 0.7*w1 + 1.6*w2 + 0.3*w3 + 1.8*w4 + b
162
163
X_1 = np.column_stack((np.ones( m[0]),w1,w2,w3,w4,w5))
164
print(X_1)
165
166
beta1 = np.linalg.inv(X_1.T @ X_1) @ ((X_1.T) @ Y_1 )
167
print(beta1)
168
169
y_est_1 = X_1 @ beta1
170
n1 = X_1.shape[0]
171
k1 = X_1.shape[1] - 1
172
nk1 = n1 - k1
173
sigma = sum(list( map( lambda x: x**2 , Y_1 - y_est_1) )) / nk1
174
Var = sigma*np.linalg.inv(X_1.T @ X_1)
175
sd1 = np.sqrt( np.diag(Var) )
176
print(sd1)
177
178
#### Con un m=50
179
180
r1=np.array(random.sample( range(10000) , m[1] ))
181
r2=np.array(random.sample(range(10000) , m[1] ))
182
r3=np.array(random.sample( range(10000) , m[1] ))
183
r4=np.array(random.sample( range(10000) , m[1] ))
184
r5=np.array(random.sample( range(10000) , m[1] ))
185
l = np.random.normal(0,1,m[1])
186
187
Y_2 = 0.7*r1 + 1.6*r2 + 0.3*r3 + 1.8*r4 + l
188
189
X_2 = np.column_stack((np.ones( m[1]),r1,r2,r3,r4,r5))
190
print(X_2)
191
192
beta2 = np.linalg.inv(X_2.T @ X_2) @ ((X_2.T) @ Y_2 )
193
print(beta2)
194
195
y_est_2 = X_2 @ beta2
196
n2 = X_2.shape[0]
197
k2 = X_2.shape[1] - 1
198
nk2 = n2 - k2
199
sigma = sum(list( map( lambda x: x**2 , Y_2 - y_est_2) )) / nk2
200
Var = sigma*np.linalg.inv(X_2.T @ X_2)
201
sd2 = np.sqrt( np.diag(Var) )
202
print(sd2)
203
204
#### Con un m=80
205
206
f1=np.array(random.sample( range(10000) , m[2] ))
207
f2=np.array(random.sample(range(10000) , m[2] ))
208
f3=np.array(random.sample( range(10000) , m[2] ))
209
f4=np.array(random.sample( range(10000) , m[2] ))
210
f5=np.array(random.sample( range(10000) , m[2] ))
211
f = np.random.normal(0,1,m[2])
212
213
Y_3 = 0.7*f1 + 1.6*f2 + 0.3*f3 + 1.8*f4 + f
214
215
X_3 = np.column_stack((np.ones( m[2]),f1,f2,f3,f4,f5))
216
print(X_3)
217
218
beta3 = np.linalg.inv(X_3.T @ X_3) @ ((X_3.T) @ Y_3 )
219
print(beta3)
220
221
y_est_3 = X_3 @ beta3
222
n3 = X_3.shape[0]
223
k3 = X_3.shape[1] - 1
224
nk3 = n3 - k3
225
sigma = sum(list( map( lambda x: x**2 , Y_3 - y_est_3) )) / nk3
226
Var = sigma*np.linalg.inv(X_3.T @ X_3)
227
sd3 = np.sqrt( np.diag(Var) )
228
print(sd3)
229
230
231
sd=(sd1,sd2,sd3)
232
print(sd)
233
234
df = pd.DataFrame( {"tamaño de muestra": m , "standar_error" : sd ,
235
"coeficiente" : beta} )
236
237
#%% PREGUNTA 4
238
239
#### Importamos 'numpy' y 'random' como para poder generar una semilla aleatoria para producir números aleatorios "
240
import numpy as np
241
import random
242
import pandas as pd
243
from scipy.stats import t
244
import seaborn as sns
245
246
random.seed(175)
247
248
249
#### Crear un proceso generador de datos con 8 variables (intercepto y 7 explicativas) y 800 observaciones
250
#### Como queremos 800 observaciones, generaremos 800 números aleatorios que serán seleccionados dentro de las variables explicativas y el error"
251
252
#### Además, las variables explicativas tienen distribución uniforme de entre [0,1]"
253
x1 = np.random.rand(800)
254
x2 = np.random.rand(800)
255
x3 = np.random.rand(800)
256
x4 = np.random.rand(800)
257
x5 = np.random.rand(800)
258
x6 = np.random.rand(800)
259
x7 = np.random.rand(800)
260
e = np.random.normal(0,1,800)
261
z = np.random.rand(800)
262
#### El término de perturbación o error se diferencia porque tiene distribución normal, con media 0 y desviación estándar 1."
263
264
#### GDP. El modelo sería Y = B0+B1*x1+B2*x2+B3*x3+B4*x4+B5*x5+B6*x6+B7*x7+e
265
Y = 1 + 0.8*x1 + 1.2*x2 + 0.5*x3 + 1.5*x4 + 2.5*x5 + 0.8*x6 + 1.7*x7 + e
266
267
#### Juntamos los vectores en una sola matriz para hallar las X, no olvidemos añadir el vector de unos con "np.ones(800)"
268
X = np.column_stack((np.ones(800),x1,x2,x3,x4,x5,x6,x7))
269
print(X)
270
271
272
#### Ahora, procedemos a crear una función que realice:
273
#### Vector de coeficientes, error estándar de cada coeficiente estimado, P-value de cada variable , limite inferior del intervalo de confianza, limite superior del intervalo de confianza, R cuadrado , Root-MSE (raíz cuadrada del error cuadrático medio).
274
275
def ols(M,Y, standar = True, Pvalue = True, instrumento = None, index = None):
276
if standar and Pvalue and (instrumento is None) and (index is None):
277
beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y ) ## Para hallar las betas debemos transponer la matriz y las multiplicamos con el uso del operador "@". Este sería el vector de coeficientes.
278
y_est = X @ beta
279
n = X.shape[0]
280
k = X.shape[1] - 1
281
nk = n - k ## grados de libertad
282
sigma = sum(list( map( lambda x: x**2 , Y - y_est) )) / nk
283
Var = sigma*np.linalg.inv(X.T @ X)
284
sd = np.sqrt( np.diag(Var) ) ## sacamos raíz cuadrada a los elementos de la diagonal principal
285
t_est = np.absolute(beta/sd)
286
pvalue = (1 - t.cdf(t_est, df=nk) ) * 2
287
lim_inf = beta - 1.96 * sd ## Dato para hallar los límites superiores e inferiores del intervalo del confianza
288
lim_sup = beta + 1.96 * sd
289
df = pd.DataFrame( {"OLS": beta , "standar_error" : sd ,
290
"Pvalue" : pvalue, "Límite_inferior" : lim_inf, "Límite_superior" : lim_sup })
291
292
293
elif (not instrumento is None) and (not index is None) :
294
295
beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
296
297
index = index - 1
298
Z = X
299
Z[:,index] = z ## se reemplaza la variable endógena por el instrumento en la matriz de covariables
300
beta_x = np.linalg.inv(Z.T @ Z) @ ((Z.T) @ X[:,index] )
301
x_est = Z @ beta_x
302
X[:,index] = x_est ## se reemplaza la variable x endógena por su estimado
303
beta_iv = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )
304
df = pd.DataFrame( {"OLS": beta , "OLS_IV" : beta_iv})
305
306
return df
307
308
#### Definida la función, podemos obtener los errores estándar de cada coeficiente, su p value y el intervalo de confianza.
309
ols(X,Y)
310
ols(X,Y,instrumento = z, index = 1)
311
print(ols(X,Y))
312
313
314
315
316
317
318
319
320